为什么端口转发在此设置下不起作用?

为什么端口转发在此设置下不起作用?

我正在尝试设置 docker 虚拟化环境。这是问题。

我有一个虚拟 eth0:0 接口,我想使用 iptables 转发它。

公共主 IP 是 93.93.93.93

故障转移 IP 为 5.6.7.8

我有一台配置了 IP 别名的服务器:

/etc/网络/接口

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 93.93.93.93
        netmask 255.255.255.0
        network 93.93.93.0
        broadcast 93.93.93.255
        gateway 93.93.93.254

# IPFO 1
    post-up /sbin/ifconfig eth0:0 5.6.7.8 netmask 255.255.255.255 broadcast 5.6.7.8
    pre-down /sbin/ifconfig eth0:0 down

这样,当我从外部 ping eth0:0 时,它就可以正常工作了。看来问题可能出在路由上?

root@aldebaran:~# ip route
default via 93.93.93.254 dev eth0 
93.93.93.0/24 dev eth0  proto kernel  scope link  src 94.23.55.226 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1 

没有 eth0.0 的迹象

然后我添加 iptables 规则:

iptables -A PREROUTING -t nat -i eth0:0 -p tcp --dport 80 -j DNAT --to 172.17.0.2:80
iptables -A FORWARD -p tcp -d 172.17.0.2 --dport 80 -j ACCEPT

然后我尝试

root@aldebaran:~# curl 172.17.0.2:80
WORKS!
root@aldebaran:~# curl IP_FAILOVER
curl: (7) Failed to connect to IP_FAILOVER port 80: Connection refused

根据教程中,我没有正确设置路由。这样对吗?我该如何修复?

答案1

问题是我使用了 IP 别名,这会创建一个 Iptables 无法使用的接口。Eth0:0 不是有效目标。我应该改用:

iptables -t nat -I PREROUTING --dst 5.6.7.8 -p tcp --dport 80 -j DNAT --to 172.17.0.2:80
iptables -A FORWARD -p tcp -d 172.17.0.2 --dport 22 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.17.0.2 -j MASQUERADE

相关内容