实验环境
虚拟机均通过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 | sudo yum install -y iptables |
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 stop2、iptables 服务的重启命令如下:
1 systemctl restart iptables或者
1 service iptables restart3、保存 iptables 文件修改,命令如下:
1 service iptables save4、重载 iptables 文件,命令如下:
1 systemctl reload iptables或者
1 service iptables reload5、查看已配置的iptables规则,命令如下:
1)不带编号
1 iptables -n -L2)带编号
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包。
实验成功!