如何让本地生成的数据包通过PREROUTING链?

问题描述 投票:0回答:1

我希望本地生成的数据包通过 PREROUTING 链,因为我想使用

sudo iptables -t mangle -A PREROUTING -p tcp -d somewebsite.com -j TPROXY --on-port 32794

将所有前往 somewesite.com 的数据包(由本地进程生成)重定向到本地端口 32794。

很多人建议这样做:

sudo iptables -t nat -A OUTPUT -p tcp -d somewebsite.com -j REDIRECT --to-ports 32794

但是REDIRECT会修改数据包头,这是我试图避免的。我必须使用 TPROXY,它是唯一不修改数据包标头的目标类型。

那么我该怎么做才能让本地生成的数据包通过PREROUTING链呢?也许使用环回?但我也不确定环回是否会更改数据包标头...

linux networking proxy iptables
1个回答
0
投票

您可以通过使用 fwmark 标记“输出”数据包并为这些数据包添加环回路由来实现此目的:

路线

echo "200 proxy_loopback" > /etc/iproute2/rt_tables.d/proxy.conf
# these need to be configured persistend (maybe use an interface up-hook)
ip rule add fwmark 200 table proxy_loopback
ip -6 rule add fwmark 200 table proxy_loopback
ip route add local 0.0.0.0/0 dev lo table proxy_loopback
ip -6 route add local ::/0 dev lo table proxy_loopback
# can be checked using:
ip rule list
ip -6 rule list
ip -d route show table all

# you might need to enable local routing:
sysctl -w net.ipv4.conf.all.route_localnet=1
# you might want to block 127.0.0.1 on non loopback interfaces if you enable it:
iptables -t raw -A PREROUTING ! -i lo -d 127.0.0.0/8 -j DROP
iptables -t mangle -A POSTROUTING ! -o lo -s 127.0.0.0/8 -j DROP

IP 表

MARK_PROXY=200
MARK_DONE=201

iptables -t mangle -N PROXY_SESSION
iptables -t mangle -A PROXY_SESSION -j MARK --set-mark "$MARK_PROXY"
iptables -t mangle -A PROXY_SESSION -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket -j PROXY_SESSION

iptables -t mangle -N PROXY_REDIRECT
iptables -t mangle -A PROXY_REDIRECT -p tcp -m mark --mark "$MARK_DONE" -j RETURN 
iptables -t mangle -A PROXY_REDIRECT -p tcp -d "$PROXY_EXCLUDE_NET" -j RETURN
iptables -t mangle -A PROXY_REDIRECT -p tcp -j TPROXY --tproxy-mark "$MARK_PROXY/$MARK_PROXY" --on-ip 127.0.0.1 --on-port "$PROXY_PORT" 
iptables -t mangle -A PREROUTING -p tcp -j PROXY_REDIRECT
iptables -t mangle -A PREROUTING -m mark --mark "$MARK_DONE" -j CONNMARK --save-mark

iptables -t mangle -N OUTPUT_LOOP
iptables -t mangle -A OUTPUT_LOOP -m owner --uid-owner "$PROXY_UID" -j RETURN
iptables -t mangle -A OUTPUT_LOOP -m owner --uid-owner "$PROXY2_UID" -j RETURN
iptables -t mangle -A OUTPUT_LOOP -p tcp -m mark --mark "$MARK_DONE" -j RETURN 
iptables -t mangle -A OUTPUT_LOOP -p tcp -d "$PROXY_EXCLUDE_NET" -j RETURN
iptables -t mangle -A OUTPUT_LOOP -p tcp -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A OUTPUT_LOOP -p tcp -j MARK --set-mark "$MARK_PROXY"

iptables -t mangle -A OUTPUT -m connmark --mark "$MARK_DONE" -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -p tcp -j OUTPUT_LOOP
iptables -t mangle -A OUTPUT -m mark --mark "$MARK_DONE" -j MARK --set-mark 0

其他信息可以在这里找到:

© www.soinside.com 2019 - 2024. All rights reserved.