VPN
Предназначен прежде всего для настройки 'прозрачного' VPN на роутере.
Схема аналогична работе https://bitbucket.org/anticensority/antizapret-vpn-container/src/master/
Различия:
- Используется Wireguard вместо Openvpn. Второй нужно имплементировать в общий образ (возможно будет сделано, возможно нет).
- В связи с этим используется общая подсеть 10.224.0.0 вместо двух (клиентской и для запросов обхода), для этого был модифицирован python скрипт, который теперь выдает адреса для обхода начиная с 10.224.0.100 (10.224.0.2-10.224.0.99 - клиенты).
- Используется docker вместо lxc
Для установки на VPS - docker-compose up -d
(требуются дополнительные тесты на разных ОС, проверялось на ubuntu 20.04, за основу было взято решение Wireguard от linuxserver.io, но вместо сборки WG из исходников устанавливается пакет)
На keenetic используется dnsmasq и dnscrypt-proxy2. Первый нужен для блокировки рекламы и для более плавной работы в случаях обрыва соединения с ВПН, второй нужен для шифрования DNS запросов при выключенном ВПН.
В dnsmasq включен последовательный резолв ВПН, dnscrypt и серверов провайдера по цепочке. Если недоступен первый сервер, используется следующий. Скрипты, которые следят за интерфейсом ВПН, через некоторое время после отключения убирают его из конфигов dnsmasq.
opkg install dnscrypt-proxy2 dnsmasq iptables ca-certificates cron
Если нет ndm - то установить его
-
Скопировать файлы из
keenetic/opt/*
из репозитория в аналогичные директории opkg раздела. Они позволят перенаправлять DNS запросы к внутреннему резолверу при включении интерфейса и убирать перенаправление при его выключении, файл из netfilter предотвращает очистку перенаправления при срабатывании хуков ndm. Интерфейс выбирается исходя из подсети автоматически (должна быть 10.224.0.0/15).
/opt/etc/init.d/S56dnsmasq restart
/opt/etc/init.d/S09dnscrypt-proxy2 restart
- Сконфигурировать wireguard клиент в web интерфейсе роутера, где приватный ключ (для peer1) -
/opt/wireguard/config/peer1/privatekey-peer1
, публичный ключ сервера -/opt/wireguard/config/server/publickey-server
. Адрес -10.224.0.2/15
.
По-умолчанию запросы на не заблокированные сайты перенаправляются через DoT на сторонние резолверы, т.к. некоторые NS в РФ тормозят при запросе через резолв с самой VPS, пока конфигурацию можно менять через конфиг knot-resolver. На заблокированные идут без шифрования на 1.1.1.1, поведение меняется переменной (есть в docker-compose)
WG_INTERNAL_SUBNET:-10.224.0.0/15
На роутере:
opkg install shadowsocks-libev-ss-tunnel shadowsocks-libev-config
vi /opt/etc/shadowsocks.json
{
"server": "{server-ip}",
"mode":"tcp_and_udp",
"server_port": "{server-port:-51830}",
"local_address": "127.0.0.1",
"local_port": "{local-port:-51830}",
"password": "{password}",
"timeout":300,
"method":"chacha20-ietf-poly1305",
"tunnel_address": "127.0.0.1:{wireguard-port:-51820}"
}
{password}
- генерируется при первом старте контейнера, можно взять в volumes/shadowsocks/p
{server-ip}
- ip адрес сервера на котором крутится wireguard и ss
{local-port}
- любой свободный порт на роутере, который мы будем указывать в настройках wg соединения, например 51822
{wireguard-port}
- это порт на котором на сервере крутится wg соединение, например 51820
vi /opt/etc/init.d/S22shadowsocks
меняем на строку
PROCS=ss-*
на
PROCS=ss-tunnel
перезапускаем ss на роутере и проверяем, что работает
/opt/etc/init.d/S22shadowsocks restart
/opt/etc/init.d/S22shadowsocks check
Идем в веб морду роутера, в настройки нужного wg соединения и в пире вместо {server-ip}:{wireguard-port} вставляем 127.0.0.1:{local-port}