我有一台 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 添加一些技巧。
答案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 而不是原始客户端路由流量。