项目名称
基于Docker与iptables的SNAT+DNAT服务器发布项目
项目描述
模拟企业的环境发布内网的服务器或者由于业务扩大服务器不足,增加镜像服务器的方式来维护企业业务,同时也让内网服务器可以上网,采取docker容器技术构建自己的web和MySQL等应用
项目设备
centos7(两台),Ubuntu20.04,docker20.10.8,mysql5.7.35,nginx1.21.1
项目步骤
1、规划整个网络拓扑图,为每个机器规划网络,配置ip地址等基础信息
2、安装3台虚拟机,根据拓扑图配置ip和网关等基本配置和规划
3、在router服务器上添加SNAT规则让内网的两个服务器可以上网,为了方便管理,我们写成脚本 添加snat
#!/bin/bash
#打开路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#清除防火墙规则
iptables -F
iptables -t nat -F
iptables -P INPUT ACCEPT
#snat规则
ptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j SNAT --to-source 192.168.10.99
ptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens33 -j SNAT --to-source 192.168.10.99
4、在内网服务器上下载docker容器,下载MySQL和nginx镜像,启动nginx和MySQL的docker容器,测试容器是否能正常访问
docker的安装步骤
https://docs.docker.com/engine/install/centos/
#启动nginx的容器
[root@web-server ~]# docker run -d --name nginx-1 -p 80:80 nginx
af5d6e5f2a71adb5b10802764965ba9b572bcb6ccc5cb647ae24eb165bd84f3f
[root@web-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af5d6e5f2a71 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-1
启动MySQL容器
[root@web-server ~]# docker run -d --name mysql-1 -e MYSQL_ROOT_PASSWORD='123456' -p 3306:3306 mysql:5.7.35
0eed9c4219f7744d9203dd5e8be221f858a50a0a705f64fec38e2e7c3eafd599
[root@web-server ~]#
[root@web-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0eed9c4219f7 mysql:5.7.35 "docker-entrypoint.s…" 34 seconds ago Up 32 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-1
af5d6e5f2a71 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-1
5、在网关服务器上的snat脚本去添加好DNAT策略
#dnat web
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.99 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.37:80
#dnat mysql
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.99 -p tcp --dport 3306 -j DNAT --to-destination 192.168.2.37:3306
#dnat mysql ubuntu docker
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.99 -p tcp --dport 3307 -j DNAT --to-destination 192.168.3.23:3306
##dnat web ubuntu docker
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.99 -p tcp --dport 81 -j DNAT --to-destination 192.168.3.23:80
6、在其他的机器上测试发布的web和MySQL服务,分别使用curl和chrome对服务进行测试,SQLyog的测试工具进行数据库连接测试
注意:
数据库部分docker 容器起的mysql,可以使用root用户直接去连接,ruguo要添加新用户,授权等,操作直接进入容器操作
mysql -uroot -p123456
#授权
MySQL [(none)]> grant all on *.* to 'xulun'@'%' identified by '123456'
2、在编写dnat时我们就要考虑数据库有多个(但是在不同的容器里面),要设置不同的目的端口转发过去(路由器服务器只有一个唯一端口)如nginx可以一个80,一个81
项目心得
1、做一个项目第一步的规划是非常重要,无论在排错,还是设计上都非常重要,才能保证思路清晰 2、加深了对iptables和docker容器的理解,需要有较强的网络功底,尤其配置的内容更加复杂时 3、提升了对网络的认知,增加了我们的网络排除错误能力,一步步,范围一点点扩大的排除 4增加了对一个项目流程的认识,更加认识到操作需要非常细心和有耐心
|