準備
首先使用vmware建立兩臺虛擬機器,這裡全部選用了centos7系統,
同時虛擬機器的網路連結使用橋接,橋接的方式使每一個虛擬機器在網路內和獨立的機器表現一致
SNAT伺服器的網路引數設定
建立虛擬網路卡,並設定私有IP地址
檢視SNAT伺服器的ip地址
ip address show
複製程式碼
顯示
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:21:73:be brd ff:ff:ff:ff:ff:ff
inet 192.168.199.134/24 brd 192.168.199.255 scope global noprefixroute dynamic ens33
valid_lft 35442sec preferred_lft 35442sec
inet6 fe80::59eb:3929:5162:3f61/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::957e:fa38:5e70:d608/64 scope link noprefixroute
valid_lft forever preferred_lft forever
複製程式碼
說明已經通過DHCP獲取到了區域網IP,這個網段為192.168.199.0/24,所繫結的網路卡為ens33
我們就把這個網段當作公網ip(只能是當作了。。。)
我們建立一個虛擬網路卡ens33:0並繫結192.168.100.201/24這個網段當作私有ip
ip add address
複製程式碼
此時檢視ip地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:21:73:be brd ff:ff:ff:ff:ff:ff
inet 192.168.199.134/24 brd 192.168.199.255 scope global noprefixroute dynamic ens33
valid_lft 35442sec preferred_lft 35442sec
inet 192.168.100.201/24 brd 192.168.100.255 scope global ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::59eb:3929:5162:3f61/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::957e:fa38:5e70:d608/64 scope link noprefixroute
valid_lft forever preferred_lft forever
複製程式碼
已經多了inet 192.168.100.201/24 brd 192.168.100.255 scope global ens33:0
這一條記錄了
此時SNAT的網路設定如圖
設定iptables規則
第一步設定INPUT鏈為接受
iptables -A INPUT -i ens33:0 -j ACCEPT
複製程式碼
然後開啟轉發功能
echo "1" > /proc/sys/net/ipv4/ip_forward
複製程式碼
加入NAT table資料包偽裝
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
複製程式碼
此時的iptables 策略為
> iptables-save
# Generated by iptables-save v1.4.21 on Wed Mar 20 01:12:40 2019
*nat
:PREROUTING ACCEPT [200:74558]
:INPUT ACCEPT [126:69331]
:OUTPUT ACCEPT [36:2704]
:POSTROUTING ACCEPT [36:2704]
-A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
COMMIT
# Completed on Wed Mar 20 01:12:40 2019
# Generated by iptables-save v1.4.21 on Wed Mar 20 01:12:40 2019
*filter
:INPUT ACCEPT [343:167886]
:FORWARD ACCEPT [1896:4166748]
:OUTPUT ACCEPT [43:4105]
COMMIT
# Completed on Wed Mar 20 01:12:40 2019
複製程式碼
經過上面的設定伺服器已經具有了SNAT的功能
PC-ONE網路引數設定
設定IP地址
首先檢視ip地址
ip address add 192.168.100.201/24 broadcast + dev ens33:0
複製程式碼
顯示
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e7:a6:ec brd ff:ff:ff:ff:ff:ff
inet 192.168.199.176/24 brd 192.168.199.255 scope global noprefixroute dynamic ens33
valid_lft 43106sec preferred_lft 43106sec
inet6 fe80::59eb:3929:5162:3f61/64 scope link noprefixroute
valid_lft forever preferred_lft forever
複製程式碼
說明已經通過DHCP獲取到了區域網IP,這個網段為192.168.199.0/24,所繫結的網路卡為ens33
我們不用這個,刪除所分配的ip
ip address del 192.168.199.176/24 dev ens33
複製程式碼
現在我們重新設定一個不同網段的ip,同時繫結到ens33的網路卡上,下面命令重的broadcast + 表示全播地址自動計算
ip address add 192.168.100.200/24 broadcast + dev ens33
複製程式碼
設定PC-ONE路由
檢視當前路由
> ip route show
192.168.100.0/24 dev ens33 proto kernel scope link src 192.168.100.200
複製程式碼
此時ping 我們模擬的公網伺服器192.168.199.116肯定是不會通的 因為既不在同一個網段,又沒有設定閘道器
我們新增一個預設的閘道器,閘道器的地址就是我們SNAT伺服器的私有ip,這個路由資訊必須在SNAT伺服器設定完私有ip之後才能新增,因為本機與閘道器之間必須是聯通的狀態
> ip route add default via 192.168.100.201 dev ens33
> ip route show
default via 192.168.199.1 dev ens33 proto dhcp metric 100
192.168.100.0/24 dev ens33 proto kernel scope link src 192.168.100.200
複製程式碼
設定完成後整個鏈路就變成了下圖
於是PC-ONE就隱藏在了SNAT伺服器之後,對外只能看到SNAT伺服器的地址,SANT充當著防火牆的作用
資料傳遞鏈路分析
這次我們在模擬的公網伺服器192.168.199.116上監聽一個埠
nc -l 8000
複製程式碼
然後在PC-ONE上連線此埠肯定是可以聯通的並互相通訊的
從PC-ONE到公網伺服器
- PC發出的資料包頭來源為192.168.100.200,傳送到SNAT伺服器
- SNAT伺服器內部介面192.168.100.200接受資料後,分析發現目標地址並非本機,所以把資料轉到public ip處
- SNAT伺服器通過iptables的POSTROUTING鏈將資料包的報頭來源偽裝成SANT的public ip,並將兩個不同來源192.168.100.200和public ip記錄帶記憶體
所以在公共網路上看到這個資料的來源都是來自SNAT的public ip
從公網伺服器到PC-ONE
- 公網伺服器會將響應資料傳送給Public IP的主機,即SNAT主機;
- 當 Linux NAT 伺服器收到來自公網伺服器的迴應封包後,會分析該封包的序號,並比對剛剛記錄到記憶體當中的資料, 由於發現該封包為後端主機之前傳送出去的,因此在 NAT Prerouting 鏈中,會將目標 IP 修改成為後端主機,亦即那部 192.168.100.200,然後發現目標已經不是本機 (public IP), 所以開始透過路由分析封包流向;
- 封包會傳送到 192.168.100.201 這個內部介面,然後再傳送到最終目標 192.168.100.200 機器上去!