【Linux网络实战】利用iptables实现内网服务器发布(SNAT+DNAT+docker)

【Linux网络实战】利用iptables实现内网服务器发布(SNAT+DNAT+docker)

前置知识:iptablesSNAT和DNAT

项目简介

项目名称:利用iptables实现内网服务器发布

项目环境:centOS 7虚拟机(4台,2核2G),docker(24.0.4),Mysql(5.7.41),nginx,ssh,iptables等

项目描述:在本项目实战中,通过模拟企业实际环境,使用iptables发布内网实现内网服务器发布,并使用Docker来创建和管理相关服务。为了方便外网设备远程连接内网设备,设置SSH跳板机,提供高效和安全的网络通信方式。

项目步骤

  1. 设计网络拓扑结构图,并准备相关机器,对服务器进行职责划分。
  2. 配置相关机器的网络连接设置,并确保网关防火墙机器能够连接外网。
  3. 对防火墙机器进行配置,保证内网机器网络连接正常。
  4. 在内网服务器上安装和配置Docker,并启动所需的服务。
  5. 针对防火墙机器,配置防火墙规则以实现内网服务器与外网的通信。
  6. 使用外网机器对配置结果进行测试和验证。

项目步骤

规划网络拓扑图

在这里插入图片描述

网络拓扑图规划中,内网使用192.168.121.0/24网段,共三台机器,职责如下:

  1. ssh跳板机:负责提供内网机器的ssh远程连接,IP地址:192.168.121.5
  2. MySQL服务器:负责提供MySQL服务,IP地址:192.168.121.10
  3. Nignx Web服务器:负责提供web服务,IP地址:192.168.121.15

防火墙则使用与相连路由器相同的网段,我这里使用192.168.x.x代替,并与外网联。

所有机器均使用桥接模式,最后使用另一台机器对实验结果进行验证测试。

配置网络连接设置

  1. 准备好相关机器之后为所有机器修改主机名称,以方便区分机器。

    # 修改主机名
    hostnamectl set-hostname 要修改的主机名
    
  2. 关闭防火墙和seLinux

    除了防火墙机器外,其他内网机器均进行关闭防火墙和seLinux操作:

    # 关闭防火墙
    systemctl stop firewalld
    # 设置防火墙开机不自启动
    systemctl disable firewalld
    
    # 临时关闭seLinux
    setenforce 0
    # 永久关闭seLinux
    sed -i '/^SELINUX/ s/enforcing/disabled/g' /etc/selinux/config
    
  3. 根据网络拓扑图,多所有机器进行网络连接设置,主要设置为静态IP和网关IP:

    各机器网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens33如下所示:
    MySQL

    BOOTPROTO="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地址,因此该机器需要配置两张网卡,两张网卡分别为ens33ens37

    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
      

      测试结果:

      请添加图片描述

    1. 如何给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"
    
    1. 如何给Linux机器配置两张网卡:

    这里使用的是vmware的虚拟机,在vmware的虚拟机配置中最下方有个添加,点击添加,选中网络适配器即可。这里默认创建ens37名称的网卡,然后还要自己编写ens37的配置文件,直接复制原有的ens33再修改即可,配置名称应当命名为ifcfg-ens37,文件中ens33内容都要改为ens37。

    1. 当设置了内网地址之后,windows实体机可能会无法使用用xhsell连接这些机器,导致不方便配置,可以给Windows实体机加一条路由下一跳的规则:
    # 在Windows cmd中运行如下命令
    route add 192.168.121.0/24 192.168.x.x
    
  4. 开启防火墙机器的路由转发功能

    在给网关防火墙配置好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跳板机上了

测试能否连接其他内网机器

请添加图片描述

项目心得

  1. 第一次将网络和服务联系起来,让我对网络的运作和理解更加深刻。
  2. 在写项目过程中遇到了很多的问题,让我对网络的纠错能力大大加强,并且对抓包软件的使用更加熟练。
  3. 在完成项目之后,更加认识到一个完整的项目规划的重要性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值