将端口 8080 重定向到端口 80 - 如何在 /etc/sysconfig/iptables 文件中添加?

将端口 8080 重定向到端口 80 - 如何在 /etc/sysconfig/iptables 文件中添加?

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

[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 连接也能正常工作。

Jetty 文档为非 root 用户设置端口 80 访问权限建议运行以下命令:

# 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 重定向到 123.123.123.123:8080(其中 Jetty 以用户“nobody”的身份监听),但由于某种原因,这并没有发生。

当我浏览到http://123.123.123.123:8080然后我看到了 Jetty 的回应。

但当我浏览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未重定向到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仍然断开

答案1

它会是这样的:

*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

你知道如何轻松完成吗?我假设你已经禁用了防火墙并安装了 iptables-services,因为你希望 centos7 能够像 centos6 一样工作。

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

您还可以通过在此处设置“/etc/sysconfig/iptables-config”IPTABLES_SAVE_ON_STOP 和 IPTABLES_SAVE_ON_RESTART,使每次 iptables 服务重新启动时都保存规则

答案2

我想我终于明白了——NAT 指南说,这-j REDIRECT只是一个快捷方式,-j DNAT其目标地址是接口之一:

目标 NAT 有一个特殊的情况,称为重定向:它是一种简单的便利,完全相当于对传入接口的地址执行 DNAT。

但就我而言,这根本行不通,因为我的 CentOS 7 服务器有 4 个 IP 地址。

(很抱歉,我没有提及此事,因为我认为这并不重要)。

eth0端口 80 上运行 Apache(可以放弃 root 权限)。

Jetty在eth0:1端口 8080 上运行(无法放弃 root 权限)。但我需要在端口 80 上运行 Jetty(以便 websockets 能够为代理后面的企业用户工作),并且我希望它以用户“nobody”的身份运行。

现在我已经弄清楚了如何net.ipv4.ip_forward=1使用 /etc/sysctl.conf 以及以下 /etc/sysconfig/iptables 重定向传入请求:

*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

相关内容