HTTP iptable PREROUTING 规则不起作用
HTTP iptable PREROUTING rule is not working
我正在尝试了解 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时需要注意本地包和网络包的区别。
本地数据包是在本地机器上创建的数据包,而网络数据包是接收到的数据包。 PREROUTING
适用于网络数据包,例如您将在路由器设备上获得的数据包。由于在这种情况下它都是本地的,因此必须使用 OUTPUT
而不是 PREROUTING
来重定向数据包。
因此,必要的规则是。
iptables -t nat -A OUTPUT -p tcp --dport 4567 -j REDIRECT --to 8443
我发现这张图片很有用:
我正在尝试了解 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时需要注意本地包和网络包的区别。
本地数据包是在本地机器上创建的数据包,而网络数据包是接收到的数据包。 PREROUTING
适用于网络数据包,例如您将在路由器设备上获得的数据包。由于在这种情况下它都是本地的,因此必须使用 OUTPUT
而不是 PREROUTING
来重定向数据包。
因此,必要的规则是。
iptables -t nat -A OUTPUT -p tcp --dport 4567 -j REDIRECT --to 8443
我发现这张图片很有用: