抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

实验环境

虚拟机均通过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 服务

1
systemctl stop firewalld 

2、注销 firewall 服务

1
systemctl mask firewalld

3、安装 iptables 服务

1
2
sudo yum install -y iptables 
sudo yum install -y iptables-services

4、启动 iptables 服务

1
systemctl start iptables

或者

1
service iptables start

5、设置 iptables 开机自启动

1
systemctl enable iptables

6、查看 iptables 状态

1
systemctl status iptables

或者

1
service iptables status

Active是激活状态

按q,返回命令行模式

7、查看 iptables 文件

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

iptables 文件的初始内容如下:


常见iptables服务命令:

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

1
systemctl stop iptables

或者

1
service iptables stop

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

1
systemctl restart iptables

或者

1
service iptables restart

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

1
service iptables save 

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

1
systemctl reload iptables

或者

1
service iptables reload

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

1)不带编号

1
iptables -n -L

2)带编号

1
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和掩码

      1
      sudo ifconfig eth0 10.37.129.6 netmask 255.255.255.0
    • 设置网关

      1
      sudo route add default gw 10.37.129.1
    • 查看路由

      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开启路由转发

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

1开启,0关闭

1
vim /etc/sysctl.conf

打开注释

1
net.ipv4.ip_forward = 1

执行修改

1
sysctl -p

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

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

用curl去测的话,开80端口

1
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协议

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

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

1
service iptables save

查看效果

1
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

评论