概括

概括

概括

我使用 VPN 来路由我的所有流量。直到最近,我还在使用 OpenVPN,但后来改用了 Wireguard。不幸的是,这破坏了我的 redsocks 设置,我不知道为什么。

我使用 redsocks 是因为我正在使用的命令行程序不支持使用 SOCKS 代理 - 但我需要该程序通过 SOCKS SSH 隧道。

设置

概述:

no-socks-program -> iptables nat -> redsocks -> ssh -> destination
  1. 不支持 Socks 的程序随组 1001 启动
  2. Iptables 匹配该组并重定向到 redsocks 正在监听的端口 1533
  3. Redsocks 进行 socks 化并重定向到 SSH 正在监听的 1533
  4. SSH 用于DynamicForward转发到目标服务器

细节:

  1. 匹配组1001和内部目的地(我启动了我想与该组一起进行的程序,目的地在 10/8):
    iptables -t nat -A OUTPUT -d 10.0.0.0/8 -m owner --gid-owner 1001 -j REDSOCKS
  1. 然后在 redsocks 链中,过滤掉常见的东西和 10.2/16,因为那是 wireguard 网关所在的位置,然后重定向到 redsocks 正在监听的端口 59375:
    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
  1. Redsocks 配置,监听 59375,重定向到 1533,SSH 在此监听:
    redsocks {
        local_ip = 127.0.0.1;
        local_port = 59375;
        ip = 127.0.0.1;
        port = 1533;
        type = socks5;
    }
  1. 用于监听 1533 的 SSH 配置:
    Host socksify
        User me
        Hostname intermediate
        DynamicForward 1533

使用 OpenVPN 时可以正常工作,但使用 Wireguard 时就会中断,而我却太笨了,不知道为什么。

我能看出两者之间的唯一区别是路由和内核参数,该参数由OpenVPNnet.ipv4.conf.all.src_valid_mark设置但不由 OpenVPN 设置。1wg-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

已采取的故障排除步骤

  1. 我尝试redsockstun2socksbadvpn 替换,但问题还是一样。所以问题不在于redsocks谁坏了。
  2. 我像这样打开 iptables 跟踪:

sudo iptables -t raw -A OUTPUT -d 10.89.0.0/16 -p tcp -m tcp --dport 443 -j TRACE

我在使用 OpenVPN 时会看到SYNSYN-ACK,但仅在使用 Wireguard 时才会看到。 没有。ACKSYNACK

  1. 我使用 Wireshark 来查看 OpenVPN 和 Wireguard,并对它们进行了比较。在 OpenVPN 流量中,我看到与 iptables 跟踪中相同的内容,即正常的SYNSYN-ACKACK。但是,有趣的是,当使用 Wireguard 时,我看到SYNRST-ACK

OpenVPN 正常 TCP:

OpenVPN

SYN然后Wireguard RST

Wireguard

10.2.0.2是我的wg0IP,10.89.2.21是我的tun0IP。)

问题

为什么 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路由

0.0.0.0/1, 128.0.0.0/1按照Wireguard 中的设置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

答案1

使用AllowedIPs = 0.0.0.0/0wg-quick在 Linux 上触发一种特殊情况,添加特殊策略路由防火墙规则。这些规则旨在强制所有非 LAN† 流量通过 WireGuard 接口,同时防止路由循环。但这与您的 redsocks 设置相冲突(这看起来像是循环的开始,因为它将出站流量发送回本地套接字)。

使用AllowedIPs = 0.0.0.0/1, 128.0.0.0/1是一种不会触发此特殊情况的替代方法。它还会通过 WireGuard 接口发送所有非 LAN† 流量,但仅依赖您现有的路由规则来防止 WireGuard 流量通过 WireGuard 接口回环。

因此,您可以通过在 WireGuard 配置中替换AllowedIPs = 0.0.0.0/0来修复 redsocks 与 WireGuard 的冲突。AllowedIPs = 0.0.0.0/1, 128.0.0.0/1

但是,如果您没有任何现有的路由规则来覆盖远程 WireGuard 端点,则需要为其单独添加路由。如果端点的 IP 地址是198.51.100.123,并且您的 LAN 的默认网关是192.168.1.1,并且通过您的wlp3s0接口连接,则需要添加如下规则:

ip route add 198.51.100.123 via 192.168.1.1 dev wlp3s0

† 并非严格意义上的非 LAN 流量 —— 实际上是主机自己的路由表中未明确列出的任何内容(通常仅包括 LAN 流量的路由)。

相关内容