如何强制 VPN 用户流量通过 SOCKS5 代理?

如何强制 VPN 用户流量通过 SOCKS5 代理?

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

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

这向你展示了它是如何工作的:

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

这些是我的 IP 表:

*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

剧本 ”设置 ipsec-vpn”用于制作VPN。

所以我的问题是:如何更改这些 IP 表以丢弃所有 VPN 客户端的出站数据包,除非它在 ​​Raspberry Pi 上使用 SOCKS5 代理(:1080)

答案1

我刚刚在那里回答了它。基本上,您需要将所有 TCP 重定向到 socks 客户端 + 为 DNS\udp 添加一些技巧。

https://askubuntu.com/questions/980819/create-a-vpn-connection-which-connects-to-a-socks-server/1423292#1423292

答案2

答案在一定程度上取决于您是否配置您的客户端。

换句话说,您是否希望 SOCKS 代理是明确的,还是透明的?

如果您可以将客户端应用程序配置为使用显式代理,那么它应该足够简单(尽管您可能希望让您的 SOCKS 在VPN 接口上监听 - 或者创建 DNAT 规则)。

-A INPUT -s 192.168.1.0/24 -d 192.168.1.1 -m tcp -p tcp --dport 1080 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j DROP
-A FORWARD -s 192.168.1.0/24 -j DROP

如果您想要一个透明的代理,我认为可能值得考虑引入 haproxy。

haproxy 博客文章提供了如何设置透明绑定的概述,这听起来可能适合您的用例。

在这种情况下,您可能会发现使用隧道模式的 SSH 比使用 SOCKS 更容易(或者在 Pi 和网关之间添加另一个 VPN 连接)。

我认为,现在导致您的“问题”的具体规则是这个:

-A FORWARD -i ppp+ -o eth+ -j ACCEPT

更一般地说,似乎您可能需要重写防火墙规则来实现您想要的效果。

答案3

就像您的图一样,您的 Rasperri Pi 既是 L2TP 服务器,又是 SSH 代理客户端。因此,问题在于一旦建立 L2TP 隧道,如何将所有出站流量路由到隧道中。如果您使用选项设置 SSH 代理,则它与您的 SSH 代理无关masquerade,这意味着来自其客户端的所有流量都将被 Rasperri Pi 本身的 IP 伪装,因此 SSH 代理服务器认为它只为 Rasperri Pi 而不是原始客户端路由流量。

相关内容