Резюме
Я использую VPN для маршрутизации всего моего трафика. До недавнего времени я использовал OpenVPN, но потом перешел на Wireguard. К сожалению, это сломало мою настройку Redsocks, и я не могу понять, почему.
Я использую redsocks, потому что я использую программу командной строки, которая не поддерживает использование прокси-сервера SOCKS, но мне нужно, чтобы эта программа прошла через туннель SOCKS SSH.
Настраивать
Обзор:
no-socks-program -> iptables nat -> redsocks -> ssh -> destination
- Программа, не поддерживающая Socks, запускается с группой 1001.
- Iptables соответствует группе и ПЕРЕНАПРАВЛЯЕТ на порт 1533, где слушает redsocks
- Redsocks соксифицирует и перенаправляет на 1533, где прослушивается SSH
- SSH использует
DynamicForward
перенаправить на целевой сервер
Подробности:
- Группа соответствия
1001
и внутренние направления (я запускаю программу, которую хочу соксифицировать с этой группой, и назначения находятся в 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, перенаправляет на 1533, где слушает SSH:
redsocks {
local_ip = 127.0.0.1;
local_port = 59375;
ip = 127.0.0.1;
port = 1533;
type = socks5;
}
- Конфигурация 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
Предпринятые действия по устранению неполадок
- Я попытался заменить
redsocks
сtun2socks
от badvpn, но это точно такая же проблема. Так что это неredsocks
кто сломался. - Я включил трассировку 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
.
- Я использовал Wireshark для OpenVPN и Wireguard и сравнил их. В трафике OpenVPN я вижу то же самое, что и в трассировке iptables, обычный
SYN
,SYN-ACK
,ACK
. Но, и это интересно, при использовании Wireguard я вижуSYN
,RST-ACK
:
OpenVPN обычный TCP:
Wireguard SYN
тогда RST
:
(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
Патрик