Пофигу)
решил жёстко указать, чтобы не было сюрпризов.
В конфиг kresd.conf дописал:
policy.add(
policy.all(
policy.TLS_FORWARD({{'1.1.1.1@853', hostname='cloudflare-dns.com'}}),
policy.TLS_FORWARD({{'8.8.8.8@853', hostname='dns.google'}}),
policy.TLS_FORWARD({{'1.0.0.1@853', hostname='cloudflare-dns.com'}}),
policy.TLS_FORWARD({{'8.8.4.4@853', hostname='dns.google'}})
)
)
И в конфиге wireguard эти адреса исключил. Всё работает, как надо
И да, тут часто спрашивали, как сделать реализацию работы антизапрета для работы через wireguard. Да, это возможно, я у себя сделал, работает без проблем. Для мобильных и слабых устройств wireguard более предпочтителен, т.к. не кушает батарею - он просто не поддерживает коннект, сколько пакетов отправил - столько батареи на это и скушал.
Но тут и минус большой - в конфиге wg жёстко прописывается DNS сервер (который за туннелем wg) - и если какие-то проблемы с удалённым сервером, либо интернет каналом между клиентом и сервером - то вообще никак интернет работать на этом устройстве не будет, т.к. wireguard не предполагает проверки канала (как openvpn - если сервер недоступен, то соединение просто разорвётся и переназначенный удалённый dns просто сбросится). С wg ситуация будет такая - сервер недоступен - значит и dns недоступен.
Для тех, кому всё-же вариант работы через wg интересен, алгоритм такой:
- на том сепвере, на котором запускаем контейнер (но не в самом контейнере) назначаем доп IP адрес на сетевой карте, статика, адрес брать из диапазона, который не используется в инфраструктуре (далее буду писать на своём примере, у меня дебиан 11), в моём случае в файле /etc/network/interfaces:
#Additional IP
auto ens192:0
iface ens192:0 inet static
address 172.31.31.1
netmask 255.255.255.0
- на этом же сервере изменяем dns сервер по умолчанию, в файле /etc/resolf.conf прописываем:
nameserver 172.31.31.1
- Делаем маппинг портов сервера dns вовнутрь контейнера:
lxc config device add antizapret-vpn proxy_53_udp proxy listen=udp:172.31.31.1:53 connect=udp:127.0.0.1:53
lxc config device add antizapret-vpn proxy_53_tcp proxy listen=tcp:172.31.31.1:53 connect=tcp:127.0.0.1:53
- берём клиентский конфиг openvpn (я взял udp вариант), изменяем там адрес сервера на локалхост, также изменяю имя устройства на tun1 (у меня tun0 на том сервере уже использовалось для других целей) у меня получилось так (показываю лишь фрагмент, без раздела с ключами):
nobind
client
remote 127.0.0.1
remote-cert-tls server
dev tun1
proto udp
resolv-retry infinite
persist-key
persist-tun
setenv FRIENDLY_NAME "AntiZapret VPN UDP"
comp-lzo
status /var/log/openvpn/myvpn-status.log
log /var/log/openvpn/myvpn-server.log
log-append /var/log/openvpn/myvpn-server.log
# Keys
создаём systemd сервис с этим конфигом, ставим в автозагрузку
Перезагружаем.
Этими действиями мы сделали следующее - сам сервер, на котором запущен контейнер - теперь выходит в интернет используя DNS, работающий в этом контейнере.
Доп. IP адрес, который создавали - на нём теперь висит DNS сервер, работающий внутри контейнера. Адес этот нужен для того, чтобы его в дальнейшем указать в качестве DNS в клиентских конфигурациях wireguard.
Ну и wg конфиг сервера (это мой, нужно править под себя):
[Interface]
Address = 172.30.30.253/24
ListenPort = 443
PrivateKey = 2HzqsLYMf8RMbrhqLVkoMJghjkhBVlyB1+jfsFefO3k=
PostUp = iptables -A FORWARD -i wg1 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE; iptables -t nat -A POSTROUTING -o wg1 -j MASQUERADE; iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg1 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE; iptables -t nat -D POSTROUTING -o wg1 -j MASQUERADE; iptables -t nat -D POSTROUTING -o tun1 -j MASQUERADE
# client peer config 1
[Peer]
PublicKey = Ad0kcRSdsRjhf7pk7czy87X2o3sFfEpiTmDorZ7PFq0=
AllowedIPs = 172.30.30.251/32
Конфиг клиента:
[Interface]
PrivateKey = 3Onw2+iGnbUEoI2HbNys+NkN5d666clZWSw3x1olxHY=
Address = 172.30.30.251/32
DNS = 172.31.31.1
[Peer]
PublicKey = 2aAOFShy1ZjiI02gpAENIh2uvkTT7zZy7zw8xvSEdw3=
AllowedIPs = 10.224.0.0/15, 68.171.224.0/19, 74.82.64.0/19, 103.246.200.0/22, 178.239.88.0/21, 185.104.45.0/24, 193.105.213.36/30, 203.104.128.0/20, 203.104.144.0/21, 203.104.152.0/22, 172.31.31.1/32
Endpoint = vps.servername.zyx:443
В итоге - всё работает, незаблокированные адреса открываются напрямую, заблокированные резолвятся в фейковые адреса из подсети 10.224.0.0/15 и идут через туннель.
В AllowedIPs клиента включена подменная подсеть 10.224.0.0/15, адрес DNS 172.31.31.1/32 и остальные подсети, которые выводились в таблице маршрутизации на vps сервере при поднятом туннеле антизапрета. Предназначение их я не знаю, включил в конфиг wireguard просто так как они присутствуют в таблице маршрутизации при включенном туннеле openvpn.
Схема рабочая, но не для всех - для каждого клиента нужно создавать отдельный конфиг руками. Если сервер свой, делается для себя и устройств немного - то такой вариант имеет право на жизнь.
P.S.
п. 2 можно не делать, если сервер vps за бугром. Просто у меня он в РФ и мне даже для самого сервера надо обходить блокировки. Сам контейнер - на нём тоже поставил wireguard и весь трафик контейнера завернул за бугор, через ещё один vps