一、iptables命令
查看當前iptables的nat表內的規則
-t nat指定看nat表,不用-t默認為filter表
-L 列出表內所有規則,可以指定特定鏈
-n 使輸出中的IP地址和端口以數值的形式顯示
-v 輸出詳細化
--line 顯示出每條規則在相應鏈中的序號
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8078 to:172.28.17.220:8078 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination
可以看到NAT表有很多類型的鏈chain,每個鏈內有很多規則rule,不同的鏈代表的轉發功能不一樣
PREROUTING鏈的作用是在包剛剛到達防火牆時改變它的目的地址,是從外部連接過來時的轉發OUTPUT鏈改變本地產生的包的目的地址,是本機連接時的轉發
POSTROUTING鏈在包就要離開防火牆之前改變其源地址
想實現端口轉發,必須編輯sysctl.conf配置文件開啟內核轉發,需要管理員權限
vim /etc/sysctl.conf
開啟ipv4 forward
net.ipv4.ip_forward = 1
查看當前是否開啟轉發
[root@hlcc-1 ~]# cat /proc/sys/net/ipv4/ip_forward 1
我們想實現端口轉發,主要是用nat表的上面三個鏈實現該功能
-t 指定配置表
-A 鏈中添加規則
-D 刪除鏈中規則
-C 修改鏈中規則
-j target 決定符合條件的包到何處去,
target模式很多
一、轉發本機端口到本機其他端口
REDIRECT模式是防火牆所在的機子內部轉發包或流到另一個端口,也就是所有接收的包只轉發給本地端口它只能用在nat表的PREROUTING、OUTPUT鏈 ,並有一個--to-ports選項
通過PREROUTING鏈,將外網訪問7000端口轉發到本機80端口,此時本機訪問7000並不進行轉發
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A PREROUTING -p tcp --dport 7000 -j REDIRECT --to-ports 80 [root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:7000 redir ports 80 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination
二、分流本機端口到本機其他端口
通過PREROUTING鏈,將172.28.146.0/24網段訪問7000端口的包轉發到本機80端口,其他網段則正常訪問7000端口
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A PREROUTING -p tcp -s 172.28.146.0/24 --dport 7000 -j REDIRECT --to-ports 80 [root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:7000 redir ports 80 2 REDIRECT tcp -- 172.28.146.0/24 0.0.0.0/0 tcp dpt:7000 redir ports 80 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination
三、刪除指定規則
先使用-nL --line-number參數查看需要刪除的規則ID,然后使用iptables -D 刪除
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line-number Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:7000 redir ports 80 2 REDIRECT tcp -- 172.28.146.0/24 0.0.0.0/0 tcp dpt:7000 redir ports 80 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination
需要刪除NAT表的PREROUTING鏈里的num為1 的規則:1 REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:7000 redir ports 80
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -D PREROUTING 1
再次查看
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line-number Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 REDIRECT tcp -- 172.28.146.0/24 0.0.0.0/0 tcp dpt:7000 redir ports 80 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination
已刪除
四、清空nat規則
[root@hlcc ~]# iptables -t nat -F [root@hlcc ~]# iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain DOCKER (0 references) target prot opt source destination [root@hlcc ~]#
五、本機端口轉發到后端其他服務器的服務端口
DNAT:目的地址轉換,將指定端口的入向過來的數據包里的目標IP和端口設置為后向服務器IP和端口,只能用在nat表的PREROUTING和OUTPUT鏈,--to-destination選項
SNAT:源地址轉換,將目標地址為后向服務器IP的出向數據包里的源地址修改為轉發服務器IP地址,后向服務器是不能直接回包到客戶端的,所以需要改為轉發服務器的P地址。
只能用在nat表的POSTROUTING鏈,--to-source選項
1、通過PREROUTING鏈,將訪問本機的7000端口入向數據包的目標地址修改為172.28.17.220的8078端口
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A PREROUTING -p tcp --dport 7000 -j DNAT --to 172.28.17.220:8078 [root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 DNAT tcp -- 0.0.0.0/0 172.28.17.230 tcp dpt:7000 to:172.28.17.220:8078 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination [root@localip hlcc_v11.1104_centos7]#
2、通過POSTROUTING鏈,將目標地址為172.28.17.220:8078端口出向數據包的源地址修改為轉發服務器IP
[root@localip hlcc_v11.1104_centos7]# iptables -t nat -A POSTROUTING -d 172.28.17.220 -p tcp --dport 8078 -j SNAT --to 172.28.17.230 [root@localip hlcc_v11.1104_centos7]# iptables -t nat -nL --line Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 DNAT tcp -- 0.0.0.0/0 172.28.17.230 tcp dpt:7000 to:172.28.17.220:80 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination 1 SNAT tcp -- 0.0.0.0/0 172.28.17.220 tcp dpt:8078 to:172.28.17.230 [root@localip hlcc_v11.1104_centos7]#
如果不添加POSTROUTING鏈的SNAT規則,那么在后端服務器上收到的數據包的源IP地址不是轉發服務器的地址,而是客戶端的地址,這樣服務端回包的時候不能回到轉發服務器上。
iptables的端口轉發,不會在轉發服務器上建立連接,而是客戶端和后向服務器端直連,只不過修改數據包的地址而已。在轉發服務器上看不到連接。
六、保存規則
1、首先需要清空iptables默認規則,因為默認規則是禁止reject,然后保存規則即可
[root@hlcc-1 ~]# iptables -F [root@hlcc-1 ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ] [root@hlcc-1 ~]#
2、查看規則
[root@hlcc-1 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
[root@hlcc-1 ~]# iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:5860 to:172.28.17.222:5860 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT udp -- 0.0.0.0/0 172.28.17.222 udp dpt:5860 to:172.28.17.175
重啟iptables后,再次查看規則是否一致
[root@hlcc-1 ~]# systemctl restart iptables
