作用:用於 IP 包的過濾和實現 NAT.
表和鏈
常用的表有2個:filter 和 nat. 每張表又包含多條鏈,每條鏈就是規則序列.
filter表包含INPUT,FORWARD,OUTPUT鏈.nat表包含PREROUTING,OUTPUT,POSTROUTING鏈.
接收到數據包的處理過程
- 本機收到數據包,由
nat.PREROUTING先進行處理; - 如果數據包的目的地址是本機,則交由
filter.INPUT進一步處理;然後將數據包交給本機上層協議棧. - 如果數據包的目的地址不是本機,則交由
filter.FORWARD進一步處理;然後交由nat.POSTROUTING進行處理.
發送數據包的處理過程
- 數據包先後經過
nat.OUTPUT和filter.OUTPUT進行處理; - 然後交由
nat.POSTROUTING進行處理.
常用選項
-t: 指定要處理哪張表,默認是 filter.-n: 以數字形式顯示地址和端口號.
規則組成
-p protocol: 指定協議,可以取指為 tcp, udp, icmp.[! ]-s address[/mask]: 指定源地址,可以是主機名、網絡名和IP地址. '!' 表示取反.[! ]-d address[/mask]: 指定目的地址,可以是主機名、網絡名和IP地址.[! ]-i [name]: 進入的網絡接口.[! ]-o [name]: 出去的網絡接口.[! ]--sport port[:port]: 指定源端口範圍.[! ]--dport port[:port]: 指定目的端口範圍.
1. 羅列規則
[root@controller ~]# iptables -t nat -L POSTROUTING -n --line-number
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 RETURN all -- 192.168.122.0/24 224.0.0.0/24
2 RETURN all -- 192.168.122.0/24 255.255.255.255
3 MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
4 MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
5 MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
6 POSTROUTING_direct all -- 0.0.0.0/0 0.0.0.0/0
7 POSTROUTING_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
8 POSTROUTING_ZONES all -- 0.0.0.0/0 0.0.0.0/0
-L: 列出指定鏈包含的規則.
--line-number: 顯示每條規則在鏈中的位置(行號).
2. 創建鏈
[root@localhost ~]# iptables -t filter -N chain1
-N: 創建指定名稱的鏈.
3. 追加規則
[root@localhost ~]# iptables -A chain1 -p tcp --dport 22 -j DROP
-A: 追加規則至指定鏈的末尾.
--dport: 匹配指定的目的端口號.
-j DROP: 如果匹配規則,則丟棄數據包.
4. 插入規則
[root@localhost ~]# iptables -I INPUT 1 -s 116.56.140.61 -d 192.168.122.132 -j chain1
-I: 插入指定規則到指定鏈的指定地方,此處是插入鏈首(序號為1).
-j chain1: 如果匹配規則,則跳轉到 chain1 鏈去繼續匹配.
5. 替換規則
[root@localhost ~]# iptables -R INPUT 1 -s 192.168.122.1 -d 192.168.122.132 -j chain1
-R: 替換指定鏈指定規則為新的規則,此處替換第一條規則.
6. 刪除規則
[root@localhost ~]# iptables -D INPUT 1
-D: 刪除指定鏈上指定的規則,此處刪除第一條規則.
7. 清空規則
[root@localhost ~]# iptables -F chain1
-F: 清空指定鏈上的所有規則.
8. 重命名自定義鏈
[root@localhost ~]# iptables -E chain1 CHAIN1
-E: 此處將 chain1 重命名為 CHAIN1.
9. 刪除自定義鏈
[root@localhost ~]# iptables -X CHAIN1
-X: 刪除指定的自定義鏈,需要確保沒有其他鏈引用要刪除的鏈.
10. 設置內建鏈的默認目標規則
[root@localhost ~]# iptables -P INPUT ACCEPT
-P: 設置指定鏈(需要是內建鏈)的默認目標規則,此處表示,如果所有規則都不匹配,則接受該數據包.
11. SNAT
注意:主機需要先開啓轉發功能:
-
臨時
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward -
永久:
# /etc/sysctl.conf net.ipv4.ip_forward = 1[root@localhost ~]# sysctl -p
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -o eth0 -j SNAT --to-source 10.10.188.232
--to-source: 將數據包的源地址替換為指定的地址.
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
-j MASQUERADE: 自動使用合適的地址替換數據包源地址.
12. DNAT
[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.31.168 -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.31.167:8080
--to-destination: 將數據包的目的地址替換為指定的地址.