iptables包含有4個表,5個鏈,鏈在表中。
4個表:filter,nat,mangle,raw。
默認表是filter(在沒有指定表的清空),表的優先級:raw
>mangle>nat>filter.
filter:一般的過濾功能。
nat:用於nat功能(端口映射,地址映射,)
mangle:對特定數據包的修改
raw:有限級最高,設置raw時一般是爲了不再讓iptables做數據包的鏈接跟蹤處理,提高性能
5個鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
INPUT: 位於 filter 表,匹配目的 IP 是本機的數據包
FORWARD: 位於 filter 表,匹配穿過本機的數據包,
PREROUTING: 位於 nat 表,用於修改目的地址(DNAT)
POSTROUTING:位於 nat 表,用於修改源地址 (SNAT)
PREROUTING:數據包進入路由表之前
INPUT:通過路由表後目的地爲本機
FORWARDING:通過路由表後,目的地不爲本機
OUTPUT:由本機產生,向外轉發
iptables語法使用:
iptables [-t 表名] <操作命令> [要操作的鏈] [規則號碼] [匹配條件] [-j 匹配到以後的動作]
操作命令:(-A -I -D -R -P -F)
-A <鏈名>:增加一條規則(在所有規則的後面)
例如:iptables -t filter -A INPUT -j DORP
#在filter表INPUT鏈中增加一條規則,匹配所有訪問本機ip的數據包,匹配到了就丟棄。
-I <鏈名> [規則號碼]:插入一條規則
例如:iptables -I INPUT 3 -j DORP
在filter表INPUT鏈插入一條規則,插入爲第3條,前面必須要有2條規則.如果沒有規則號碼,默認爲1,
-D <鏈名> [規則號碼|鏈的內容]:刪除一條規則
例如:iptables -D INPUT 2
#刪除filter表INPUT鏈的第2條規則
iptables -D INPUT -s 192.168.0.1 -j DROP
刪除filter表INPUT鏈內容爲 -s 192.168.0.1 -j DROP 的規則
若規則列表中有多條相同的規則時,按內容匹配只刪除序號最小的一條
-R <鏈名><規則號碼><內容>:替換一條規則
例如:iptables -R INPUT 3 -j ACCEPT
將規則號3的內容替換爲‘-j ACCEPT’
-P <鏈名> <動作> :設置某個鏈的默認規則
例如:iptables -P INPUT DORP
設置 INPUT表的默認規則爲DROP.如果數據包沒有匹配大規則裏的任何規則,就匹配默認規則
-F <鏈名>:情況規則
例如:iptables -F INPUT
清空INPUT鏈的所有規則,-F僅是清空鏈中規則,-P設置的默認規則不被清空。
查看命令 [-(vnx)L]
-L<鏈名>:列出規則(一般用iptables -nvL)
v:顯示詳細信息
x:在v的基礎上,禁止自動單位換算(K,M)
n:只顯示ip地址和端口,不顯示域名和服務
例如:iptables -nvL #詳細列出filter表所有鏈的規則
iptables -t nat -nvL OUTPUT #列出nat表OUTPUT鏈的規則
匹配條件
-i:流入 -o:流出
-s:來源地址 -d:目的地址
-sport:來源端口 -dport:目的端口
-p:協議類型
-i和-o(匹配數據從網口的進和出)
-i eth0 #匹配從eth0網口進來的數據包
-o eth1 #匹配從eth1網口出去的數據包
-s(匹配來源地址)可以是ip,網段,域名也可以爲空(所有地址)
-s 192.168.10.130 #匹配來自192.168.10.130的數據包
-s 192.168.10.130/24 #匹配來自192.168.10.130/24網段的數據包
-d(匹配目的地址)可以是ip,網段,域名也可以爲空(所有地址)
-d www.cong.com 匹配去往域名www.cong.com的數據包
-p(匹配協議類型)可以爲tcp udp icmp等,也可爲空
-p tcp
-p udp
--sport(匹配來源端口)可以是個別端口,也可以是端口範圍
--sport 80 匹配源端口是80的數據包
--sport 80-8080 匹配源端口80-8080的數據包(含80,8080)
--sport :80 匹配源端口是80以下的數據包(含80)
--sport 80: 匹配源端口是80以上的數據包(含80)
--dport(匹配目的端口)可以是個別端口,可以是端口範圍
--dport 80 匹配目的端口是80的數據包
--dport 80-8080 匹配目的端口80-8080的數據包(含80,8080)
--dport :80 匹配目的端口是80以下的數據包(含80)
--dport 80: 匹配目的端口是80以上的數據包(含80)
--sport 和--dport必須配合-p參數使用,必須指明協議類型
匹配舉例
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
在INPUT增加一條規則匹配 協議類型爲tcp 目的端口爲80的規則操作爲放行通過
iptables -I OUTPUT -s 192.168.10.12 -d 192.168.10.131 -j ACCEPT
在OUTPUT插入一條 匹配源地址192.168.10.12目的地址192.168.10.131的規則,放行通過
-s 192.168.10.12 -d www.cong.com -p tcp --dport 80
匹配來自192.168.10.12到www.cong.com 的80端口,tcp協議的數據包
動作/處理方式
ACCEPT:通過,允許數據包通過,不攔截
DROP:丟棄,阻止數據包通過本鏈而丟棄它
SNAT:源地址轉換 可以是單個ip也可以是ip地址池
DNAT:目的地址轉換 可以是單個ip也可以是ip地址池
MASQUERADE:動態源地址轉換
REDIRECT:用於把數據包轉發到另一個端口
REJECT:和DROP一樣,但是DROP不返回信息,REJECT可以返回指定錯誤信息
-j ACCEPT
匹配到的數據包允許通過
-j DROP
匹配到的數據包不允許通過,丟棄
-j SNAT --to ip[-ip:端口-端口](在nat表的POSTROUTING鏈)
例:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.10.12 -j SNAT --to 1.1.1.1-1.1.1.10
-j DNAT --to ip[-ip:端口-端口](在nat表的PREROUTING鏈)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.10.12:80
iptables -t nat -A PREROUTING -d 192.168.10.12 -j DNAT --to 127.0.0.1
-j MASQUERDE
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
將源地址是 192.168.0.0/24 的數據包進行地址僞裝
-j REDIRECT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
訪問數據包訪問的80端口轉換爲8080端口
-j REJECT
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with icmp-net-unreachable
附加模塊
按包狀態匹配(state)
按來源MAC匹配(mac)
按包速率匹配(limit)
多端口匹配(multiport)
state -m state --state狀態
狀態:
NEW:建立新的連接
RELATED:相關的
ESTABLISHED:已建立連接
INVALID:無效的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
mac -m mac --mac-source MAC
iptables -A FORWARD -m --mac-source xx:xx:xx:xx:xx:xx -j DROP
mac地址不能通過路由,所以不要去匹配路由後面的MAC地址
limit -m limit --limit 速率
iptables -A FORWARD -d 192.168.10.130 -m limit --limit 50/s -j ACCEPT
multiport (--sports|--dports|--ports)
iptables -A INPUT -p tcp -m multiports --ports 22,25,80 -j ACCEPT
必須與-p參數一起使用
參考:http://www.jb51.net/os/RedHat/1335.html
http://www.linuxidc.com/Linux/2012-08/67505.htm