基于iptables的SNAT+DNAT和docker的服务发布

基于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网关服务器:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SrD8vgfM-1685934804952)(C:\Users\Eran\AppData\Roaming\Typora\typora-user-images\image-20230420194956646.png)]

  • web server:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GBPtcMi9-1685934804953)(C:\Users\Eran\AppData\Roaming\Typora\typora-user-images\image-20230420195429512.png)]

  • MySQL server:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pxg2TDeC-1685934804953)(C:\Users\Eran\AppData\Roaming\Typora\typora-user-images\image-20230420195604099.png)]

3、安装docker软件

1)docker安装

官方文档

https://docs.docker.com/engine/install/centos/

  1. 卸载原来安装过的docker,如果没有安装可以不需要卸载

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 安装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
    
  3. 安装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]# 
    
  4. 启动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]# 
    
  5. 设置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的测试工具进行测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RIwDiVQO-1685934804954)(C:\Users\Eran\AppData\Roaming\Typora\typora-user-images\image-20230605110906948.png)]

五、项目心得

  1. 网关服务器的内网接口和外网接口各自的ip地址一定要分清楚
  2. 做一个项目规划非常重要,才能有条不紊的进行,思路清晰
  3. 加深了对iptables和docker容器的理解
  4. 提升网络troubleshooting的能力
  5. 提升了文档的编写能力
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码精灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值