AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 785091
Accepted
Alexander Farber
Alexander Farber
Asked: 2016-06-21 09:52:47 +0800 CST2016-06-21 09:52:47 +0800 CST 2016-06-21 09:52:47 +0800 CST

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

  • 772

在 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仍然断开

centos port-forwarding jetty iptables centos7
  • 2 2 个回答
  • 5250 Views

2 个回答

  • Voted
  1. Best Answer
    Dmitry Ilyin
    2016-06-21T11:49:03+08:002016-06-21T11:49:03+08:00

    它会是这样的:

    *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 服务时都会保存规则

    • 4
  2. Alexander Farber
    2016-06-22T10:27:42+08:002016-06-22T10:27:42+08:00

    我想我终于弄明白了——NAT HOWTO说,这-j REDIRECT只是将-j DNAT目标地址作为接口之一的捷径:

    目标 NAT 有一个特殊的情况,称为重定向:这是一种简单的方便,完全等同于对传入接口的地址进行 DNAT。

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

    (对不起,我没有提到它,因为我认为这无关紧要)。

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

    并且在eth0:18080 端口运行 Jetty(不能删除 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
    
    • 0

相关问题

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • 持续监控许多服务器运行状况的简单方法?

  • Hudson 无法在 tomcat5 中启动

  • CentOS 的依赖挑战

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve