____________________________ ____________________________ | Host | | Client | | Public IP: 66.66.66.66 | | | | Internal IP: 10.0.3.1 | <---------> | Internal IP: 10.0.3.192 | ---------------------------- ----------------------------
vethnetworking选项开始。 ufw ,并且相应的端口被打开并转发到客户端,这是可行的。 iptables端口转发在/etc/ufw/before.rules :
# nat Table rules *nat :PREROUTING ACCEPT [0:0] -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192:80 -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192:443 # don't delete the 'COMMIT' line or these rules won't be processed COMMIT
主机上的/etc/network/interfaces :
# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 66.66.66.66 netmask 255.255.255.0 network 66.66.66.0 broadcast 66.66.66.255 gateway 66.66.66.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 8.8.8.8
客户端上的/etc/network/interfaces :
# The loopback network interface auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 10.0.3.192 netmask 255.255.255.0 gateway 10.0.3.1 broadcast 10.0.3.255
从客户端扫描
Starting Nmap 5.21 ( http://nmap.org ) at 2014-04-18 18:46 CEST Nmap scan report for 66.66.66.66 Host is up (0.00011s latency). PORT STATE SERVICE 80/tcp closed http 443/tcp closed https
从“外部”扫描端口
Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-18 19:54 CEST Nmap scan report for 66.66.66.66 Host is up (0.41s latency). PORT STATE SERVICE 80/tcp open http 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 1.28 seconds
iptablesconfiguration:
$ iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere anywhere tcp dpt:http to:10.0.3.192:80 DNAT tcp -- anywhere anywhere tcp dpt:https to:10.0.3.192:443 DNAT tcp -- anywhere anywhere tcp dpt:43211 to:10.0.3.192:22 DNAT tcp -- anywhere anywhere tcp dpt:http-alt to:10.0.3.192:8080 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE tcp -- anywhere 10.0.3.192 tcp dpt:http MASQUERADE tcp -- anywhere 10.0.3.192 tcp dpt:https MASQUERADE all -- 10.0.3.0/24 !10.0.3.0/24
我想从客户端通过公共IP访问端口80上的Web服务器,例如
$ curl http://66.66.66.66 curl: (7) couldn't connect to host
应该给出相同的结果
$ curl http://10.0.3.192 <html>.....
奇怪$ ping 66.66.66.66从私人networking内的客户端工作,虽然。
我发现这个问题与所谓的Hairpin NAT / Loopback NAT非常相关,尽pipe我不能用以下规则来configuration伪装,这样它就可以工作(在PREROUTING条目之后的/etc/ufw/before.rules ) :
# nat Table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -o eth0 -d 10.0.3.192 -p tcp --dport 80 -j MASQUERADE -A POSTROUTING -o eth0 -d 10.0.3.192 -p tcp --dport 443 -j MASQUERADE # don't delete the 'COMMIT' line or these nat table rules won't be processed COMMIT
我对解决scheme的猜测是桥接networking或者仅仅是我无法正确地适应MASQUERADE规则到我的设置是问题。 任何build议和意见,也是一般的设置,表示赞赏。
(我首先写的是这是一个路由networking,不是一个桥接networking,现在我看到它使用LXC,所以我不知道,但如果PREROUTING已经工作了,我确信希望我下面写的是可行的)
您正在使用PREROUTING链,这个链只会改变(即将)路由的数据包,即来自其他地方的数据包。 在主机上生成的数据包不会被路由(它们只是…输出,因为任何主机都可以),所以这个链路永远不会收到curl的数据包。 curl试图像往常一样在主机上连接。 还有一个链接来捕获本地生成的数据包:OUTPUT。
所以,你也可以将DNAT规则复制到(-t nat)OUTPUT链,做一些修改:OUTPUT不需要input接口。 用-o lo ! -s 127.0.0.0/8replace-i eth0 -o lo ! -s 127.0.0.0/8 -o lo ! -s 127.0.0.0/8或只是-d 66.66.66.66或别的东西,但你需要一些限制,否则任何networking请求到任何地方都会去客户端 。 第一个例子是独立于主机的IP,第二个是短的,只要你喜欢。 这不是一个错字,如果你连接到66.66.66.66,它是一个本地数据包,所以它通过lo接口。 但是,因为类似127.0.0.1的目的地不能被重新路由( curl http://127.0.0.1/会超时,而不是说不能连接),127.0.0.0/8被置为exception。
就是这样。 其他一切和往常一样由conntrack处理。 您应该删除2端口特定的MASQUERADE规则。 他们不需要,他们甚至可能会干扰(我认为如果他们工作,结果是, 客户端将始终看到主机作为Web服务器上的源)
所以,简短的答案是(使用-t nat):
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192 -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192 -A OUTPUT -o lo ! -s 127.0.0.0/8 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192 -A OUTPUT -o lo ! -s 127.0.0.0/8 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192