我有一个HTTP服务器监听端口8080(http)和8081(https)在127.0.0.1
我有这些iptables规则redirect从/到$external_ip :
iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 80 -j DNAT --to-destination 127.0.0.1:8080 iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 443 -j DNAT --to-destination 127.0.0.1:8081
服务器是使用apache APR库来处理https连接的Tomcat实例。
有什么我失踪?
更新:表NAT的链:$ iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 1111 packets, 69838 bytes) pkts bytes target prot opt in out source destination 14 724 REDIRECT tcp -- eno1 * 0.0.0.0/0 101.0.105.178 tcp dpt:80 redir ports 8080 6 360 REDIRECT tcp -- eno1 * 0.0.0.0/0 101.0.105.178 tcp dpt:443 redir ports 8081 Chain INPUT (policy ACCEPT 1064 packets, 66008 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 9 packets, 596 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 9 packets, 596 bytes) pkts bytes target prot opt in out source destination
我可以看到你的规则是正确的。 通过防火墙拦截stream量的可能性已经得到validation,正如您所评论的那样。 如iptables -t nat -L -n -v输出中显示的字节和数据包计数器所示,NAT规则已被多次命中。
您需要确保您可以在本地访问端口443,并且可以使用netstat -lnpvalidation您的Web服务器是否正在侦听此端口。
解决方法 (sorting)
iptables,Tomcat或Apache APR不喜欢从回送接口进行侦听。
我终于通过使用除了lo (127.0.0.1)以外的接口来工作,
iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 80 -j DNAT --to-destination $local_ip:8080 iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 443 -j DNAT --to-destination $local_ip:8081
我的情况我使用了一个虚拟接口(linux module: dummy ),因为我希望Tomcat从“private”ip“听”。
我发布这个答案,为未来与我有同样问题的人,但我不把这个答案作为接受的答案,因为我既没有解决使用环回的问题,也没有解释为什么它的工作原理罚款与http,但不与https 。