【问题标题】:HTTP iptable PREROUTING rule is not workingHTTP iptable PREROUTING 规则不起作用
【发布时间】:2020-11-10 12:30:41
【问题描述】:

我正在尝试了解 iptables,但似乎根本无法重定向流量。目标是将流量从端口 4567 重定向到 8443,并让(本地)程序监听后者。

我编写了一个简短的脚本,以确保每次更改规则时刷新并重新启动 iptables:

#!/bin/bash

iptables -t nat -F

iptables -t nat -A PREROUTING -p tcp --dport 4567 -j REDIRECT --to-ports 8443
sudo /sbin/iptables-save                                                   

我还设置了 ip_forwarding(虽然我不完全确定是否需要):

sudo echo "1" > /proc/sys/net/ipv4/ip_forward

我正在运行这个简单的 python 脚本来测试路由。该网站允许在任何端口上进行 http 请求。

import requests
r = requests.get("http://portquiz.net:4567")
print(r.status_code)

以及通过查看iptables -t nat --list -v 的输出来检查是否有任何数据包/字节通过预路由

Chain PREROUTING (policy ACCEPT 4 packets, 560 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REDIRECT   tcp  --  any    any     anywhere             anywhere             tcp dpt:4567 redir ports 8443

iptables 和 python 脚本都在同一台机器上(我的笔记本电脑)。 python请求似乎没有问题,并且似乎没有被预路由策略拦截。

我在最新的 ubuntu 20.02 上运行

这是iptables-save 的输出,如果有用的话:

# Generated by iptables-save v1.8.4 on Tue Nov 10 13:20:02 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 4567 -j REDIRECT --to-ports 8443
COMMIT
# Completed on Tue Nov 10 13:20:02 2020
# Generated by iptables-save v1.8.4 on Tue Nov 10 13:20:02 2020
*filter
:INPUT ACCEPT [16727:8538288]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [16979:3211690]
COMMIT
# Completed on Tue Nov 10 13:20:02 2020

【问题讨论】:

    标签: iptables nat


    【解决方案1】:

    在使用 iptables 时,需要密切注意本地数据包和网络数据包之间的关系。 本地数据包是在本地机器上创建的数据包,而网络数据包是接收到的数据包。 PREROUTING 适用于网络数据包,例如您将在路由器设备上获得的数据包。由于在这种情况下它都是本地的,因此必须使用OUTPUT 而不是PREROUTING 来重定向数据包。 因此,必要的规则是。

    iptables -t nat -A OUTPUT     -p tcp --dport 4567 -j REDIRECT --to 8443
    

    我发现这张图很有用:

    来自这篇文章: https://danielmiessler.com/study/iptables/

    【讨论】:

    • 我认为缺少一个重要的细节:-o lo:iptables -t nat -A OUTPUT -p tcp -o lo --dport 4567 -j REDIRECT --to 8443 因为否则所有针对端口“4567”的传出连接都将被重定向到端口“8443”。将 OUTPUT 与 -o lo 一起使用只会将连接从 localhost 重定向到 localhost。
    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多