使用 iptables 将所有端口的传出流量代理到单个本地端口

使用 iptables 将所有端口的传出流量代理到单个本地端口

我有一台 Linux 机器,并且在同一台机器上运行着一个代理服务器,监听 127.0.0.1:1080。我想用iptables它实现:

  1. 对于所有通过端口 1080 发出的 HTTP(S) 请求,直接连接而不进行任何处理
  2. 对于来自其他端口的所有 HTTP(S) 请求,通过 127.0.0.1:1080 进行代理
  3. 传入的请求未被触及并正常接收

您可能想知道为什么我将传出请求代理到自身,这是因为代理服务器还进行混淆和其他一些奇特的操作。

我读过很多答案,但大多数答案只对通过/发送到某些特定端口(例如 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

相关内容