SNAT服務搭建:IP分享

liangwent發表於2019-03-20

準備

首先使用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的網路設定如圖

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
複製程式碼

設定完成後整個鏈路就變成了下圖

SANT架構示意圖

於是PC-ONE就隱藏在了SNAT伺服器之後,對外只能看到SNAT伺服器的地址,SANT充當著防火牆的作用

資料傳遞鏈路分析

這次我們在模擬的公網伺服器192.168.199.116上監聽一個埠

nc -l 8000
複製程式碼

然後在PC-ONE上連線此埠肯定是可以聯通的並互相通訊的

從PC-ONE到公網伺服器

  1. PC發出的資料包頭來源為192.168.100.200,傳送到SNAT伺服器
  2. SNAT伺服器內部介面192.168.100.200接受資料後,分析發現目標地址並非本機,所以把資料轉到public ip處
  3. SNAT伺服器通過iptables的POSTROUTING鏈將資料包的報頭來源偽裝成SANT的public ip,並將兩個不同來源192.168.100.200和public ip記錄帶記憶體

SNAT 封包傳送出去的示意圖

所以在公共網路上看到這個資料的來源都是來自SNAT的public ip

從公網伺服器到PC-ONE

  1. 公網伺服器會將響應資料傳送給Public IP的主機,即SNAT主機;
  2. 當 Linux NAT 伺服器收到來自公網伺服器的迴應封包後,會分析該封包的序號,並比對剛剛記錄到記憶體當中的資料, 由於發現該封包為後端主機之前傳送出去的,因此在 NAT Prerouting 鏈中,會將目標 IP 修改成為後端主機,亦即那部 192.168.100.200,然後發現目標已經不是本機 (public IP), 所以開始透過路由分析封包流向;
  3. 封包會傳送到 192.168.100.201 這個內部介面,然後再傳送到最終目標 192.168.100.200 機器上去!

SNAT 封包接收的示意圖

相關文章