以下是我使用redsocks并iptables从 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 机器上的进程(例如浏览器)“透明”,我执行了以下操作:
redsocks与 SOCKS5 服务器通信,用于处理 SOCKS5 协议。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。我的想法如下:
经过一些测试,我遇到了以下问题:
REDSOCKS链被钩在OUTPUT链上)我想为 Windows 机器做的首先是 SNAT,然后是 REDIRECT,但是当 SNAT 发生在 POSTROUTING 钩子上时,似乎太晚了(在数据包处理流程中)让它由 PREROUTING/OUTPUT 钩子处理.. .
这里有出路吗?
PS 1. 我找到了一个可行的解决方案(在我自己的回复中),虽然我真的不明白它为什么有效。
PS 2.我开始寻找到的源代码redsocks,有一件事我迄今发现的是,redsocks使用getsockopt(,SO_ORIGINAL_DST,)DNAT之前获得目标地址。我不清楚的是下面的处理,以及从redsocks. 不知道有没有redsocks实现的介绍...
我找到了一个不需要 SNAT 的解决方案:
redsocks听192.168.1.2而不是127.0.0.1,通过改变/etc/redsocks.confREDIRECT --to-ports 12345中所有规则中的目标更改REDSOCKS为DNAT --to-destination 192.168.1.2:12345目标PREROUTING链中添加规则以通过链处理“来自 Windows 的 youtube 绑定流量” REDSOCKS:/sbin/iptables -t nat -A PREROUTING -d $youtube -s $win10 -j REDSOCKS192.168.1.2通过更多的学习和测试,我想我知道为什么新配置有效,以及为什么以前的配置无效。
首先是以下行为REDIRECT:
REDIRECT是127.0.0.1REDIRECT是不是 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 机器。
在这一点上,对我来说,似乎每条信息都融合在一起:)