实验环境

虚拟机均通过parallels desktop 17 安装

Ubuntu: Ubuntu 20.04.2 ARM64 【client内网客户机】

CentOS:CentOS-Stream-9-latest-aarch64-dvd1 【NAT server】

macOS: macOS Monterey. M1, 2020, ARM64【物理机 Web server】


Ubutntu的iptables版本:iptables v1.8.4 (legacy)

CentOS的 iptables版本:iptables v1.8.8 (nf_tables)


IP配置:

设备 IP地址 网关
macOS (web server,外网环境) 192.168.117.2 192.168.117.1
centOS (NAT server,内外网环境) Enp0s6 外网IP: 192.168.117.1 Enp0s5 内网IP: 10.37.129.1
ubuntu (client,内网环境) 10.37.129.6 10.37.129.1

网络拓扑:

原理解释

NAT server:将IP地址转换另外一个IP,内部IP想要访问外网时,NAT实现内部和外部网络的转换。NAT一般部署在连接内网和外网的网关设备或者内外网之间的防火墙上。

通常NAT的两个网卡,连接内网的是内网的网关,连接外网的是一个公有地址。

WEB server:充当公网的服务,需要和内网进行交互连接

SNAT:把数据包的源地址由私网IP转换成公网IP。当相应的数据包从公网发到内网时,会把数据包的目的地址由公网IP转换成私网IP。不同内网主机会通过端口号进行区分。

如何实现的共享网络:

外网访问内网用户时。NAT的内网服务路由器收到内网的回应报文后,根据该回应报文的“源IP地址+源端口号”找出对应的公网IP+端口号,然后用查找结果替换报文的源IP地址+源端口号

开启iptables服务

CentOS默认是使用 firewalld 服务作为防火墙,我们需要禁用该服务,安装 iptables 服务。

此时网卡选用共享网络模式

1、停止 firewall 服务

systemctl stop firewalld 

2、注销 firewall 服务

systemctl mask firewalld

3、安装 iptables 服务

sudo yum install -y iptables 
sudo yum install -y iptables-services

4、启动 iptables 服务

systemctl start iptables

或者

service iptables start

5、设置 iptables 开机自启动

systemctl enable iptables

6、查看 iptables 状态

systemctl status iptables

或者

service iptables status

Active是激活状态

按q,返回命令行模式

7、查看 iptables 文件

此时可以在 /etc/sysconfig/ 目录下看到 iptables 文件

iptables 文件的初始内容如下:


常见iptables服务命令:

1、iptables 服务的停止命令如下:

systemctl stop iptables

或者

service iptables stop

2、iptables 服务的重启命令如下:

systemctl restart iptables

或者

service iptables restart

3、保存 iptables 文件修改,命令如下:

service iptables save 

4、重载 iptables 文件,命令如下:

systemctl reload iptables

或者

service iptables reload

5、查看已配置的iptables规则,命令如下:

1)不带编号

iptables -n -L

2)带编号

iptables -n -L --line-numbers

环境搭建

网络环境不要选择公司插网线的那种环境!选用家庭网络或者手机Wi-Fi充当一下。我目前觉得是公司网络防火墙配置导致了丢包率很高,而且很容易失败!

1. 虚拟机准备

配置好ubuntu和centos,基本功能具备,这里不在赘述,在以往的blog里有记录

2. 网卡配置

ubuntu作为内网客户机,只需分配一个网卡

centos作为nat server需要两个网卡,一个对内连接,可以和内网机器交互。一个对外连接,和外网交互。

3. IP设定和配置

  • macOS物理机,充当webserver的角色。(mac通过设置 -> 网络,查看网关)

    IP地址 网关
    192.168.117.2 192.168.117.1
  • centos,充当NATsever的角色

    在centos 网络设置页面修改IP

    连接外网的IP地址 连接内网的IP地址
    192.168.117.1【桥接模式->默认适配器,enp0s5】 10.37.129.1 【host-only,enp0s6】
  • ubuntu,充当客户机角色

    • 手动设置IP

      网卡的IP和网关一定要写死了!不然就会总出现问题,另外每次进入虚拟机的时候,把各个网卡都重启一下.都选择手动方式配置

    • 绑定IP和掩码

      sudo ifconfig eth0 10.37.129.6 netmask 255.255.255.0
      
    • 设置网关

      sudo route add default gw 10.37.129.1
      
    • 查看路由

      route -n
      

    IP地址 网关
    10.37.129.6 10.37.129.1

没有配置SNAT时,三台主机之间的网络互通情况

能否ping通 ubuntu(client) centos(nat server) macOS (web server)
ubuntu ✅可以ping通网关10.37.129.1 ❌ 不能ping通
centos ✅ 可以ping通 ✅ 可以ping通
macOS ✅ 可以ping通

进行SNAT转换

要实现的效果,client可以访问web server,但需要通过NAT,地址转换为192.168.117.1访问

1. NAT server开启路由转发

echo 1 > /proc/sys/net/ipv4/ip_forward

1开启,0关闭

vim /etc/sysctl.conf

打开注释

net.ipv4.ip_forward = 1

执行修改

sysctl -p

2. NAT server 设置防火墙规则,实现SNAT地址转换

SNAT是在postrouting链表的。地址转换,将内网的网段,转换为外网的IP,即外网出口的那个网关地址。

用curl去测的话,开80端口

iptables -t nat -A POSTROUTING -s 10.37.129.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.117.1

用ping测的话,走icmp协议

iptables -t nat -A POSTROUTING -s 10.37.129.0/24 -p icmp -j SNAT --to-source 192.168.117.1

将这条转发,永久写入nat server

service iptables save

查看效果

sudo iptables -t nat -L

测试结果

内网客户机,可以ping通外网机器(iptables写的icmp的协议)

抓包分析

为了验证内网机器ubuntu去访问外网的macOS时,是否进行了正确的地址转换,对macOS进行抓包,看从ubuntu过来的IP是不是预料中的192.168.117.1

Ubuntu发起ping,对macOS的eth0抓包,过滤icmp

可以看到多条来自192.168.117.1,目的为192.168.117.2 的ICMP包。

实验成功!

参考文章

[渗透测试]虚拟机搭建内外网环境

SNAT/DNAT策略

vmware搭建多台Linux虚拟机内网环境

配置网关

NAT

评论