前段时间接触了 ZStack 私有云虚拟化系统,由于公网IP数量有限,没有条件给多个云主机分配独立公网IP地址,于是通过iptables snat 规则共享一个公网IP的网络,再通过私有IP段分配给其它的云主机使用,达到网络访问效果!当然,ZStack 也有提供云路由系统,但是由于“功能”太多,加上某些应用场景下使用效果非常不理想,因此 ...

由于IDC赠送了几个 IPv6,所以产生了两个网卡分别接入ipv4 和 ipv6,即使你单个网卡双栈网络 NAT网关的操作也是一样的!

实践环境
虚拟机系统:CentOS 7.8 Minimal
网卡eth0(公网ipv4):42.51.9.135
网卡eth1(公网ipv6):240e:93d:1000:9::10

安装 iptables

由于CentOS 7 默认自带 Firewalld 防火墙,我们先关闭它

禁用 firewalld 服务

systemctl disable firewalld
systemctl stop firewalld

安装 & 启动 iptables

yum install -y iptables iptables-services

systemctl start iptables ip6tables  #启动服务
systemctl enable iptables ip6tables  #开机启动

开启IPv4 & IPv6 路由转发

修改 /etc/sysctl.conf 文件参数值为如下,不存在则添加

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

执行以下命令生效修改

sysctl -p

创建虚拟网关IP地址

创建 IPv4 虚拟网卡 /etc/sysconfig/network-scripts/ifcfg-eth0:1

TYPE=Ethernet
BOOTPROTO=none
NAME=eth0:1
DEVICE=eth0:1
ONBOOT=yes
IPADDR=172.20.10.1
NETMASK=255.255.255.0

创建 IPv6 虚拟网卡 /etc/sysconfig/network-scripts/ifcfg-eth1:1

BOOTPROTO=none
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1:1
DEVICE=eth1:1
ONBOOT=yes
IPV6ADDR=1000:2000:3::1/64

注意:ifcfg-eth0:1 和 ifcfg-eth1:1 是根据真实网卡名称追加 :1 而来,如果你是双栈网络,则只需创建一个虚拟网卡即可

重启网卡

systemctl restart network

使用 ifconfig 命令查看虚拟网卡是否生效

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 42.51.9.135  netmask 255.255.255.0  broadcast 42.51.9.255
        ether fa:d8:c6:d5:36:00  txqueuelen 1000  (Ethernet)
        RX packets 2737180  bytes 1381900847 (1.2 GiB)
        RX errors 0  dropped 131721  overruns 0  frame 0
        TX packets 2336822  bytes 1584694107 (1.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.10.1  netmask 255.255.255.0  broadcast 172.20.10.255 # 虚拟网卡地址 172.20.10.1 正常
        ether fa:d8:c6:d5:36:00  txqueuelen 1000  (Ethernet)

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 240e:93d:1000:9::10  prefixlen 64  scopeid 0x0<global>
        inet6 1000:2000:3::1  prefixlen 64  scopeid 0x0<global> # 虚拟网卡地址 1000:2000:3::1 正常
        inet6 fe80::2e60:784b:cb24:db8e  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::f85e:e8ff:fe69:4901  prefixlen 64  scopeid 0x20<link>
        ether fa:5e:e8:69:49:01  txqueuelen 1000  (Ethernet)
        RX packets 3956859  bytes 661939743 (631.2 MiB)
        RX errors 0  dropped 131668  overruns 0  frame 0
        TX packets 279555  bytes 207357925 (197.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

建立 iptables SNAT 转发规则

为了保证没有其它规则影响,可以先把 iptables 现有NAT 规则清空

iptables -F && iptables -t nat -F
ip6tables -F && ip6tables -t nat -F

建立转发规则

iptables -t nat -A POSTROUTING -s 172.20.10.0/24 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -s 1000:2000:3::/64 -j MASQUERADE

保存规则

service iptables save
service ip6tables save

开始使用

在你的云计算平台创建两个私有网络地址池

IPv4:

网关:172.20.10.1
掩码:255.255.255.0
DNS:114.114.114.114(任何可用的公共DNS)
可用IP范围:172.20.10.2-172.20.10.254 (当然,你可以根据自己需求设置IP范围)

IPv6:

网关:1000:2000:3::1
前缀长度:64
DNS:2400:3200:baba::1(任何可用的公共DNS)
可用IP范围:随心所欲。。。

功效扩展

NAT网关 - 私有网段 互通
私有IP - 私有IP 互通

当你想使用私有网段下的云主机某个端口通过 NAT网关(公网)访问,一样可以使用 iptables 映射 172.20.10.x 指定端口到公网上。具体端口映射规则自行百度就有。

同时你也可以使用 nginx 等程序反向代理私有IP 的任何应用,达到一个IP 共用 80 & 443 端口的效果。

SNI Proxy 也是一个非常好的开源程序,能实现四层协议无缝反代(

最后修改:2022 年 01 月 26 日
如果觉得我的文章对你有用,请随意赞赏