基于iptables的SNAT+DNAT和docker的服务发布
文章目录
一、项目名称
基于iptables的SNAT+DNAT和docker的服务发布
二、项目环境
centos7.9,
docker23.0.4
MySQL5.7.40
nginx1.23.4
iptables 3台服务器2c/2G
三、项目描述:
模拟企业的环境发布内刚的服务器,同时也让内网服务器可以上网,采取docker容器技术构建自己的web和MySOL应用
四、项目步骤
1、规划整个项目的拓扑结构和ip地址
server:
ens33:192.168.1.142
ens36:192.168.1.143
MySQL server:192.168.1.136
Web server: 192.168.1.180
2、安装好3台服务器的系统,根据拓扑图的规划配置ip地址
-
firewall网关服务器:
-
web server:
-
MySQL server:
3、安装docker软件
1)docker安装
官方文档
https://docs.docker.com/engine/install/centos/
-
卸载原来安装过的docker,如果没有安装可以不需要卸载
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装yum相关的工具,下载docker-ce.repo文件
[root@dnat-web ~]# yum install -y yum-utils [root@dnat-web ~]# yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 已加载插件:fastestmirror adding repo from: https://download.docker.com/linux/centos/docker-ce.repo grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo cd /etc/yum.repos.d/ #存放所有的yum仓库文件的 [root@dnat-web yum.repos.d]# ls CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo epel.repo CentOS-CR.repo CentOS-Media.repo CentOS-x86_64-kernel.repo epel-testing.repo CentOS-Debuginfo.repo CentOS-Sources.repo docker-ce.repo
-
安装docker-ce软件
container engine 容器引擎 docker是一个容器管理的软件 docker-ce 是服务器端软件 server docker-ce-cli 是客户端软件 client docker-compose-plugin 是compose插件,用来批量启动很多容器,在单台机器上 containerd.io 底层用来启动容器的 [root@dnat-web yum.repos.d]# yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y [root@dnat-web yum.repos.d]# docker --version Docker version 20.10.17, build 100c701 [root@dnat-web yum.repos.d]#
-
启动docker服务
[root@dnat-web yum.repos.d]# systemctl start docker [root@dnat-web yum.repos.d]# ps aux|grep docker root 1892 1.4 1.5 1095108 58972 ? Ssl 11:39 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 2029 0.0 0.0 112824 976 pts/0 S+ 11:40 0:00 grep --color=auto docker [root@dnat-web yum.repos.d]#
-
设置docker服务开机启动
[root@dnat-web yum.repos.d]# systemctl enable docker
2)dnat-web上启动nginx
[root@dnat-web yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@dnat-web yum.repos.d]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
26c5c85e47da: Pull complete
4f3256bdf66b: Pull complete
2019c71d5655: Pull complete
8c767bdbc9ae: Pull complete
78e14bb05fd3: Pull complete
75576236abf5: Pull complete
Digest: sha256:63b44e8ddb83d5dd8020327c1f40436e37a6fffd3ef2498a6204df23be6e7e94
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@dnat-web yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6efc10a0510f 8 days ago 142MB
[root@dnat-web yum.repos.d]# docker run --name ln-nginx-1 -d -p 80:80 nginx
c39d3883d7a8dae741a01ca969582f8e785efdc9aff4f4e2940400e691046635
[root@dnat-web yum.repos.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c39d3883d7a8 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp ln-nginx-1
[root@dnat-web yum.repos.d]# ps aux|grep docker
root 1768 1.0 6.6 1110772 66104 ? Ssl 16:40 0:02 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 1950 0.0 0.8 816412 8020 ? Sl 16:43 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
root 1954 0.0 1.0 816412 10068 ? Sl 16:43 0:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80
root 2040 0.0 0.0 112824 980 pts/0 R+ 16:44 0:00 grep --color=auto docker
[root@dnat-web yum.repos.d]# docker container inspect ln-nginx-1
[
{
......
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
......
}
]
4、实现SNAT让内网的服务器可以上网
[root@firewall lianxi]# vi snat.sh
[root@firewall lianxi]# cat snat.sh
#!/bin/bash
#清除filter表和nat表里的防火墙规则
iptables -F
iptables -t nat -F
#SNAT策略
iptables -t nat -A POSTROUTING -s 192.168.1.143 -o ens33 -j SNAT --to-source 192.168.1.142
#开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
[root@firewall lianxi]# bash snat.sh 执行脚本
5、在网关服务器上配置好DNAT策略,开启路由功能
[root@firewall lianxi]# cat snat.sh
#!/bin/bash
#open route function
echo 1 >/proc/sys/net/ipv4/ip_forward
#clear iptables rules
iptables -F
iptables -t nat -F
#start SNAT
#iptables -t nat -A POSTROUTING -s 192.168.1.143 -o ens33 -j SNAT --to-source 192.168.1.142
iptables -t nat -A POSTROUTING -s 192.168.1.143 -o ens33 -j MASQUERADE
#DNAT
#DNAT web
iptables -t nat -A PREROUTING -i ens33 -d 192.168.1.142 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.180:80
#DNAT mysql
iptables -t nat -A PREROUTING -i ens33 -d 192.168.1.142 -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.136:3306
6、在内网服务器上启动nginx和MySQL的docker容器,测试容器是否能正确访问
(1) 需要在Windows里添加一条路由,从而方便我们ssh到内网的服务器里
C:\WINDOWS\system32>route add 192.168.1.180/24 192.168.1.1
操作完成!
#目标网段 #下一跳地址
C:\WINDOWS\system32>route add 192.168.1.180/24 192.168.1.142
操作完成!
(2) 先在两台服务器上均下载好docker
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
cd /etc/yum.repos.d/ #存放所有的yum仓库文件的
[root@dnat-web yum.repos.d]# ls
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo epel.repo
CentOS-CR.repo CentOS-Media.repo CentOS-x86_64-kernel.repo epel-testing.repo
CentOS-Debuginfo.repo CentOS-Sources.repo docker-ce.repo
#下载docker引擎
yum install docker-ce docker-ce-cli contained.io
#启动docker服务
service docker start
#设置docker服务开机启动
systemctl enable docker
(3) web server上启动nginx
[root@dnat-web yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@dnat-web yum.repos.d]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
26c5c85e47da: Pull complete
4f3256bdf66b: Pull complete
2019c71d5655: Pull complete
8c767bdbc9ae: Pull complete
78e14bb05fd3: Pull complete
75576236abf5: Pull complete
Digest: sha256:63b44e8ddb83d5dd8020327c1f40436e37a6fffd3ef2498a6204df23be6e7e94
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@dnat-web yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6efc10a0510f 8 days ago 142MB
[root@dnat-web yum.repos.d]# docker run --name ln-nginx-1 -d -p 80:80 nginx
c39d3883d7a8dae741a01ca969582f8e785efdc9aff4f4e2940400e691046635
[root@dnat-web yum.repos.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c39d3883d7a8 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp ln-nginx-1
[root@dnat-web yum.repos.d]# ps aux|grep docker
root 1768 1.0 6.6 1110772 66104 ? Ssl 16:40 0:02 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 1950 0.0 0.8 816412 8020 ? Sl 16:43 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
root 1954 0.0 1.0 816412 10068 ? Sl 16:43 0:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80
root 2040 0.0 0.0 112824 980 pts/0 R+ 16:44 0:00 grep --color=auto docker
(4) mysql server启动docker
docker pull mysql
docker run -d --name ln-mysql-1 -e MYSQL_ROOT_PASSWORD='123456' -p 3306:3306 mysql
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5517c2ddff2e mysql "docker-entrypoint.s…" 33 seconds ago Up 33 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp ln-mysql-1
7、其他机器测试
在其它的机器上测试整个发布的效果。使用curl和chrome,SQLyog的测试工具进行测试
五、项目心得
- 网关服务器的内网接口和外网接口各自的ip地址一定要分清楚
- 做一个项目规划非常重要,才能有条不紊的进行,思路清晰
- 加深了对iptables和docker容器的理解
- 提升网络troubleshooting的能力
- 提升了文档的编写能力