iptables網絡防火牆、SNAT、DNAT原理及端口重定向實戰


網絡防火牆

iptables/netfilter網絡防火牆:

(1) 充當網關
(2) 使用filter表的FORWARD鏈

注意的問題:

(1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性
(2) 如果要啟用conntrack機制,建議將雙方向的狀態為ESTABLISHED的報文直接放行

實現內網ping通外網,外網無法ping通內網

第一種實現方法:

環境准備:

A主機:192.168.37.6(NAT模式,做內網)

B主機:192.168.37.7(NAT模式),172.16.0.7(橋接模式)B主機作為防火牆

C主機:172.16.0.17(橋接模式,做外網)

 (1)在A主機修改IP地址

[root@centos7network-scripts]#cat ifcfg-ens33
DEVICE=ens33
BOOTPROTO=static
IPADDR=192.168.37.6
PREFIX=24
GATEWAY=192.168.37.7 #指定防火牆左側的IP地址
ONBOOT=yes

(2)修改B主機的NAT模式IP地址配置文件

[root@centos7network-scripts]#cat ifcfg-ens33
DEVICE=ens33
BOOTPROTO=none
IPADDR=192.168.37.7
PREFIX=24
ONBOOT=yes
GATEWAY=192.168.34.2
DNS1=114.114.114.114

    修改B主機橋接模式IP地址配置文件

[root@centos7network-scripts]#cat ifcfg-ens37
DEVICE=ens37
BOOTPROTO=none
IPADDR=172.16.0.7
PREFIX=16
ONBOOT=yes
DNS1=114.114.114.114

(3)在C主機修改IP地址

[root@centos777network-scripts]#cat ifcfg-ens37
DEVICE=ens37
BOOTPROTO=dhcp
IPADDR=172.16.0.17
PREFIX=16
GATEWAY=172.16.0.7  # 指定防火牆右側的IP地址
ONBOOT=yes

 (4)在B主機修改路由規則,將A主機和C主機跨網段ping通

[root@centos7~]#vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@centos7~]#sysctl -p  使配置文件生效
net.ipv4.ip_forward = 1

 

 (5)在B主機設置(防火牆)設置FORWARD請求與響應防火牆策略,實現A主機ping通C主機策略,但是C主機無法ping通A主機

[root@centos7~]#iptables -A FORWARD -j REJECT  在B主機(防火牆)設置一個FORWARD拒絕策略
[root@centos7~]#iptales -vnL --line-numbers
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 85 packets, 6520 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 63 packets, 5876 bytes)
num   pkts bytes target     prot opt in     out     source               destination 


[root@centos7 ~]# iptables -I FORWARD 1 -s 192.168.37.0/24 -p icmp --icmp-type 8 -j ACCEPT    # 設置A主機請求允許的策略
[root@centos7 ~]# iptables -I FORWARD 1 -d 192.168.37.0/24 -p icmp --icmp-type 0 -j ACCEPT # 設置A主機響應允許的策略

第二種實現方法:

也可以刪除內網的響應允許IP,添加一個state模塊,進行狀態跟蹤,ping通出去,回來就成為老的狀態,也可以成功,此方法也可以

[root@centos7~]#iptables -D FORWARD 2
[root@centos7~]#iptables -I FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 49 packets, 3608 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        5   420 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        3   252 ACCEPT     icmp --  *      *       192.168.37.6         0.0.0.0/0            icmptype 8
3        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 34 packets, 3040 bytes)
num   pkts bytes target     prot opt in     out     source               destination      

實現內網訪問外網httpd服務

(1)在C主機安裝httpd服務 

[root@centos777~]#yum install httpd
[root@centos777~]#systemctl start  httpd
[root@centos777~]#echo internet server > /var/www/html/index.html

(2)在B主機設置防火牆策略,允許內網訪問外網的httpd服務,但外網不能訪問內網的服務

[root@centos7~]#iptables -I FORWARD 2 -s 192.168.37.0/24 -p tcp --dport 80  -j ACCEPT

(3)此時在A主機就可以訪問C主機(外網)httpd服務

[root@centos7network-scripts]#curl 172.16.0.17
internet server

(4)C主機也可以對外網的httpd進行加密httpd服務

[root@centos777~]#yum install mod_ssl  -y
[root@centos777~]#systemctl restart httpd

(5)在B主機設置一個加密443和httpd端口80的防火牆規則

[root@centos7~]#iptables -I FORWARD 2 -s 192.168.37.0/24 -p tcp -m multiport --dport 80,443  -j ACCEPT

(6)此時在A主機就可以進行加密訪問外網httpd服務

[root@centos7network-scripts]#curl -k https://172.16.0.17   加上-k不需要進行證書檢測
internet server

實現外網訪問內網HTTP服務

也可以在B主機實現外網訪問內網的httpd服務

[root@centos7~]#iptables -I FORWARD 2 -d 192.168.37.6 -p tcp -m multiport --dport 80,443  -j ACCEPT
[root@centos7~]#iptables -vnL
Chain INPUT (policy ACCEPT 20 packets, 1528 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   34  4644 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.37.6         multiport dports 80,443
    4   240 ACCEPT     tcp  --  *      *       192.168.37.0/24      0.0.0.0/0            multiport dports 80,443
    4   336 ACCEPT     icmp --  *      *       192.168.37.6         0.0.0.0/0            icmptype 8
   84  4889 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 14 packets, 1304 bytes)
 pkts bytes target     prot opt in     out     source               destination  

(8)在C主機訪問A主機的HTTPD服務

[root@centos777~]#curl 192.168.37.6
lan server

鏈管理:

-N:new, 自定義一條新的規則鏈
-X:delete,刪除自定義的空的規則鏈
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
-E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除

實戰演示:創建自定義鏈,進行模塊化(實現內網訪問外網)

(1)以上實驗的基礎上,將B主機創建一個新鏈,方便管理模塊化

[root@centos7~]#iptables -N TOINTERNET  創建一個新模塊鏈
[root@centos7~]#iptables -A TOINTERNET -s 192.168.37.0/24 -p tcp -m multiport --dports 80,443,22 -j ACCEPT  將內網訪問外網的規則添加到新鏈上
[root@centos7~]#iptables -A TOINTERNET -s 192.168.37.0/24 -p icmp --icmp-type 8  -j ACCEPT
[root@centos7~]#iptables -I FORWARD 2 -j TOINTERNET  將新自定義的鏈加入到FORWARD鏈中


[root@centos7 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 14 packets, 960 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 TOINTERNET  all  --  *      *       0.0.0.0/0            0.0.0.0/0    # 將鏈名加入到規則中        
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 10 packets, 1888 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain TOINTERNET (1 references)  # 自定義的鏈
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       192.168.37.0/24       0.0.0.0/0            multiport dports 80,443,22
    0     0 ACCEPT     icmp --  *      *       192.168.37.0/24       0.0.0.0/0            icmptype 8

(2)此時就可以從內網訪問外網,創建的自定義鏈規則,方便管理,條理清晰

[root@centos7html]#curl -k https://172.16.0.17
internet server
[root@centos7html]#curl 172.16.0.17
internet server
[root@centos7html]#ssh 172.16.0.17
The authenticity of host '172.16.0.17 (172.16.0.17)' can't be established.
ECDSA key fingerprint is SHA256:nl4GdONb/BsSo/TpR+UHsM/gFo4+tLpD40NhCklkf7M.
ECDSA key fingerprint is MD5:55:a8:61:99:c3:52:fd:25:80:95:21:88:2b:98:1b:87.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.0.17' (ECDSA) to the list of known hosts.
Last login: Fri Dec  6 12:15:40 2019 from lpj-pc
[root@centos777~]#

(3)刪除自定義鏈

[root@centos7~]#iptables -vnL
Chain INPUT (policy ACCEPT 77 packets, 5948 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  143 24925 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    3   180 TOINTERNET  all  --  *      *       0.0.0.0/0            0.0.0.0/0              刪除第二條鏈表
  316 19254 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 50 packets, 4452 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain TOINTERNET (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    3   180 ACCEPT     tcp  --  *      *       192.168.37.0/24      0.0.0.0/0            multiport dports 80,443,22
    0     0 ACCEPT     icmp --  *      *       192.168.37.0/24      0.0.0.0/0            icmptype 8
[root@centos7~]#iptables -D FORWARD 2   刪除第二條新建的鏈表
[root@centos7~]#iptables -F TOINTERNET  先清空鏈表內容
[root@centos7~]#iptables -X TOINTERNET  刪除空鏈表

NAT

NAT概念

NAT(Network Address Translation)是一種地址轉換技術,可以將IPv4報文頭中的地址轉換為另一個地址。通常情況下,利用NAT技術將IPv4報文頭中的私網地址轉換為公網地址,可以實現位於私網的多個用戶使用少量的公網地址同時訪問Internet。因此,NAT技術常用來解決隨着Internet規模的日益擴大而帶來的IPv4公網地址短缺的問題。

NAT原理

NAT的基本工作原理是,當私有網主機和公共網主機通信的IP包經過NAT網關時,將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進行轉換。

如下圖所示,NAT網關有2個網絡端口,其中公共網絡端口的IP地址是統一分配的公共 IP,為202.20.65.5;私有網絡端口的IP地址是保留地址為192.168.1.1。私有網中的主機192.168.1.2向公共網中的主機202.20.65.4發送了1個IP包(Dst=202.20.65.4,Src=192.168.1.2)。

當IP包經過NAT網關時,NAT Gateway會將IP包的源IP轉換為NAT Gateway的公共IP並轉發到公共網,此時IP包(Dst=202.20.65.4,Src=202.20.65.5)中已經不含任何私有網IP的信息。由於IP包的源IP已經被轉換成NAT Gateway的公共IP,Web Server發出的響應IP包(Dst= 202.20.65.5,Src=202.20.65.4)將被發送到NAT Gateway。

這時,NAT Gateway會將IP包的目的IP轉換成私有網中主機的IP,然后將IP包(Des=192.168.1.2,Src=202.20.65.4)轉發到私有網。對於通信雙方而言,這種地址的轉換過程是完全透明的。轉換示意圖如下。

 如果內網主機發出的請求包未經過NAT,那么當Web Server收到請求包,回復的響應包中的目的地址就是私有網絡IP地址,在Internet上無法正確送達,導致連接失敗。

NAT: network address translation

PREROUTING,INPUT,OUTPUT,POSTROUTING
請求報文:修改源/目標IP,由定義如何修改
響應報文:修改源/目標IP,根據跟蹤機制自動實現

SNAT:source NAT POSTROUTING, INPUT

讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址偽裝
請求報文:修改源IP

DNAT:destination NAT PREROUTING , OUTPUT

把本地網絡中的主機上的某服務開放給外部網絡訪問(發布服務和端口映射),但隱藏真實IP
請求報文:修改目標IP

PNAT: port nat,端口和IP都進行修改

注意:局域網內的IP地址要規范,盡量配置公有地址,如果不配置規范地址,和訪問的外網地址一致時,就會沖突,無法連接到外網;

SNAT:請求報文替換源地址。

DNAT:請求報文替換目標地址。

nat表的target:

SNAT:固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random

MASQUERADE:動態IP,如撥號網絡

--to-ports port[-port]
--random

實戰演練:SNAT

實現原理:在防火牆上設置SNAT表和POSTROUTING鏈上,將源地址(也就是內網的IP地址)替換為防火牆訪問的公網地址,此方法設置的是固定的IP地址,最終通過內網的IP地址訪問外網的地址。

A主機:192.168.37.6(NAT模式,作為內網)

B主機:192.168.37.7,172.16.0.7(NAT和橋接模式,作為防火牆)

C主機:172.16.0.17 (橋接模式,作為外網)

(1)在C主機將網關刪掉,暫時不配置172.16.0.7網關,此時A主機去訪問C主機,無法返回信息,就無法上網,其他配置與前面的IP地址配置不變。

[root@centos777network-scripts]#cat ifcfg-ens37
DEVICE=ens37
BOOTPROTO=dhcp
PREFIX=24
IPADDR=172.16.0.17
ONBOOT=yes
DNS1=114.114.114.114

(2)在B主機進行設置SNAT防火牆策略,因為我們可能是本機的地址出去到公網或者是本地局域網的地址出去到公網,我們都可以在POSTROUTING鏈上將所有的IP地址匯總轉發到公網上。

[root@centos7network-scripts]#iptables -t nat -A POSTROUTING -s 192.168.37.0/24 -j SNAT --to-source 172.16.0.7   # 將192.168.37.0出去的IP網段都替換成172.16.0.7的源地址
[root@centos7network-scripts]#iptables -vnL -t nat
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 SNAT       all  --  *      *       192.168.37.0/24      0.0.0.0/0            to:172.16.0.7

(3)此時在A主機就可以訪問C主機

[root@centos7~]#ping 172.16.0.17
PING 172.16.0.17 (172.16.0.17) 56(84) bytes of data.
64 bytes from 172.16.0.17: icmp_seq=1 ttl=63 time=2.23 ms
64 bytes from 172.16.0.17: icmp_seq=2 ttl=63 time=0.688 ms
64 bytes from 172.16.0.17: icmp_seq=3 ttl=63 time=0.919 ms

(4)此時在C主機查看,以為是172.16.0.7地址在訪問,實際是內網的192.168.37.6在訪問C主機信息。

[root@centos777~]#tcpdump -i ens37 -nn host 172.16.0.7
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
17:17:17.505943 IP 172.16.0.7 > 172.16.0.17: ICMP echo request, id 12095, seq 13, length 64
17:17:17.506055 IP 172.16.0.17 > 172.16.0.7: ICMP echo reply, id 12095, seq 13, length 64
17:17:18.502328 IP 172.16.0.7 > 172.16.0.17: ICMP echo request, id 12095, seq 14, length 64
17:17:18.502438 IP 172.16.0.17 > 172.16.0.7: ICMP echo reply, id 12095, seq 14, length 64
17:17:19.519997 IP 172.16.0.7 > 172.16.0.17: ICMP echo request, id 12095, seq 15, length 64

 MASQUERADE:動態IP,如撥號網絡,也可以實現替換源地址功能

  直接在B主機外網重新設置一個防火牆策略,設置不固定的IP地址,就可以在A主機訪問C主機

[root@centos7network-scripts]#iptables -F -t nat
[root@centos7network-scripts]#iptables -t nat -A POSTROUTING -s 192.168.37.0/24 -j MASQUERADE

DNAT

--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

實戰演練:外部用戶訪問防火牆公網地址轉發到內網地址

實現原理:使用DNAT表,以及PREROUTING鏈,當外部用戶訪問防火牆公網的IP地址,防火牆的公網IP地址轉發到后端內網的IP地址和端口上,表面上用戶訪問的是防火牆的公網IP地址和端口,實際訪問的是后端內網的IP地址和端口。

如果用戶訪問內網的http服務,經過postrouting,此時已經經過了input output,以及postrouting三個鏈,在經過input鏈時,就會訪問防火牆的http服務,此時防火牆內部無http服務,就無法再繼續往下傳遞到下一個鏈,此postrouting無法實現IP地址轉發,因此只能在prerouting鏈進行轉發IP地址。

(1)在B主機設置防火牆策略,將防火牆外網的IP地址映射為企業內網的IP地址及端口即目標地址和80端口映射成企業內部的(192.168.37.6)IP地址和8080端口)

[root@centos7network-scripts]#iptables -t nat -A PREROUTING -d 172.16.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.37.6:8080(端口號也可以默認為80端口)

(2)修改A主機的httpd端口,並重啟httpd服務

[root@centos7~]#vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@centos7~]#systemctl restart httpd

(3)C主機進行訪問A主機

[root@centos777~]#curl 172.16.0.7
lan server

(4)在A主機查看log日志,此時由於改的是目標地址,未改本地源地址(172.16.0.17),因此日志中查看到的就是外網地址訪問信息

端口重定向(轉發)

REDIRECT:
NAT表

可用於:PREROUTING OUTPUT 自定義鏈
通過改變目標IP和端口,將接受的包轉發至不同端口
--to-ports port[-port]

實戰演練:將企業服務器端口轉發

實現原理:將公司內網的端口重定向到指定的端口,比如8080端口,重定向到80端口,然后在防火牆上定義轉發規則,將防火牆公網的IP地址和端口映射到內網的IP地址和重定向的端口號80。

(1)在A主機設置防火牆策略,將本地目標的80端口映射為8080端口,即訪問80端口時,直接轉發到8080端口。

[root@centos7~]#iptables -t nat -A  PREROUTING -d 192.168.37.6 -p tcp --dport 80 -j REDIRECT  --to-ports 8080

(2)在B主機將公網的IP(172.16.0.7)地址和端口(80),映射為192.168.37.6和80端口

[root@centos7network-scripts]#iptables -t nat -A PREROUTING -d 172.16.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.37.6:80

(3)最后C主機還是可以訪問A主機的httpd服務,雖然訪問的是映射的172.16.0.7的IP地址,實則訪問的是內網地址

[root@centos777~]#curl 172.16.0.7
lan server

(4)此時A主機監聽的httpd服務端口號就是本機的8080端口,用戶訪問的80端口全部轉發至8080端口上。

 

 

 

 

 

  

 

 

 

  

 

 

 

 

 

  

 

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM