我有一台 Linux 机器,并且在同一台机器上运行着一个代理服务器,监听 127.0.0.1:1080。我想用iptables
它实现:
- 对于所有通过端口 1080 发出的 HTTP(S) 请求,直接连接而不进行任何处理
- 对于来自其他端口的所有 HTTP(S) 请求,通过 127.0.0.1:1080 进行代理
- 传入的请求未被触及并正常接收
您可能想知道为什么我将传出请求代理到自身,这是因为代理服务器还进行混淆和其他一些奇特的操作。
我读过很多答案,但大多数答案只对通过/发送到某些特定端口(例如 80)的请求感兴趣,而我想要除一个端口之外的所有端口。
我知道我可以使用类似的命令
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination 127.0.0.1:1080
但我猜这可能只是导致自路由循环。
在这个博客,作者提供了解决方案
如果你想在与服务器相同的机器上运行客户端(你在咖啡店里用你的笔记本电脑;给我吃点糕点),我们不能使用 PREROUTING 表,因为它只适用于来自以下地址的数据包:外部。我们可以做的是修改客户端进程输出的数据包的目标端口。问题是它也会影响 mitmproxy 输出的数据包,我们将陷入路由循环。
可能有多种方法可以解决这个问题,但对我有用的方法是以 root 身份运行 mitmproxy,并使 iptables 规则不适用于 root 拥有的进程。
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner root --dport 443 -j REDIRECT --to-port 8080
-m owner
:加载所有者模块。! –uid-owner root
:规则不适用于 root 拥有的进程
但我的机器上只有一个用户root
,我无意为此创建另一个用户。
顺便说一句,我不确定/proc/sys/net/ipv4/ip_forward
在这种情况下是否需要设置为 1。
您可以假设操作系统是新安装的 Ubuntu 20.04。
编辑:澄清“流量”是指 HTTP 请求。
答案1
# Enable routing
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
# Enable forwarding to loopback interface
sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1
# Forward all TCP except TCP/1080
iptables -t nat -A OUTPUT -p tcp ! --dport 1080 -j DNAT --to-destination 127.0.0.1:1080
# Enable NAT (aka Masqurade)
sudo iptables -t nat -A POSTROUTING -j MASQUERADE