如何强制 VPN 客户端仅通过本地 SOCKS5 代理?

如何强制 VPN 客户端仅通过本地 SOCKS5 代理?

我有一个 Raspberry Pi,它与远程服务器 (VPS) 建立 SSH 连接并在 Pi 上打开一个端口,以便我可以将其用作 SOCKS5 代理。这是我用来建立隧道的命令:

ssh -D 1080 -f -C -q -N user@hostname

原因是网络阻止使用 DPI 的 VPN,但不阻止 SSH。所以我在 LAN 上设置了 VPN 并设置了 SOCKS5 代理(相同的 Pi)。问题是,如果代理关闭,则 VPN 出站流量(因此不再是 VPN 流量,而只是常规 HTTP(S))将不会使用它,并尝试通过网络防火墙发送这些请求。我想阻止这种情况发生,这样如果代理关闭,VPN 将不允许任何出站连接。

这向您展示了它应该如何工作

                        ______________________________
                       |                              |
                       |            Client            |
                       |______________________________|
                                       |
                                       | L2TP over IPSEC
                       ________________|_______________ __ 
                      |                                |  |
                      |       VPN (192.168.1.XXX)      |  |
                      |________________________________|  |
                       ________________|_______________   |-RaspberryPi
                      |                                |  | 
                      |    SOCKS5 (127.0.0.1:1080)     |  |
                      |________________________________|__|
                                       |
                                       | SSH tunnel
                       ________________|________________
                      |                                 |
                      |         VPS (Amazon EC2)        |
                      |_________________________________|
                                       |
                                      / \
                                     /   \
                                  the internet 

这些是我的 iptables:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.42.0/24 -o eth+ -j MASQUERADE
-A POSTROUTING -s 192.168.43.0/24 -o eth+ -m policy --dir out --pol none -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol none -j DROP
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m multiport --dports 500,4500 -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -j DROP
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -i eth+ -o ppp+ -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ppp+ -o eth+ -j ACCEPT
-A FORWARD -s 192.168.42.0/24 -d 192.168.42.0/24 -i ppp+ -o ppp+ -j ACCEPT
-A FORWARD -d 192.168.43.0/24 -i eth+ -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.43.0/24 -o eth+ -j ACCEPT
-A FORWARD -j DROP
COMMIT

这是用于制作 VPN 的脚本https://github.com/hwdsl2/setup-ipsec-vpn

所以我的问题是:如何更改这些 iptables 以强制 VPN 客户端仅使用 LAN 上的 SOCKS5 代理? (否则丢弃其非代理目的地数据包)

答案1

你正在寻找的东西叫做透明代理。透明代理旨在放置在网关上,但并非必须如此;只要数据包通过节点路由(如您的示例中所示),您就可以iptables在该节点上使用将其流量重定向到该节点上为您处理代理的任何进程。

在 Google 上快速搜索“透明袜子代理”会出现一个名为红袜队。你可以尝试一下;您将在同一节点上运行sshSOCKS5 会话和实例,并将流量传递到.链接网站上的说明看起来相当完整,可以帮助您继续操作。redsocksredsocksssh

相关内容