Redsocks не работает с Wireguard, но работает с OpenVPN

Резюме

Я использую VPN для маршрутизации всего моего трафика. До недавнего времени я использовал OpenVPN, но потом перешел на Wireguard. К сожалению, это сломало мою настройку Redsocks, и я не могу понять, почему.

Я использую redsocks, потому что я использую программу командной строки, которая не поддерживает использование прокси-сервера SOCKS, но мне нужно, чтобы эта программа прошла через туннель SOCKS SSH.

Настраивать

Обзор:

no-socks-program -> iptables nat -> redsocks -> ssh -> destination
  1. Программа, не поддерживающая Socks, запускается с группой 1001.
  2. Iptables соответствует группе и ПЕРЕНАПРАВЛЯЕТ на порт 1533, где слушает redsocks
  3. Redsocks соксифицирует и перенаправляет на 1533, где прослушивается SSH
  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, затем перенаправьте на порт 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
  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. Конфигурация SSH для прослушивания на 1533:
    Host socksify
        User me
        Hostname intermediate
        DynamicForward 1533

И это работает при использовании OpenVPN, но ломается при использовании Wireguardи я слишком глуп, чтобы понять, почему.

Единственная разница, которую я могу различить между ними, это маршрутизация и параметр ядра. net.ipv4.conf.all.src_valid_mark который установлен на 1 по wg-quick но не OpenVPN.

Маршрутизация для Wireguard (красные носки не работают):

> 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. Я попытался заменить redsocks с tun2socks от badvpn, но это точно такая же проблема. Так что это не redsocks кто сломался.
  2. Я включил трассировку iptables следующим образом:

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

и я вижу SYN, SYN-ACK, ACK при использовании OpenVPN, но только SYN при использовании Wireguard. Нет ACK.

  1. Я использовал Wireshark для OpenVPN и Wireguard и сравнил их. В трафике OpenVPN я вижу то же самое, что и в трассировке iptables, обычный SYN, SYN-ACK, ACK. Но, и это интересно, при использовании Wireguard я вижу SYN, RST-ACK:

OpenVPN обычный TCP:

OpenVPN

Wireguard SYN тогда RST:

Wireguard

(10.2.0.2 мой wg0 ИП и 10.89.2.21 мой tun0 ИП.)

Вопрос

Почему 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 и я не знаю, что они имеют в виду, но это вполне может быть проблемой.

linux iptables маршрутизация openvpn wireguard

Патрик

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *