今天遇到一个需求,需要在proxmox中建立到VM主机的端口映射,这本是一个很简单的需要求,但是真经不起仔细研究啊。

proxmox服务器配置有唯一IPv4地址,和一个IPv6的64位地址块;要求是给每台虚拟出来的VM主机都配置一个IPv6地址和一段连继的IPv4地址映射端口。

本来想得很美,分两个虚拟网桥:vmbr0和vmbr1,一个接IPv4使用,一个接IPv6,这样不就简单完成了。

但是现实都是很残酷的,这样配置VM主机里就会看到两块网卡,还得再配置路由什么的,我的天,太麻烦了。

然后去网上翻找资料,基本上都是这样的方案,一个vmbr0配置外网地址,一个vmbr1配置内网地址,再做NAT转发。。。

首先要解决的问题就是proxmox下单卡或者叫单网桥配置双IP问题,一个外内IP和一个内网IP,需要配置在同一个网桥上。

直接修改/etc/network/interfaces

auto lo
iface lo inet loopback

iface enp1s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 51.x.x.144/24
        gateway 51.x.x.1
        bridge-ports enp1s0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

iface vmbr0 inet6 static
        address 2001:x:x:x::50/56
        accept_ra 1
        pre-up dhclient -cf /etc/dhcp/dhclient6.conf -pf /run/dhclient6.vmbr0.pid -v -nw -6 -P vmbr0
        pre-down dhclient -x -pf /run/dhclient6.vmbr0.pid

        post-up   ip addr add 198.18.100.1/24 dev vmbr0
        post-down ip addr del 198.18.100.1/24 dev vmbr0
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        

因为还要动态获取到IPv6的网关,所以中间还加入了dhclient这些命令,这个不是本文重点。

好了,使用ip addr命令总算是在单网桥增加了内外网的IPv4了。

第二个问题就是要解决外网端口映射到特定内网IP的端口上了。这个看似简单的问题,又把我难住了。要是简单的一个个端口映射,那几个端口就代表着有几千行的iptables -t nat了,这很不像个IT人士的风格啊!

又开始在网上找资料。。。网上找的资料都下面这样的:

iptables -t nat -A PREROUTING -p tcp --dport 5801:5899 -j DNAT --to 198.18.100.58

或者这样:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 60000 -j DNAT --to-destination 198.18.100.58:50000

这些都不是我想要啊,我需要是公网端口1001到2099映射到内网端口101到199, 这样有规律的转换,方便传播好记。

后来写成了这样:

iptables -t nat -A PREROUTING -p tcp tcp --dport 1000:1099 -j DNAT --to 198.18.100.58:101-199

然后各种测试,发现端口似乎都被NAT到101上去了,没有像期望的那样实现端口对应。。。

还看到了一篇这样的文章:
iptables的端口范围映射

他告诉我们:

当匹配的端口在映射端口的区间内时,那么端口号不会被修改。如果匹配端口不在映射端口的区间内,则大多数情况下映射端口号为最小的端口号,即映射端口号是不可预测的。
  举例: [1000-2000] 映射到[1000-2000]时会一一映射
   [1000-2000] 映射到[3000-4000]结果不可预知,一般会映射到3000端口。

难道我真的就要这样复制上千行?!

最后编辑:2021年06月02日 ©著作权归作者所有

发表评论

正在加载 Emoji