redirect端口8080到端口80 – 如何添加/ etc / sysconfig / iptables文件?

在CentOS 7 Linux上(充当LAMP–而不是“防火墙/网关”)我创build了一个自定义的systemd服务 ,以用户nobody身份在8080端口运行embedded式Jetty。

 [Unit] Description=WebSocket Handler Service After=network-online.target [Service] Type=simple User=nobody Group=nobody ExecStart=/usr/bin/java -classpath '/usr/share/java/jetty/*' de.afarber.MyHandler 123.123.123.123:8080 ExecStop=/bin/kill ${MAINPID} SuccessExitStatus=143 [Install] WantedBy=multi-user.target 

但是实际上我需要服务器在端口80上进行监听 – 这样即使通过企业防火墙,WebSocket的连接也能正常工作。

设置非root用户的端口80访问 Jetty文档build议运行以下命令:

 # iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

幸运的是我已经在我的专用服务器上使用了iptables-services包,当前的/etc/sysconfig/iptables文件包含:

 *filter :INPUT DROP :FORWARD DROP :OUTPUT ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 25,80,443,8080 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 2/min --limit-burst 1 -j ACCEPT COMMIT 

我的问题是,我不知道上述文件正确的PREROUTING语法。

我试过运行上面的命令,然后iptables -S希望iptables会列出我需要的行 – 但是没有发生。

更新:

不幸的是,下面的/etc/sysconfig/iptables文件不起作用:

 *nat :INPUT ACCEPT :OUTPUT ACCEPT :PREROUTING ACCEPT :POSTROUTING ACCEPT -A PREROUTING -p tcp -m tcp --dst 123.123.123.123 --dport 80 -j REDIRECT --to-ports 8080 COMMIT *filter :INPUT ACCEPT :OUTPUT ACCEPT :FORWARD ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A INPUT -p tcp -m tcp -m state --state NEW -m multiport --dports 25,80,443,8080 -j ACCEPT -A INPUT -p tcp -m tcp -m state --state NEW --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 2/min --limit-burst 1 -j ACCEPT -A FORWARD -p tcp -m tcp --dst 123.123.123.123 --dport 8080 -j ACCEPT COMMIT 

我需要传入的HTTP连接123.123.123.123:80被redirect到123.123.123.123:8080(其中Jetty正在监听用户“nobody”),但由于某种原因,这不会发生。

当我浏览到http://123.123.123.123:8080然后我看到docker响应。

但是,当我浏览到http://123.123.123.123连接被拒绝。

任何人都可以为我发现错误吗?

这是我目前的nat表:

 # iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- anywhere afarber.de tcp dpt:http redir ports 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 

这是我目前的filter表:

 # iptables -t filter -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere icmp any ACCEPT tcp -- anywhere anywhere tcp state NEW multiport dports smtp,http,https,webcache ACCEPT tcp -- anywhere anywhere tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN state NEW limit: avg 2/min burst 1 Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere afarber.de tcp dpt:webcache Chain OUTPUT (policy ACCEPT) target prot opt source destination 

在这里我的/etc/sysctl.conf文件:

 net.ipv4.ip_forward=1 net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 

问题: -d 123.123.123.123 --dport 80请求没有被redirect到8080

更新2:

该行也没有帮助:

 -A PREROUTING -p tcp -m tcp -i eth0:1 --dst 123.123.123.123 --dport 80 -j DNAT --to-destination :8080 

123.123.123.123:80的连接仍然被丢弃

这将是这样的:

 *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [3:353] :POSTROUTING ACCEPT [3:353] -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080 COMMIT # Completed on Mon Jun 20 23:41:41 2016 

你知道怎么做简单的方法吗? 我假设你已经禁用了firewalld并安装了iptables服务,因为你想让你的centos7作为centos6工作。

“/ etc / sysconfig / iptables”是iptables-services保存规则的文件。 你可以编辑它manualy,但没有必要。 您可以使用“iptables”命令input任何规则,然后使用“service iptables save”将当前活动的规则保存到文件中。

你也可以这样做,以便在每次通过设置“/ etc / sysconfig / iptables-config”IPTABLES_SAVE_ON_STOP和IPTABLES_SAVE_ON_RESTART来重新设置iptables服务时保存规则

我想我终于明白了 – NAT HOWTO说, -j REDIRECT只是目标地址是接口之一的-j DNAT的快捷方式:

有一种称为redirect的目的地NAT的特殊情况:这是一个简单的方便,正好相当于对input接口的地址做DNAT。

但在我的情况下,这是行不通的,因为我的CentOS 7服务器有4个IP地址。

(对不起,我没有提到,因为我不认为这很重要)。

eth0端口80上运行Apache(可以删除根权限)。

eth0:1端口8080运行Jetty(不能删除根权限)。 但是我需要在80端口使用Jetty(所以websockets为代理服务器上的公司用户),我希望它作为用户“nobody”运行。

现在我已经知道了如何在/etc/sysctl.conf中使用net.ipv4.ip_forward=1和下面的/ etc / sysconfig / iptablesredirect传入的请求:

 *filter :INPUT DROP :OUTPUT ACCEPT :FORWARD ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -p tcp -m state --state NEW -m multiport --dports 25,80,443,8080 -j ACCEPT -A INPUT -p tcp -m state --state NEW --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 2/min --limit-burst 1 -j ACCEPT COMMIT *nat :INPUT ACCEPT :OUTPUT ACCEPT :PREROUTING ACCEPT :POSTROUTING ACCEPT -A PREROUTING -p tcp --dst 123.123.123.123 --dport 80 -j DNAT --to-destination 123.123.123.123:8080 COMMIT