我有一个服务运行在Azure的Ubuntu 16.04虚拟机上的localhost:8111 ,我试图将端口80上的外部stream量转发到localhost:8111 。 然而,外部stream量正在被拒绝,我不明白我做错了什么。
在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
这样做之后,我可以通过curl http://localhost:80validation端口是否在Ubuntu VM中运行 ,并通过curl http://example.org使用外部地址。
但是,我无法从互联网上访问http://example.org 。
我有一个Azure Network Interface连接到虚拟机,设置为10.0.1.5,它有一个静态的公共IP, IP Forwarding设置为enabled 。 它连接到一个NSG,允许any来源和any目的地的端口80上的stream量
我认为这应该工作—我不明白我做错了什么。
这是iptables -t nat --list的输出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
还有一个我们需要做的改变:
sysctl -w net.ipv4.conf.all.route_localnet=1
默认情况下,这个值是0,它指示内核不发送目的地址为127.0.0.0/8的外部stream量。 这只是为了安全,因为这样的stream量是不正常的。
iptables的规则是这样的:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8111
这是我的testing:
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
结果如下:
希望这可以帮助。