我在 Azure 上的 Ubuntu 16.04 VM 上运行了一个服务localhost:8111
,我正尝试将端口 80 上的外部流量转发到localhost:8111
。但是,外部流量被拒绝,我看不出我做错了什么。
在 Ubuntu VM 上,我编辑/etc/sysctl.conf
并取消注释了此行:
net.ipv4.ip_forward=1
重新启动后,我在 iptables 中添加了以下内容,以便可以从内部和外部访问端口 80:
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8111
$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8111
完成此操作后,我可以验证端口是否正常工作在 Ubuntu VM 中使用curl http://localhost:80
并通过使用外部地址curl http://example.org
。
但是,我无法http://example.org
从互联网访问。
我将 AzureNetwork Interface
连接到虚拟机,设置为 10.0.1.5,它有一个静态公共 IP,并IP Forwarding
设置为enabled
。它连接到一个 NSG,允许端口 80 上的any
源和any
目标流量
我认为这应该可行---我看不出我做错了什么。
以下是 的输出iptables -t nat --list
:
~$ sudo iptables -t nat --list
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8111
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8111
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
答案1
我们还需要做另外一项更改:
sysctl -w net.ipv4.conf.all.route_localnet=1
默认情况下,该值为 0,指示内核不路由发往 127.0.0.0/8 的外部流量。这只是为了安全,因为这样的流量并不正常。
iptables 规则如下:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8111
这是我的测试:
Ubuntu 16.04:
私有 IP 地址:10.0.1.4
公有 IP 地址:104.41.185.158
apache2 监听本地主机端口 8111
root@jasonvm:/etc/apache2# netstat -ant | grep 8111
tcp 0 0 127.0.0.1:8111 0.0.0.0:* LISTEN
结果如下:
希望这可以帮助。