redsocks + iptables 行为

bru*_*uin -4 linux iptables

以下是我使用redsocksiptables从 LAN 访问 youtube的测试台的网络拓扑,前提是我在Linux和之间建立了 ssh 动态转发VPS

                         |
                 outside | inside firewall
                         |
                         |        LAN 192.168.1.0/24
                         |        ----+--------------------+-----------
                         |            |.2                  | .3
            +-----+      |     +------+----+          +----+----+
            |     |      |     |           |          |         |
Youtube <-->| VPS <============>   Linux   |          | Windows |
            |     |      |     |           |          |         |
            +-----+      |     +-----------+          +---------+
                         |
                         |
Run Code Online (Sandbox Code Playgroud)

Linux box 和 Windows box 在防火墙内的同一个 LAN 上,这阻止了对 Youtube 的任何访问。VPS 在防火墙之外,可以访问 Youtube。在 Linux 机器中,我可以ssh -D到 VPS,使 VPS 充当 SOCKS5 代理。

为了进一步使 SOCKS5 代理对 Linux 机器上的进程(例如浏览器)“透明”,我执行了以下操作:

  • 运行 SOCKS5 客户端软件redsocks与 SOCKS5 服务器通信,用于处理 SOCKS5 协议。
  • 添加一些 iptable 规则,以引导 youtube 绑定的流量进行 redsocks处理

这适用于 Linux 机器本身:

echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -F -t nat
/sbin/iptables -t nat -X REDSOCKS
/sbin/iptables -t nat -N REDSOCKS
/sbin/iptables -t nat -A OUTPUT -d $YOUTUBE -j REDSOCKS
/sbin/iptables -t nat -A REDSOCKS -p TCP -d $YOUTUBE -j REDIRECT --to-ports $REDSOCKS_PORT
/sbin/iptables -t nat -A REDSOCKS -p UDP -d $YOUTUBE -j REDIRECT --to-ports $REDSOCKS_PORT
/sbin/iptables -t nat -A REDSOCKS -p ICMP -d $YOUTUBE -j REDIRECT --to-ports $REDSOCKS_PORT
/sbin/iptables -t nat -A REDSOCKS -j RETURN
Run Code Online (Sandbox Code Playgroud)

现在我想让 Windows box 也通过一些软件配置“透明地”访问 Youtube。我的想法如下:

  • 更改 Windows 机器上的路由表,以便所有 Youtube 绑定的流量都将路由到 Linux 机器 (192.168.1.2)
  • 以“某种方式”设置 iptables 以对来自 Windows 的 Youtube 绑定流量执行 SNAT

经过一些测试,我遇到了以下问题:

  • REDIRECT(或 DNAT)目标仅适用于 PREROUTING/OUTPUT 钩子(例如,在 redsocks 的 iptable 设置中,REDSOCKS链被钩在OUTPUT链上)
  • SNAT(或 MASQUERADE)目标仅适用于 POSTROUTING 钩子

我想为 Windows 机器做的首先是 SNAT,然后是 REDIRECT,但是当 SNAT 发生在 POSTROUTING 钩子上时,似乎太晚了(在数据包处理流程中)让它由 PREROUTING/OUTPUT 钩子处理.. .

这里有出路吗?

PS 1. 我找到了一个可行的解决方案(在我自己的回复中),虽然我真的不明白它为什么有效。

PS 2.我开始寻找到的源代码redsocks,有一件事我迄今发现的是,redsocks使用getsockopt(,SO_ORIGINAL_DST,)DNAT之前获得目标地址。我不清楚的是下面的处理,以及从redsocks. 不知道有没有redsocks实现的介绍...

bru*_*uin 6

我找到了一个不需要 SNAT 的解决方案:

  • redsocks192.168.1.2而不是127.0.0.1,通过改变/etc/redsocks.conf
  • 将链REDIRECT --to-ports 12345中所有规则中的目标更改REDSOCKSDNAT --to-destination 192.168.1.2:12345目标
  • PREROUTING链中添加规则以通过链处理“来自 Windows 的 youtube 绑定流量” REDSOCKS/sbin/iptables -t nat -A PREROUTING -d $youtube -s $win10 -j REDSOCKS
  • 在 Windows 上添加一个路由条目以将 youtube 绑定的流量路由到 192.168.1.2

通过更多的学习和测试,我想我知道为什么新配置有效,以及为什么以前的配置无效。

首先是以下行为REDIRECT

  • 对于面向本地的流量,后面的新目标 IP 地址REDIRECT127.0.0.1
  • 外部交通,新的目标IP地址后REDIRECT不是 127.0.0.1,但192.168.1.2

这就是为什么以前的配置不起作用的原因,因为在以前的配置中,redsocks侦听127.0.0.1,但是 iptables 重定向到192.168.1.2.

新配置允许redsocks监听192.168.1.2并明确用于DNAT将本地生成的和外部流量的目标更改为192.168.1.2,因此它可以工作。

我还测试了另一个配置,几乎与第二个配置相同,但让redsocks监听127.0.0.1,并使用DNAT显式设置目标 ip 到127.0.0.1. 这样,外部生成的流量将直接发送到127.0.0.1,内核将其视为火星数据包。我还需要设置/proc/sys/net/ipv4/conf/eth0/route_localnet为 1,然后它适用于 Windows 机器。

在这一点上,对我来说,似乎每条信息都融合在一起:)