Назад | Перейти на главную страницу

CGroup для маршрутизации приложений с iptables не работает

Сценарий использования:

Клиент Shadowsocks ---> Сервер Shadowsocks (работает на VPS A) ---> Wireguard VPN (работает на VPS A) ---> Wireguard VPN (работает на VPS B)

По сути, я пытаюсь настроить зашифрованный прокси-сервер socks5, который выходит на VPS B, но по очевидным причинам не весь трафик должен проходить через VPN. Итак, на ум приходит политическая маршрутизация.

Текущее состояние:

  1. Оба VPS работают под управлением Debian 10;
  2. Сам Shadowsocks Server работает, может просматривать веб-сайты через него;
  3. Wireguard VPN сам работает, может пинговать частные адреса друг друга с обоих VPS;
  4. Когда я запускаю ss-server с помощью cgexec, сервер может принимать клиентские соединения, но не может разрешать доменные имена, поэтому не работает;
  5. Пинг тоже не работает при запуске через cgexec.

Испытательная установка:

На VPS A:

3 сетевых интерфейса: ens3 (с публичным IP), lo (127.0.0.1), wg1 (10.88.88.2).

cgcreate -g net_cls:ss-server
echo 0x100001 > /sys/fs/cgroup/net_cls/ss-server/net_cls.classid
iptables -t mangle -N ss-server
iptables -t mangle -A ss-server -p tcp -m tcp --sport 8388 -j RETURN
iptables -t mangle -A ss-server -p udp -m udp --sport 8388 -j RETURN
iptables -t mangle -A ss-server -j MARK --set-mark 10
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x100001 -j ss-server
iptables -t nat -A POSTROUTING -o wg1 -j MASQUERADE
echo "10 ss-server" >> /etc/iproute2/rt_tables
ip rule add fwmark 10 table ss-server
ip route add default via 10.88.88.2 table ss-server
cgexec -g net_cls:ss-server ss-server -c /etc/shadowsocks-libev/config.json -v -d 8.8.8.8

config.json:

{
    "server":"0.0.0.0",
    "mode":"tcp_and_udp",
    "server_port":8388,
    "local_port":1080,
    "password":"redacted",
    "timeout":60,
    "method":"chacha20-ietf-poly1305"
}

НА VPS B:

4 сетевых интерфейса: eth0 (общедоступный, но с частным IP-адресом хостинг-провайдера), lo (127.0.0.1), wg0 (10.7.3.1, в данном случае не используется), wg1 (10.88.88.1)

iptables -t nat -A POSTROUTING -s 10.88.88.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 10.88.88.0/24 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j TCPMSS --clamp-mss-to-pmtu

net.ipv4.ip_forward = 1 в /etc/sysctl.conf

Наблюдения:

  1. Выполнение «tcpdump -n -i wg1» на VPS B показало, что существует огромная задержка между ss-сервером, отправляющим DNS-запросы, и их прибытием на VPS B, и поступают только некоторые запросы;
  2. На VPS A были применены правила iptables:
root@vultr:~# iptables -vL -t mangle
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 1810 1181K ss-server  all  --  any    any     anywhere             anywhere             cgroup 1048577

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain ss-server (1 references)
 pkts bytes target     prot opt in     out     source               destination
   48  1944 RETURN     tcp  --  any    any     anywhere             anywhere             tcp spt:8388
    0     0 RETURN     udp  --  any    any     anywhere             anywhere             udp spt:8388
 1762 1179K MARK       all  --  any    any     anywhere             anywhere             MARK set 0xa
root@vultr:~# iptables -vL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    7   513 MASQUERADE  all  --  any    wg1     anywhere             anywhere

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination