iptables(二)--扩展详解
1、其實匹配擴展中,還有需要加-m引用模塊的顯示擴展,默認是隱含擴展,不要使用 -m
狀態檢測的包過濾
-m state?
????? --state {NEW,ESTATBLISHED,INVALID,RELATED}? 指定檢測那種狀態
-m multiport 指定多端口號
????? --sport
????? --dport
????? --ports
-m iprange?指定IP段
????? --src-range ip-ip
????? --dst-range ip-ip
-m connlimit 連接限定
????? --comlimit-above # 限定大連接個數
-m limit 現在連接速率,也就是限定匹配數據包的個數
????? --limit? 指定速率
????? --limit-burst # 峰值速率,最大限定
-m string 按字符串限定
????? --algo bm|kmp? 指定算法bm或kmp
????? --string "STRING" 指定字符串本身
?
# iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.80.139 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
允許任何主機狀態為NEW,ESTABLISHED的狀態連接,這里要注意當寫成0.0.0.0/0.0.0.0 表示任意地址的時候是可以省略的,如下即可:
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
允許本機的ESTABLISHED狀態出去,為了防止有反彈時***,讓服務器主動向外發起請求
# iptables -A OUTPUT -s 192.168.80.140 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
之后再修改默認權限為拒絕即可
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
現在在本機ping 127.0.0.1,發現時不同的,所以要允許本機,下面在寫一個:
# iptables -I INPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# iptables -I OUTPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
如果要限制80端口的話,那在就在寫一條,現在寫在一條里,為了節省查詢時間
之前的--sport或--dport 后面可以添加連續的如 --sport 22:80 表示從22到80的所有端口,不符合現在的條件,所以我們用第二個顯示擴展:
# iptables -A INPUT -d 192.168.80.140 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
這樣就把22,80 和在一起的,OUTPUT同理但注意源端口目標端口,之后再刪除原來的即可
(注意:有SSH的話一定要先添加在刪除)
這里需要知道一點,從本機出去的ESTABLISHED都是現請求進來的,所以可以寫成如下:
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
表示所有客戶端NEW請求進來服務器返回ESTABLISHED的狀態全部允許
也可以添加在INPUT中,提高查詢速度
# iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
這里的原理是,當NEW請的時候匹配他自己的那條規則,當建立連接后直接就匹配這條規則,提高效率
例如:第一條是允許ESTABISHED 的,第二條是22,的NEW,ESTABLISHED的規則,這樣當用戶請求22的時候先匹配22的NEW,之后的ESTABLISHED狀態時直接匹配第一條,不用在去匹配第二條的規則了,這樣當我們有許多條目的時候大大提高了效率
# iptables -A INPUT -d 192.168.80.140 -m iprange --src-range 192.168.80.130-192.168.80.150 -p tcp --dport 23 -m state --state NEW -j ACCEPT
指定192.168.80.130-192.168.80.150 可以訪問本機的23端口
# iptables -I INPUT 2 -d 192.168.80.140 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 2 -j ACCEPT
這里connlimit ! --connlimit-above 2 -j ACCEPT 表示只允許SSH本機2次,connlimit --connlimit-above 2 -j DROP 表示超過2次后拒絕,這里因為默認權限是拒絕的所以用!取反,而且前面有寫允許22端口的,這里不匹配后就會先下匹配那條,將匹配22允許的更改即可。
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 80 -m state --state? NEW -m limit --limit 1/second --limit-burst 3 -j ACCEPT
表示對web服務的新連接請求,平均每秒只允許1個,最多一次進3個
# iptables -I OUTPUT 1 -m string --algo kmp --string "peace" -j DROP
表示本機響應當中包含“peace”字符串的機拒絕
2、如何開發FTP
主動模式開放FTP
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 21 -m state --state NEW -j ACCEPT
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 20 -m state --state NEW -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
被動模式開放FTP
1)清空之前的配置,重啟服務即可
# service iptables restart
2)先添加ssh規則
# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 3 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
3)下面開啟FTP
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 21 -m state --state NEW -j ACCEPT
但是訪問還是不行
4)先加載模塊
# modprobe ip_nat_ftp
# lsmod | grep ftp
ip_nat_ftp????????????? 7361? 0
ip_nat???????????????? 20973? 1 ip_nat_ftp
ip_conntrack_ftp?????? 11569? 1 ip_nat_ftp
ip_conntrack?????????? 53409? 5 ip_nat_ftp,ip_nat,ip_conntrack_ftp,xt_connlimit,xt_state
5)開發RELATED狀態
# iptables -R INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -R OUTPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
6)在連接下發現可以了
前面重啟服務的話規則就沒有了,所以當確定后了之后執行以下命令保存:
# service iptables save 或# iptables-save > /etc/sysconfig/iptables
這里有兩個文件要知道下:
/etc/sysconfig/iptables: 保存規則的文件
/etc/sysconfig/iptables-config:向iptables腳本提供配置文件的文件
3、SNAT于DNAT配置
SNAT,首先清空之前的配置,拓撲如下:
先ping下,是不同的
1)先開啟路由功能
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
2)client 添加路由
route add 172.16.0.0 mask 255.255.0.0 192.168.80.140
web添加路由
# route add -net 0.0.0.0 gw 172.16.15.20
訪問發現是192.168.80.1訪問的
3)下面也可以添加個拒絕PING的
# iptables -A FORWARD -p icmp --icmp-type 8 -j REJECT
添加SNAT規則
# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -j SNAT --to-source 172.16.15.20
4)訪問172.16.15.30下web在看日志,發現已經是172.16.15.20
這里至指定的一個IP地址,如果是撥號的話這個地址是不固定的所以可以用如下方式:
# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -j MASQUERADE
不過這種方法比指定更消耗資源
另將web添加的路由刪除,發現也是可以訪問的。
DNAT的實現:
拓撲如下:
1)先開啟路由功能
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
2)這里的web就一定要指定網關了
# route add -net 0.0.0.0 gw 172.16.15.20
3)添加規則,將請求192.168.80.140的web轉換到172.16.15.30上
# iptables -t nat -A PREROUTING -d 192.168.80.140 -p tcp --dport 80 -j DNAT --to-destination 172.16.15.30
4)訪問192.168.80.140后看下日志,發現是192.168.80.1
?
5)這里本地服務器沒有log記錄,要添加的話如下:
# iptables -t nat -I PREROUTING 1 -d 192.168.80.140 -p tcp --dport 80 -j LOG --log-prefix "DNAT for Web:"
6)之后看下本地日志,tail /var/log/messages 發現本地已經有日志信息了
4、利用recent抵御DOS***
# iptables -I INPUT -p tcp --dport 22 -m connlimit -connlimit-above 3 -j DROP
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set -name SSH
記錄訪問tcp 22端口的新連接,記錄名稱為SSH--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
# 指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接。
5、做應用層的iptables,限制迅雷,QQ:
注意這里的版本有要求的:
iptables-1.4.3以上
kernel-2.6.20以上
試驗步驟:
1)給內核打補丁,并重新編譯內核
# tar zxvf? linux-2.6.28.10.tar.gz? -C? /usr/src
# tar zxvf? netfilter-layer7-v2.22.tar.gz? -C? /usr/src
# cd /usr/src
# ln –s? linux-2.6.28.10? linux
# cd /usr/src/linux/
# patch -p1? <? ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
# cp /boot/config-2.6.18-164.el5? /usr/src/linux/.config
# make? menuconfig
編譯選著如下內容:
Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration
<M>? Netfilter connection tracking support
<M>? “layer7” match support
<M>? “string” match support
<M>? “time”? match support
<M>? “iprange”? match support
<M>? “connlimit”? match support
<M>? “state”? match support
<M>? “conntrack”? connection? match support
<M>? “mac”? address? match support
<M>?? "multiport" Multiple port match support
Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
<M> IPv4 connection tracking support (required for NAT)
<M>?? Full NAT
?<M>???? MASQUERADE target support??????????????????????????????????????????????????????????????????????????????????
?<M>???? NETMAP target support??????????????????????????????????????????????????????????????????????????????
?<M>???? REDIRECT target support
編譯安裝
# make
# make modules_install
# make install
2)給iptables源碼打補丁,并重新編譯iptables
# cp /etc/init.d/iptables ~/iptables
# cp /etc/sysconfig/iptables-config ~/
# rpm? -e? iptables-ipv6? iptables? iptstate? --nodeps
# tar jxvf iptables-1.4.6.tar.bz2 –C? /usr/src
# cd /usr/src/iptables-1.4.6
# cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*?? ./extensions/
# ./configure? --prefix=/usr? --with-ksource=/usr/src/linux
# make
# make install
3)安裝l7proto
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
# mv ~/iptables? /etc/rc.d/init.d/
這里的iptables文件要做修改的將/sbin/$IPTABLES改成/usr/sbin/$IPTABLISH
# service iptables start
# iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP? 限制xunlei
限制的相關信息都在這里 /etc/l7-protocols/protocols/ 可以產考,像qq,pplive等都有的
轉載于:https://blog.51cto.com/peaceweb/924184
總結
以上是生活随笔為你收集整理的iptables(二)--扩展详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu shutdown 关机、
- 下一篇: C语言——指针与结构体 内存的动态分配