Centos

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

  • June 21, 2016

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

關於為非根使用者設置埠 80 訪問的 Jetty 文件建議執行以下命令:

# 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

我需要將傳入 123.123.123.123:80 的 HTTP 連接重定向到 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仍然斷開

它會是這樣的:

*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-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 服務時都會保存規則

引用自:https://serverfault.com/questions/785091