【Linux网络实战】利用iptables实现内网服务器发布(SNAT+DNAT+docker)
项目简介
项目名称:利用iptables实现内网服务器发布
项目环境:centOS 7虚拟机(4台,2核2G),docker(24.0.4),Mysql(5.7.41),nginx,ssh,iptables等
项目描述:在本项目实战中,通过模拟企业实际环境,使用iptables发布内网实现内网服务器发布,并使用Docker来创建和管理相关服务。为了方便外网设备远程连接内网设备,设置SSH跳板机,提供高效和安全的网络通信方式。
项目步骤:
- 设计网络拓扑结构图,并准备相关机器,对服务器进行职责划分。
- 配置相关机器的网络连接设置,并确保网关防火墙机器能够连接外网。
- 对防火墙机器进行配置,保证内网机器网络连接正常。
- 在内网服务器上安装和配置Docker,并启动所需的服务。
- 针对防火墙机器,配置防火墙规则以实现内网服务器与外网的通信。
- 使用外网机器对配置结果进行测试和验证。
项目步骤
规划网络拓扑图
网络拓扑图规划中,内网使用192.168.121.0/24
网段,共三台机器,职责如下:
- ssh跳板机:负责提供内网机器的ssh远程连接,IP地址:
192.168.121.5
- MySQL服务器:负责提供MySQL服务,IP地址:
192.168.121.10
- Nignx Web服务器:负责提供web服务,IP地址:
192.168.121.15
防火墙则使用与相连路由器相同的网段,我这里使用192.168.x.x
代替,并与外网联。
所有机器均使用桥接模式,最后使用另一台机器对实验结果进行验证测试。
配置网络连接设置
-
准备好相关机器之后为所有机器修改主机名称,以方便区分机器。
# 修改主机名 hostnamectl set-hostname 要修改的主机名
-
关闭防火墙和seLinux
除了防火墙机器外,其他内网机器均进行关闭防火墙和seLinux操作:
# 关闭防火墙 systemctl stop firewalld # 设置防火墙开机不自启动 systemctl disable firewalld # 临时关闭seLinux setenforce 0 # 永久关闭seLinux sed -i '/^SELINUX/ s/enforcing/disabled/g' /etc/selinux/config
-
根据网络拓扑图,多所有机器进行网络连接设置,主要设置为静态IP和网关IP:
各机器网卡配置文件
/etc/sysconfig/network-scripts/ifcfg-ens33
如下所示:
MySQLBOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.121.10" PREFIX="24" GATEWAY="192.168.121.1" DNS1="114.114.114.114"
Nginx
BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.121.15" PREFIX="24" GATEWAY="192.168.121.1" DNS1="114.114.114.114"
ssh跳板机
BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.121.5" PREFIX="24" GATEWAY="192.168.121.1" DNS1="114.114.114.114"
网关防火墙
由于网关防火墙需要进行双向的通信,所以,网关防火墙机器需要同时具备外网和内网IP地址,因此该机器需要配置两张网卡,两张网卡分别为
ens33
和ens37
。ifcfg-ens33
ens33
的网址配置应与当前路由器的网段相同,我这里使用192.168.x.x
代替。BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.x.x" PREFIX="24" GATEWAY="192.168.x.x" DNS1="114.114.114.114"
ifcfg-ens37
ens37
的职责是与内网通信,所以该网卡不需要配置网关和DNS服务器地址BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.121.1" PREFIX="24"
当所有机器配置修改配置文件之后,使用
systemctl
命令刷新服务,使配置生效systemctl restart network
刷新完成之后使用
ifconfig
命令查看各机器IP地址:如果没有
ifconfig
命令,可以使用如下命令进行安装# 当然Linux查看IP地址的命令有很多不一定要使用这个 yum install -y net-tools
配置结果:
MySQL
Nginx
ssh
网关防火墙
-
当防火墙机器配置完毕之后,应当能够确保防火墙机器能够上网,这里可以使用
ping
命令进行测试ping -c 3 www.baidu.com
测试结果:
- 如何给Linux系统配置静态IP:
在
/etc/sysconfig/network-scripts/
目录下有Linux的网卡的同名配置文件,一般添加或修改如下配置即可:# 其中将BOOTPROTO改为static/none都可 # 设备名称应和网卡名称相同 BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.x.x" PREFIX="24" GATEWAY="192.168.x.x" DNS1="114.114.114.114"
- 如何给Linux机器配置两张网卡:
这里使用的是vmware的虚拟机,在vmware的虚拟机配置中最下方有个添加,点击添加,选中网络适配器即可。这里默认创建
ens37
名称的网卡,然后还要自己编写ens37的配置文件,直接复制原有的ens33再修改即可,配置名称应当命名为ifcfg-ens37
,文件中ens33内容都要改为ens37。- 当设置了内网地址之后,windows实体机可能会无法使用用xhsell连接这些机器,导致不方便配置,可以给Windows实体机加一条路由下一跳的规则:
# 在Windows cmd中运行如下命令 route add 192.168.121.0/24 192.168.x.x
-
-
开启防火墙机器的路由转发功能
在给网关防火墙配置好IP地址之后,由于网关防火墙还需要承担路由转发的职责,所以还需要打开网关防火墙的路由转发功能,配置如下:
# 临时打开 # 这里必需使用重定向改写该文件,该文件不支持使用vim修改(只读) echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启 # 这里可以直接进入文件改写 echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf # 改写配置之后刷新服务 sysctl -p
配置防火墙SNAT规则
当完成各个机器的相关配置之后,则需要给防火墙配置SNAT规则,使内网机器能够上网。配置命令如下:
# 给内网的192.168.121.0网段配置SNAT
iptables -t nat -A POSTROUTING -s 192.168.121.0/24 -o ens33 -j SNAT --to-source 192.168.x.x
# 添加SNAT防火墙规则之后可以查看
iptables -t nat -L
给防火墙机器添加相应规则之后,内网机器使用ping
命令验证内网机器能够与网站通信。
ping -c 3 www.baidu.com
测试结果:
ssh跳板机:
Nginxweb服务器:
MySQL服务器:
启动服务
我们给防火墙配置相关SNAT规则以及确保内网机器能够与外网进行数据交换之后,我们就可以在内网机器上安装docker并启动相应的服务。
安装docker
centOS 7安装docker使用如下一系列命令
#安装工具包
yum install -y yum-utils
# 使用工具包自动下载docker,这是官方的源,\续行符
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#安装docker-ce软件
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# 启动docker服务
systemctl start docker
# 设置开机自启动
systemctl enable docker
在给内网服务器安装好docker之后,使用systemctl
命令查看docker的运行状态,确保doker安装成功
systemctl status docker
部署相应服务
确保机器安装好docker之后,我们就可以使用docker部署相应的服务。
MySQL
# 拉取MySQL镜像,拉取时不指定镜像版本默认拉取最新版本
docker pull mysql[:version]
# 查看mysql镜像
docker images
# 确保安装好MySQL镜像之后就可以创建容器了,不指定版本默认使用最新镜像,如果该版本镜像不存在,则自动拉取
# mysql容器创建时需要指定密码,这里指定为123456
docker run -d -p 3306 -e MYSQL_ROOT_PASSWORD="123456" --name Mysql-server msyql[:version]
Nginx
# 拉取Nginx镜像
docker pull nginx[:version]
# 查看nginx镜像
docker images
# 创建nginx镜像
docker run -d -p 8090 --name Nginx-server Nginx[:version]
确定服务正在运行
当所有镜像成功创建之后,可以使用docker
命令查看容器运行状态
docker ps -a
mysql和nginx容器运行状态:
配置防火墙DNAT规则
完成服务启动之后,给防火墙配置DNAT规则,使外部机器能够访问内网服务器。命令如下:
# DNAT规则应当分别进行精确转发
# ssh跳板机DNAT转发规则
iptables -t nat -A PREROUTING -d 192.168.x.x -p tcp --dport 22 -i ens33 -j DNAT --to-destination 192.168.121.5
# Nginx服务器DNAT转发规则
iptables -t nat -A PREROUTING -d 192.168.x.x -p tcp --dport 8090 -i ens33 -j DNAT --to-destination 192.168.121.15
# MySQL服务器DNAT转发规则
iptables -t nat -A PREROUTING -d 192.168.x.x -p tcp --dport 3306 -i ens33 -j DNAT --to-destination 192.168.121.10
配置完成之后,可以使用iptables -t nat -L
命令查看防火墙规则
结果如下所示:
项目结果验证
前面所有步骤完成之后,可以使用与防火墙处于同一网段下的机器访问内网服务器进行验证。
Mysql服务验证
预期结果:外部机器能够远程访问Mysql服务,这里使用navicat软件测试连接。
测试结果:
Nginx服务验证
预期结果:外部机器能够远程访问网关的80端口会自动转发到Nginx提供的web网站服务,由于这里没有对nginx的主页进行修改,预期结果应当是nginx的欢迎界面。
测试结果:
成功链接。
ssh跳板机功能
预期结果:由于其他网段机器无法直接访问内网机器,通过访问网关的22号端口会自动转发到ssh跳板机上,然后通过该跳板机能够连接其他内网机器。
测试结果:
直接连接防火墙的22号端口发现直接转发到ssh跳板机上了
测试能否连接其他内网机器
项目心得
- 第一次将网络和服务联系起来,让我对网络的运作和理解更加深刻。
- 在写项目过程中遇到了很多的问题,让我对网络的纠错能力大大加强,并且对抓包软件的使用更加熟练。
- 在完成项目之后,更加认识到一个完整的项目规划的重要性。