一、环境说明
如下图所示,局域网1中的服务器是可以访问外网的,由于种种原因局域网1内无法再新增主机了,只好新增局域网2。于是就出现这样一种需求,局域网2中的服务器器也要访问外网。怎么实现无外网的服务器借助有外网的服务器上网呢?看了很多博客,有的提到使用PPTP软件,试了下不行。经过一番尝试,发现其实最简单方法就是通过iptables一条命令就可以实现了。这是一个典型的SNAT场景,具体实现看下文
服务器连线示意图

以上所有服务器安装的操作系统是Ubuntu22.04,如下图所示

二、iptabes配置
# 把ens29f0网卡的源ip是 192.168.2.0/24网段的数据包通过nat转发到ens29f1,并修改IP数据包的表头来源IP为10.49.1.81
sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens29f1 -j SNAT --to 10.49.1.81
这里局域网1中的那台服务器使用dnsmasq部署了dhcp服务,dnsmasq的安装和配置可以参考:https://blog.youkuaiyun.com/u010438035/article/details/128396790。
局域网1中的那台服务器也可以不部署dhcp,这样局域网2中的服务器手动配置ip地址和网关及dns即可,类似如下:
sudo vi /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens17f0:
dhcp4: false
addresses:
- 192.168.2.141/24
optional: true
routes:
- to: default
via: 192.168.2.49
nameservers:
addresses:
- 114.114.114.114
- 8.8.8.8
version: 2
三、测试
从局域网2中的任意一台服务器ping baidu.com能够ping 通说明配置成功。
参考如下链接:
https://www.jianshu.com/p/957388fa5531
https://zhuanlan.zhihu.com/p/340149470
四、优化
以上iptables配置会在重启后丢失,通过下面的方法实现重启后也能上网
sudo chmod a+w -R /opt
sudo iptables-save > /opt/iptables.rules
sudo vi /root/.bashrc
# 在文件最后增加下面一行,实现开机就添加iptables规则
/sbin/iptables-restore < /opt/iptables.rules