iptables 端口重定向不适用于本地主机

Chr*_*ris 58 linux firewall iptables port-forwarding

我想将所有流量从端口 443 重定向到内部端口 8080。我正在为 iptables 使用此配置:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080
Run Code Online (Sandbox Code Playgroud)

这适用于所有外部客户。但是如果我试图从同一台机器访问端口 443,我会收到连接被拒绝的错误。

wget https://localhost
Run Code Online (Sandbox Code Playgroud)

如何扩展 iptables 规则以重定向本地流量?

And*_*ndy 75

环回接口不使用 PREROUTING,您还需要添加一条 OUTPUT 规则:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080
Run Code Online (Sandbox Code Playgroud)

  • 为了竞争,我添加了初始规则,因为他也希望外部流量重定向。如果他们只说接受所有 IP,则该规则不需要源/目标 (9认同)
  • 不需要第一条规则。本地生成的数据包不通过 PREROUTING 链。 (3认同)

小智 12

要将数据包从本地主机重定向到另一台机器,规则:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port
Run Code Online (Sandbox Code Playgroud)

将工作,但您还需要在内核中启用此选项:

sysctl -w net.ipv4.conf.all.route_localnet=1
Run Code Online (Sandbox Code Playgroud)

没有那个内核设置它就行不通。


Kha*_*led 2

您说您收到连接拒绝错误。这意味着没有本地进程正在侦听您尝试连接的端口!要检查监听进程,请使用以下命令:

$ sudo netstat -lnp | grep 8080
Run Code Online (Sandbox Code Playgroud)

应用规则后,您应该有一个进程侦听端口 8080 以进行连接。

看来你应该有以下规则:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080
Run Code Online (Sandbox Code Playgroud)

请记住,您是从本地主机发送的。因此,您需要重定向输出数据包。