其實匹配擴展中,還有須要加-m引用模塊的顯示擴展,默認是隱含擴展,不要使用-m。算法
狀態檢測的包過濾:vim
-m state --state {NEW,ESTATBLISHED,INVALID,RELATED} 指定檢測那種狀態bash
-m multiport 指定多端口號
--sport
--dport
--ports網絡
-m iprange 指定IP段
--src-range ip-ip
--dst-range ip-iptcp
-m connlimit 鏈接限定
--comlimit-above # 限定大鏈接個數spa
-m limit 如今鏈接速率,也就是限定匹配數據包的個數
--limit 指定速率
--limit-burst # 峯值速率,最大限定命令行
-m string 按字符串限定
--algo bm|kmp 指定算法bm或kmp
--string "STRING" 指定字符串自己code
使用腳本設定規則:server
建立腳本: [root@3 ~]# vi /usr/local/sbin/iptables.sh #! /bin/bash ipt="/usr/sbin/iptables" # 定義一個變量——iptables命令(定義變量時儘可能使用絕對路徑,避免環境變量的影響) $ipt -F # 清空原有規則 $ipt -P INPUT DROP $ipt -P OUTPUT ACCEPT $ipt -P FORWARD ACCEPT # 上面三行是定義其默認策略 $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # -m是指定檢測狀態,--state指定數據包狀態(配合-m使用),該命令行的目的是使數據處理(通訊 )更順暢 $ipt -A INPUT -s 192.168.8.0/24 -p tcp --dport 22 -j ACCEPT $ipt -A INPUT -p tcp --dport 80 -j ACCEPT $ipt -A INPUT -p tcp --dport 21 -j ACCEPT # 上面三行命令是指定放行的包的類型 icmp示例 iptables -I INPUT -p icmp --icmp-type 8 -j DROP 執行該腳本中的規則: [root@3 ~]# sh /usr/local/sbin/iptables.sh
注意: 腳本中指定的IP若是和主機IP不一樣時不要在遠程端口直接運行該腳本!ip
[root@3 ~]#iptables -I INPUT -p icmp --icmp-type 8 -j DROP
說明: 該規則的含義是:只容許本機訪問外網,不容許外網訪問本機!
環境:
A機器兩塊網卡ens33(192.168.8.125)、ens37(192.168.100.1),ens33能夠上外網,ens37僅僅是內部網絡,B機器只有ens37(192.168.100.100),和A機器ens37能夠通訊互聯。
準備工做:
設置ens37的IP:
[root@3 ~]# ifconfig ens37 192.168.100.1/24
注: 該方法只是臨時設定IP,重啓後會丟失。
需求:
需求1: 可讓B機器鏈接外網
[root@3 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward 該命令是更改內核設置,打開路由轉發功能,默認值是0.
[root@3 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE [root@3 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * ens33 192.168.100.0/24 0.0.0.0/0
說明: -o 選項後面跟設備名稱,表示出口網卡,MASQUERADE是假裝、冒充的意思。
[root@3 ~]# route add default gw 192.168.100.1
[root@3 ~]# vim /etc/resolv.conf # Generated by NetworkManager nameserver 119.29.29.29
而後使用ping命令檢測,網絡通暢!
注: 此時B機器能夠連通外網,可是外網機器沒法訪問B機器,A機器的做用就相似於一個路由器!
需求2: C機器只能和A通訊,讓C機器能夠直接連通B機器的22端口(端口映射)
[root@3 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward 該命令是更改內核設置,打開路由轉發功能,默認值是0.
規則1: [root@3 ~]# iptables -t nat -A PREROUTING -d 192.168.8.125 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22 規則2: [root@3 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.8.125
[root@3 ~]# route add default gw 192.168.100.1
END
原理: 每5s內tcp三次握手大於20次的屬於不正常訪問。
[root@3 ~]# iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.8.125 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource [root@3 ~]# iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP
說明: 其中192.168.0.0/255.255.255.0 爲不受限制的網段,192.168.8.125爲本機IP。
該iptables策略,可有效預防syn攻擊,也能夠有效防止機器人發垃圾帖。
iptables針對一個網段設置規則:
[root@3 ~]# iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP
iptables中DNAT和SNAT工做原理:
在任何一個IP數據包中,都會有Source IP Address與Destination IP Address這兩個字段,數據包所通過的路由器也是根據這兩個字段是斷定數據包是由什麼地方發過來的,它要將數據包發到什麼地方去。而iptables的DNAT與SNAT就是根據這個原理,對Source IP Address與Destination IP Address進行修改。
數據包在iptables中要通過的鏈(chain):
上圖是系統對數據包進行斷定轉發的過程,在這裏,系統會根據IP數據包中的destination ip address中的IP地址對數據包進行分發。若是destination ip adress是本機地址,數據將會被轉交給INPUT鏈。若是不是本機地址,則交給FORWARD鏈檢測。
這也就是說,咱們要作的DNAT要在進入斷定轉發轉發過程以前進行,也就是在PREROUTING鏈中作,好比咱們要把訪問202.103.96.112的訪問轉發到192.168.0.112上:「iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112」,這調規則的做用其實就是將已經達到這臺Linux網關(防火牆)上的數據包上的destination ip address從202.103.96.112修改成192.168.0.112而後交給系統路由進行轉發。
同理,SNAT要在數據包流出這臺機器以前的最後一個鏈也就是POSTROUTING鏈來進行操做:「iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66」,這個語句就是告訴系統把即將要流出本機的數據的source ip address修改爲爲58.20.51.66。這樣,數據包在達到目的機器之後,目的機器會將包返回到58.20.51.66也就是本機。若是不作這個操做,那麼你的數據包在傳遞的過程當中,reply的包確定會丟失。
假如當前系統用的是ADSL/3G/4G動態撥號方式,那麼每次撥號,出口IP都會改變,SNAT就會有侷限性。 「iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE」 重點在MASQUERADE這個設定值就是將動態IP假裝成爲(-o)的那塊裝置上的IP,無論如今eth0的出口得到了怎樣的動態IP,MASQUERADE會自動讀取eth0設定的IP地址而後作SNAT出去,這樣就實現了很好的動態SNAT地址轉換。