什么是SNAT?
SNAT用于局域網訪問互聯網,局域網的主機A想訪問互聯網上的主機C,首先要將資料包發送到防火墻所在的主機B,B收到后修改資料包的源地址為B機的公網IP,然后再發送到互聯網,
C機收到后將回應包經互聯網發送給B,B收到回應包之后修改回應包的目的地址為A,然后將資料包轉發給A,
至此就是SNAT的完整程序,在這個程序中,修改了請求報文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域網訪問互聯網,
而DNAT(destination NAT POSTROUTING),修改了請求報文的目標地址,用于互聯網訪問局域網,
什么是DNAT?
Destination Network Address Translation
應用場景:在Internet中發布位于企業局域網內的服務器
原理
目的地址轉換
修改資料包的目標IP地址

基于iptables的SNAT+DNAT+docker服務器集群搭建介紹
專案名稱:基于iptables的SNAT+DNAT+docker服務器集群搭建
專案環境:CentOS 8.3,docker 20.10.8,Mysql 8.0
專案描述:模擬企業環境,構建并發布內網服務器,并讓內網服務器可以上網,使用docker快速部署并搭建自己的web和MySQL應用
專案步驟:
- 規劃整個專案的拓撲網路結構和IP地址
- 初始化3臺服務器的系統,并根據拓撲圖的規劃配置ip地址,并初始化docker軟體
- 實作SNAT方法讓內網的服務器可以安全上網
- 在網關服務器上基于DNAT策略修改并更新IP組態檔,同時開啟路由功能
- 在內網服務器上使用docker快速啟動Nginx和MySQL容器
- 測驗整個發布的效果
專案心得:
-
對SNAT和DNAT的認識更加深刻
-
對docker容器的概念與應用有了更深的理解,能夠很好地使用docker進行應用的快速部署
-
對集群的概念有了更深的認識,認識到集群的優勢就是能夠更加合理地分配資源
一、機器配置
如下圖做機器配置:

其中Web-server,Mysql-server和Linux網關服務器分別為三臺系統為CentOS的虛擬機
具體修改IP地址,添加網卡的操作可以參考筆者之前的博文:
注意,初始配置完成之后集群的狀態應當是:
Web-server、Mysql-server不能聯網,也就是ping不通www.baidu.com的狀態
而Linux網關服務器可以聯網
二、SNAT實作
各機器全部配置好之后,在網關服務器上運行snat.sh腳本如下:
#!/bin/bash
#臨時開啟路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#臨時關閉selinux
setenforce 0
#臨時關閉firewalld
service firewalld stop
#清除filter表和nat表里的防火墻規則
iptables -F
iptables -t nat -F
iptables -P INPUT ACCEPT
#snat策略,將進入的LAN口網段(192.168.170.0)包裝成出去的WAN口網段(192.168.2.15)
iptables -t nat -A POSTROUTING -s 192.168.170.0/24 -o ens33 -j SNAT --to-source 192.168.2.15
運行之后web和mysql-server即可ping通,能夠聯網
再查看一下策略
iptables -t nat -L -n
三、啟動容器
3.1 在web-server上啟動docker的nginx容器
docker run -d --name sc-nginx-2 -p 80:80 nginx
測驗
[root@web ~]# netstat -anplut|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3411/docker-proxy
tcp6 0 0 :::80 :::* LISTEN 3415/docker-proxy
成功
3.2 在mysql-server上啟動docker的mysql容器
docker run -d --name mysql1 -e MYSQL_ROOT_PASSWORD='123456' -p 3306:3306 mysql
測驗
[root@web ~]# mysql -uroot -p123456 -h 192.168.170.2
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
成功
四、DNAT實作
然后在主機上運行dnat.sh腳本如下:
#!/bin/bash
#臨時開啟路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#臨時關閉selinux
setenforce 0
#臨時關閉firewalld
service firewalld stop
#dnat to web
iptables -t nat -A PREROUTING -d 192.168.2.15 -p tcp --dport 80 -j DNAT --to-destination 192.168.170.1:80
#dnat to mysql
iptables -t nat -A PREROUTING -d 192.168.2.15 -p tcp --dport 3306 -j DNAT --to-destination 192.168.170.2:3306
查看一下策略
iptables -t nat -L -n
最終nat表如下:
[root@server ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.2.15 tcp dpt:80 to:192.168.170.1:80
DNAT tcp -- 0.0.0.0/0 192.168.2.15 tcp dpt:3306 to:192.168.170.2:3306
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.170.0/24 0.0.0.0/0 to:192.168.2.15
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
最后的驗證
五、驗證web-server
在web-server中進入nginx容器做如下修改(不修改也可以,但是只能看到nginx默認頁面)
[root@web ~]# docker exec -it web1 /bin/bash
root@4240c605729f:/# cd /usr/share/nginx/html/
root@4240c605729f:/usr/share/nginx/html# ls
50x.html index.html
root@4240c605729f:/usr/share/nginx/html# echo "welcome to liwenbin's home!" >index.html
在win10瀏覽器地址欄中輸入192.168.2.15,得到效果圖如下:

六、驗證mysql-server
另開一臺虛擬機,使用之前驗證mysql-server容器是否啟動的命令測驗即可

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/295372.html
標籤:其他
