今天遇到一个需求,需要在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端口。
难道我真的就要这样复制上千行?!
「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」
(๑>ڡ<)☆谢谢老板~
使用微信扫描二维码完成支付