
Я использую маршрутизатор GL.inet с OpenWRT OpenWrt 19.07.8 r11364-ef56c85848.
Я настроил сервер Wireguard на удаленной машине. При неподключенном VPN я могу получить доступ к этому серверу из своей локальной сети, используя его публичный IP. При подключенном VPN я могу получить доступ к нему по внутреннему IP, но больше не могу получить доступ к нему по внешнему IP с компьютера в своей локальной сети.
Traceroute показывает, что пакеты не проходят через маршрутизатор, и нет маршрута к хосту:
~ % ping 35.190.161.xxx
PING 35.190.161.169 (35.190.161.xxx): 56 data bytes
92 bytes from router.local.wan (192.168.1.254): Destination Host Unreachable
Однако если я подключусь к маршрутизатору по ssh, он не только покажет ожидаемую маршрутизацию, но и ping-запросы и traceroute будут выполнены успешно:
~# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 100.64.0.1 0.0.0.0 UG 0 0 0 wan
10.66.66.0 * 255.255.255.0 U 0 0 0 wg0
34.120.255.244 * 255.255.255.255 UH 0 0 0 wan
35.190.161.xxx 100.64.0.1 255.255.255.255 UGH 0 0 0 wan
100.64.0.0 * 255.192.0.0 U 0 0 0 wan
192.168.0.0 * 255.255.252.0 U 0 0 0 br-lan
~# ping 35.190.161.xxx
PING 35.190.161.xxx (35.190.161.xxx): 56 data bytes
64 bytes from 35.190.161.xxx: seq=0 ttl=59 time=243.335 ms
Моя конфигурация Wireguard для этого клиента:
[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxlMxuhwtB9vV2Gpks=
Address = 10.66.66.3/32,fd42:42:42::3/128
DNS = 8.8.8.8,8.8.4.4
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxkIIPFsO2/EuXDNbeR3g=
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxYnnXy4CZUMUzGBAieqU=
Endpoint = 35.190.161.xxx:60242
AllowedIPs = 10.66.66.0/24,::/0
В то время как яможетЧтобы получить доступ к удаленному серверу (например, через ssh), используя внутренний IP, неудобно выбирать правильный адрес в зависимости от того, установлен VPN или нет.
Чего-то не хватает в моей конфигурации Wireguard или есть какая-то другая проблема?
решение1
Недавно я тоже столкнулся с этой проблемой. Я обнаружил, что мой роутер добавляет IP-правило для IP-адреса сервера (таблица 31):
снимок экрана из таблицы маршрутизации LUCI
root@GL-MT300N-V2:~# ip rule
0: from all lookup local
31: from all fwmark 0x60000/0x60000 lookup 31
1001: from all iif eth0.2 lookup 1
2001: from all fwmark 0x100/0x3f00 lookup 1
2061: from all fwmark 0x3d00/0x3f00 blackhole
2062: from all fwmark 0x3e00/0x3f00 unreachable
32766: from all lookup main
32767: from all lookup default
Если я включу клиент Wireguard, а затем вручную удалю это правило с помощью ip rule del from all fwmark 0x60000/0x60000 lookup 31
команды, я смогу выполнить ping/ssh из локальной сети на IP-адрес сервера Wireguard напрямую.
Я нашел несколько мест, где это правило добавлено:
/etc/init.d/wireguard
/etc/vpn.user
Я закомментировал строки с командами добавления правила IP, и теперь я могу включать и выключать клиент Wireguard и по-прежнему иметь доступ к WAN IP:
#fix ddns conflict
#local DDNS=$(iptables -nL -t mangle | grep WG_DDNS)
#local lanip=$(uci get network.lan.ipaddr)
#local gateway=${lanip%.*}.0/24
#if [ -z "$DDNS" ];then
#iptables -t mangle -N WG_DDNS
#iptables -A WG_DDNS -t mangle -i br-lan -s $gateway -d $publicip -j MARK --set-mark 0x60000
#iptables -t mangle -I PREROUTING -j WG_DDNS
#ip rule add fwmark 0x60000/0x60000 lookup 31 pref 31
#ip route add $publicip dev wg0 table 31
#fi
Обратите внимание, что я не эксперт в маршрутизации и не знаю, ломает ли этот хак что-нибудь (в комментариях написано «исправить конфликт ddns» — не уверен, что это значит), но у меня он работает нормально и ничего не ломает (я использую подключение Wireguard только для доступа к удаленной сети). Также я не эксперт в OpenWRT, поэтому не могу гарантировать, что эти изменения сохранятся при перезагрузках маршрутизатора.