概括
我使用 VPN 来路由我的所有流量。直到最近,我还在使用 OpenVPN,但后来改用了 Wireguard。不幸的是,这破坏了我的 redsocks 设置,我不知道为什么。
我正在使用 redsocks,因为我正在使用不支持使用 SOCKS 代理的命令行程序 - 但我需要该程序通过 SOCKS SSH 隧道。
设置
概述:
no-socks-program -> iptables nat -> redsocks -> ssh -> destination
- 不支持袜子的程序与组 1001 一起启动
- iptables 匹配组并重定向到 redsocks 正在侦听的端口 1533
- Redsocks socksify 并重定向到 SSH 正在监听的 1533
- SSH 用于
DynamicForward
转发到目标服务器
细节:
- 匹配组
1001
和内部目的地(我启动了我想用这个组进行 sockify 的程序,目的地在 10/8):
iptables -t nat -A OUTPUT -d 10.0.0.0/8 -m owner --gid-owner 1001 -j REDSOCKS
- 然后在 redsocks 链中,过滤掉通常的东西和 10.2/16,因为那是wireguard 网关所在的位置,然后重定向到端口 59375,redsocks 正在侦听该端口:
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 100.64.0.0/10 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 198.18.0.0/15 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 10.2.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 59375
- Redsocks 配置,监听 59375,重定向到 SSH 监听的 1533:
redsocks {
local_ip = 127.0.0.1;
local_port = 59375;
ip = 127.0.0.1;
port = 1533;
type = socks5;
}
- 用于监听 1533 的 SSH 配置:
Host socksify
User me
Hostname intermediate
DynamicForward 1533
这在使用 OpenVPN 时有效,但在使用 Wireguard 时会中断,而且我太愚蠢了,无法弄清楚原因。
我可以在两者之间做出的唯一区别是路由和内核参数,由OpenVPNnet.ipv4.conf.all.src_valid_mark
设置但不是由 OpenVPN 设置的。1
wg-quick
Wireguard 的路由(redsocks 不工作):
> sudo ip rule
0: from all lookup local
32764: from all lookup main suppress_prefixlength 0
32765: not from all fwmark 0xca6c lookup 51820
32766: from all lookup main
32767: from all lookup default
> sudo ip route show table all
default dev wg0 table 51820 scope link
default via 192.168.1.1 dev wlp3s0 proto dhcp metric 600
192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.205 metric 600
local 10.2.0.2 dev wg0 table local proto kernel scope host src 10.2.0.2
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
local 192.168.1.205 dev wlp3s0 table local proto kernel scope host src 192.168.1.205
broadcast 192.168.1.255 dev wlp3s0 table local proto kernel scope link src 192.168.1.205
> ip route get 10.89.2.21
10.89.2.21 dev wg0 table 51820 src 10.2.0.2 uid 1000
cache
OpenVPN 的路由(redsocks 正在工作):
> sudo ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
> sudo ip route show table all
0.0.0.0/1 via 10.30.0.1 dev tun0
default via 192.168.1.1 dev wlp3s0 proto dhcp metric 600
10.30.0.0/16 dev tun0 proto kernel scope link src 10.30.0.14
128.0.0.0/1 via 10.30.0.1 dev tun0
192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.205 metric 600
local 10.30.0.14 dev tun0 table local proto kernel scope host src 10.30.0.14
broadcast 10.30.255.255 dev tun0 table local proto kernel scope link src 10.30.0.14
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
local 192.168.1.205 dev wlp3s0 table local proto kernel scope host src 192.168.1.205
broadcast 192.168.1.255 dev wlp3s0 table local proto kernel scope link src 192.168.1.205
> ip route get 10.89.2.21
10.89.2.21 via 10.39.0.1 dev tun0 src 10.39.0.13 uid 1000
cache
采取的故障排除步骤
- 我尝试用 badvpn 替换
redsocks
,tun2socks
但这是完全相同的问题。所以不是redsocks
谁坏了。 - 我像这样打开 iptables 跟踪:
sudo iptables -t raw -A OUTPUT -d 10.89.0.0/16 -p tcp -m tcp --dport 443 -j TRACE
我在使用 OpenVPN 时看到SYN
, SYN-ACK
,ACK
但仅SYN
在使用 Wireguard 时才看到。没有ACK
。
- 我将 Wireshark 用于 OpenVPN 和 Wireguard 并进行了比较。在 OpenVPN 流量中,我看到与 iptables 跟踪中相同的内容,正常的
SYN
,SYN-ACK
,ACK
. 但是,有趣的是,在使用 Wireguard 时,我看到了SYN
,RST-ACK
:
OpenVPN 普通 TCP:
线卫SYN
然后RST
:
(10.2.0.2
是我的wg0
IP,10.89.2.21
也是我的tun0
IP。)
问题
为什么 redsocks 可以使用 OpenVPN 而不是 Wireguard,我需要做什么才能使其正常工作?
我很高兴提供更多信息。
更新
我发现 OpenVPN 和 Wireguard 之间的另一个区别。我wg-quick
用来设置 Wireguard 连接,并且该实用程序用于nftables
设置一些规则。他们来了:
table ip wg-quick-wg0 {
chain preraw {
type filter hook prerouting priority raw; policy accept;
iifname != "wg0" ip daddr 10.2.0.2 fib saddr type != local drop
}
chain premangle {
type filter hook prerouting priority mangle; policy accept;
meta l4proto udp meta mark set ct mark
}
chain postmangle {
type filter hook postrouting priority mangle; policy accept;
meta l4proto udp meta mark 0x0000ca6c ct mark set meta mark
}
}
我对它们的了解为零,nftables
也不知道它们是什么意思,但这很可能是问题所在。
设置 0/1 路由
在 Wireguard 中设置,0.0.0.0/1, 128.0.0.0/1
以AllowedIPs
将路由与 OpenVPN 匹配,导致根本无法访问互联网。这是具有该设置的路由表:
> sudo ip route show table all
0.0.0.0/1 dev wg0 scope link
default via 192.168.1.1 dev wlp3s0 proto dhcp metric 600
128.0.0.0/1 dev wg0 scope link
192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.205 metric 600
local 10.2.0.2 dev wg0 table local proto kernel scope host src 10.2.0.2
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
local 192.168.1.205 dev wlp3s0 table local proto kernel scope host src 192.168.1.205
broadcast 192.168.1.255 dev wlp3s0 table local proto kernel scope link src 192.168.1.205
> ip route get 10.89.2.21
10.89.2.21 dev wg0 src 10.2.0.2 uid 1000
cache
AllowedIPs = 0.0.0.0/0
在 Linux上使用wg-quick会触发添加特殊策略路由和防火墙规则的特殊情况。这些规则旨在强制所有非 LAN† 流量通过 WireGuard 接口,同时防止路由循环。但这与您的 redsocks 设置冲突(它看起来像是循环的开始,因为它将出站流量发送回本地套接字)。Using
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1
是一种不会触发这种特殊情况的替代方法。它还通过 WireGuard 接口发送所有非 LAN† 流量,但仅依靠您现有的路由规则来防止 WireGuard 流量通过 WireGuard 接口环回。AllowedIPs = 0.0.0.0/0
因此,您可以通过在 WireGuard 配置中替换为来解决与 WireGuard 的 redsocks 冲突AllowedIPs = 0.0.0.0/1, 128.0.0.0/1
。但是,如果您没有任何现有的路由规则覆盖您的远程 WireGuard 端点,则需要单独为其添加路由。如果端点的 IP 地址是
198.51.100.123
,并且您的 LAN 的默认网关是192.168.1.1
,通过您的wlp3s0
接口连接,您需要添加如下规则:† 严格来说不是非 LAN 流量——实际上是主机自己的路由表中未明确列出的任何内容(通常只包括 LAN 流量的路由)。