一、背景
当我们有多台虚拟机时,有权限访问公网的虚拟机(下文简称:公网主机)只有一台,那么其他没有公网的虚拟机(下文简称:内网主机)如果有访问公网的需求,我们应该怎么办呢?
试想一下,如果将内网主机访问公网的流量先送到公网主机,再有公网主机将流量转发到外网,是不是就可以解决这个问题呢?
本文提供了一个简单的方法,使用snat技术将公网主机配置成了一个公网网关,内网主机可以借助公网网关访问公网。
一、构建测试环境
公网主机:
具有访问公网能力的虚拟机一台。
内网主机:
使用网络命名空间的方式,隔离一个独立的网络来模拟只有内网的虚拟机:
- 创建命名空间:ip netns add host1
- host1空间内启动lo回环网卡:ip netns exec host1 ip link set lo up
- 进入命名空间(可以看成进入了内网主机):ip netns exec host1 bash
为公网主机和内网主机添加内网网卡(公网主机上执行):
- 创建veth pair:ip link add veth0 type veth peer name veth1
- veth0作为公网主机的内网网卡,veth1作为内网主机的内网网卡
- 为内网主机添加内网网卡veth1:ip link set veth1 netns host1
- 为veth1添加ip地址:ip netns exec host1 ip addr add 192.168.1.2/24 dev veth1
- 启动内网主机网卡veth1:ip netns exec host1 ip link set veth1 up
- 为公网主机网卡veth0添加ip地址:ip addr add 192.168.1.1/24 dev veth0
- 启动公网主机网卡veth0:ip link set veth0 up
查询公网主机网卡信息并测试访问公网:
查询内网主机网卡信息并测试访问公网:
二、通过snat将公网主机设置为公网网关
开启转发:
- 开启ipv4转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
设置snat转发规则:
- 将源ip地址为192.168.1.2的地址转换成公网主机的公网网卡ip地址:
iptables -t nat -A POSTROUTING -s 192.168.1.2/32 -j SNAT --to-source 192.168.134.100
查看snat规则:
- iptables -t nat -S
三、将内网访问公网的流量转发到公网网关
内网主机添加默认路由:
将访问公网的流量转发到公网网关192.168.1.1:ip route add default via 192.168.1.1 dev veth1
验证内网主机访问公网能力:
四、总结
本文介绍了一种通过snat方式配置了个公网网关服务器,涉及到的知识面有网络命名空间、路由配置、veth pair等linux的知识,在看文档前需要对这些知识进行初步的了解。