mirror of https://github.com/bol-van/zapret/
1 changed files with 227 additions and 0 deletions
@ -0,0 +1,227 @@ |
|||||
|
Есть возможность поднять свой VPN сервер ? Не хотим использовать redsocks ? |
||||
|
Хотим завертывать на VPN только часть трафика ? |
||||
|
Например, из ipset-ов zapret только порт tcp:443, из ipban - весь трафик, не только tcp ? |
||||
|
Да, с VPN такое возможно. |
||||
|
Опишу понятийно как настраивается policy based routing в openwrt на примере wireguard. |
||||
|
Вместо wireguard можно использовать vpn. Но wireguard прекрасен сразу несколькими вещами. |
||||
|
Главная из которых - в разы большая скорость, даже немного превышающая ipsec. |
||||
|
Ведь openvpn основан на tun, а tun - всегда в разы медленнее решения в kernel mode, |
||||
|
и если для PC оно может быть не так актуально, для soho роутеров - более чем. |
||||
|
Wireguard может дать 50 mbps там, где openvpn еле тащит 10. |
||||
|
Другая важная особенность - затрудненное обнаружение протокола системами DPI. |
||||
|
|
||||
|
Понятийно необходимо выполнить следующие шаги : |
||||
|
1) Поднять vpn сервер. |
||||
|
2) Настроить vpn клиент. Результат этого шага - получение поднятого интерфейса vpn. |
||||
|
Будть то wireguard, openvpn или любой другой тип vpn. |
||||
|
3) Создать такую схему маршрутизации, при которой пакеты, помечаемые особым mark, |
||||
|
попадают на vpn, а остальные идут обычным способом. |
||||
|
4) Создать правила, выставляющие mark для всего трафика, который необходимо рулить на vpn. |
||||
|
Критерии могут быть любые, ограниченные лишь возможностями iptables и вашим воображением. |
||||
|
|
||||
|
Будем считать наш vpn сервер находится на ip 91.15.68.202. |
||||
|
Вешать его будем на udp порт 12345. На этот же порт будем вешать и клиентов. |
||||
|
Сервер работает под debian 9. Клиент работает под openwrt. |
||||
|
Для vpn отведем подсеть 192.168.254.0/24. |
||||
|
|
||||
|
--- Поднятие сервера --- |
||||
|
|
||||
|
На сервере должны быть установлены заголовки ядра (linux-headers-...) и компилятор gcc. |
||||
|
Качаем последний tar.xz с wireguard отсюда : https://git.zx2c4.com/WireGuard/ |
||||
|
|
||||
|
# tar xf WireGuard*.tar.xz |
||||
|
# cd WireGuard-*/src |
||||
|
# make |
||||
|
# strip --strip-debug wireguard.ko |
||||
|
# sudo make install |
||||
|
|
||||
|
wireguard основан на понятии криптороутинга. Каждый пир (сервер - тоже пир) |
||||
|
имеет пару открытый/закрытый ключ. Закрытый ключ остается у пира, |
||||
|
открытый прописывается у его партнера. Каждый пир авторизует другого |
||||
|
по знанию приватного ключа, соответствующего прописанному у него публичному ключу. |
||||
|
Протокол построен таким образом, что на все неправильные udp пакеты не следует ответа. |
||||
|
Не знаешь приватный ключ ? Не смог послать правильный запрос ? Долбись сколько влезет, |
||||
|
я тебе ничего не отвечу. Это защищает от активного пробинга со стороны DPI и просто |
||||
|
экономит ресурсы. |
||||
|
Значит первым делом нужно создать 2 пары ключей : для сервера и для клиента. |
||||
|
wg genkey генерит приватный ключ, wg pubkey получает из него публичный ключ. |
||||
|
|
||||
|
# wg genkey |
||||
|
oAUkmhoREtFQ5D5yZmeHEgYaSWCcLYlKe2jBP7EAGV0= |
||||
|
# echo oAUkmhoREtFQ5D5yZmeHEgYaSWCcLYlKe2jBP7EAGV0= | wg pubkey |
||||
|
bCdDaPYSTBZVO1HTmKD+Tztuf3PbOWGDWfz7Lb1E6C4= |
||||
|
# wg genkey |
||||
|
OKXX0TSlyjJmGt3/yHlHxi0AqjJ0vh+Msne3qEHk0VM= |
||||
|
# echo OKXX0TSlyjJmGt3/yHlHxi0AqjJ0vh+Msne3qEHk0VM= | wg pubkey |
||||
|
EELdA2XzjcKxtriOCPBXMOgxlkgpbRdIyjtc3aIpkxg= |
||||
|
|
||||
|
Пишем конфиг |
||||
|
--/etc/wireguard/wgvps.conf------------------- |
||||
|
[Interface] |
||||
|
PrivateKey = OKXX0TSlyjJmGt3/yHlHxi0AqjJ0vh+Msne3qEHk0VM= |
||||
|
ListenPort = 12345 |
||||
|
|
||||
|
[Peer] |
||||
|
#Endpoint = |
||||
|
PublicKey = bCdDaPYSTBZVO1HTmKD+Tztuf3PbOWGDWfz7Lb1E6C4= |
||||
|
AllowedIPs = 192.168.254.3 |
||||
|
PersistentKeepalive=20 |
||||
|
---------------------------------------------- |
||||
|
|
||||
|
Wireguard - минималистичный vpn. В нем нет никаких средств для автоконфигурации ip. |
||||
|
Все придется прописывать руками. |
||||
|
В wgvps.conf должны быть перечислены все пиры с их публичными ключами, |
||||
|
а так же прописаны допустимые для них ip адреса. |
||||
|
Назначим нашему клиенту 192.168.254.3. Сервер будет иметь ip 192.168.254.1. |
||||
|
Endpoint обязательно должен быть прописан только на одном пире. |
||||
|
В схеме клиент/сервер у сервера можно не прописывать endpoint-ы пиров, что позволит |
||||
|
менять ip и быть за nat. Endpoint пира настраивается динамически после успешной фазы |
||||
|
проверки ключа. |
||||
|
|
||||
|
Интерфейс конфигурится стандартно для дебианоподобных систем : |
||||
|
|
||||
|
--/etc/network/interfaces.d/wgvps------------- |
||||
|
auto wgvps |
||||
|
iface wgvps inet static |
||||
|
address 192.168.254.1 |
||||
|
netmask 255.255.255.0 |
||||
|
pre-up ip link add $IFACE type wireguard |
||||
|
pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf |
||||
|
post-down ip link del $IFACE |
||||
|
---------------------------------------------- |
||||
|
|
||||
|
Поднятие через ifup wgvps, опускание через ifdown wgvps. |
||||
|
Чтобы посмотреть текущие настройки wireguard, запустите 'wg' без параметров. |
||||
|
|
||||
|
|
||||
|
--- Поднятие клиента --- |
||||
|
|
||||
|
# opkg update |
||||
|
# opkg install wireguard |
||||
|
|
||||
|
Добавляем записи в конфиги. |
||||
|
|
||||
|
--/etc/config/network-------------------------- |
||||
|
config interface 'wgvps' |
||||
|
option proto 'wireguard' |
||||
|
option auto '1' |
||||
|
option private_key 'oAUkmhoREtFQ5D5yZmeHEgYaSWCcLYlKe2jBP7EAGV0=' |
||||
|
option listen_port '12345' |
||||
|
option metric '9' |
||||
|
option mtu '1420' |
||||
|
|
||||
|
config wireguard_wgvps |
||||
|
option public_key 'EELdA2XzjcKxtriOCPBXMOgxlkgpbRdIyjtc3aIpkxg= |
||||
|
list allowed_ips '0.0.0.0/0' |
||||
|
option endpoint_host '91.15.68.202' |
||||
|
option endpoint_port '12345' |
||||
|
option route_allowed_ips '0' |
||||
|
option persistent_keepalive '20' |
||||
|
|
||||
|
config interface 'wgvps_ip' |
||||
|
option proto 'static' |
||||
|
option ifname '@wgvps' |
||||
|
list ipaddr '192.168.254.3/24' |
||||
|
|
||||
|
config route |
||||
|
option interface 'wgvps' |
||||
|
option target '0.0.0.0/0' |
||||
|
option table '100' |
||||
|
|
||||
|
config rule |
||||
|
option mark '0x800/0x800' |
||||
|
option priority '100' |
||||
|
option lookup '100' |
||||
|
------------------------------------------------ |
||||
|
|
||||
|
--/etc/config/firewall-------------------------- |
||||
|
config zone |
||||
|
option name 'tunvps' |
||||
|
option output 'ACCEPT' |
||||
|
option input 'REJECT' |
||||
|
option masq '1' |
||||
|
option mtu_fix '1' |
||||
|
option forward 'REJECT' |
||||
|
option network 'wgvps wgvps_ip' |
||||
|
|
||||
|
config forwarding |
||||
|
option dest 'tunvps' |
||||
|
option src 'lan' |
||||
|
|
||||
|
config rule |
||||
|
option name 'Allow-ICMP-tunvps' |
||||
|
option src 'tunvps' |
||||
|
option proto 'icmp' |
||||
|
option target 'ACCEPT' |
||||
|
|
||||
|
config rule |
||||
|
option target 'ACCEPT' |
||||
|
option src 'wan' |
||||
|
option proto 'udp' |
||||
|
option family 'ipv4' |
||||
|
option src_port '12345' |
||||
|
option src_ip '91.15.68.202' |
||||
|
option name 'WG-VPS' |
||||
|
------------------------------------------------ |
||||
|
|
||||
|
Что тут было сделано : |
||||
|
*) Настроен интерфейс wireguard. Указан собственный приватный ключ. |
||||
|
*) Настроен пир-партнер с указанием его публичнго ключа и endpoint (ip:port нашего сервера) |
||||
|
такая настройка заставит периодически долбиться на сервер по указанному ip |
||||
|
route_allowed_ip '0' запрещает автоматическое создание маршрута |
||||
|
allowed_ips '0.0.0.0/0' разрешает пакеты с любым адресом источника. |
||||
|
ведь мы собираемся подключаться к любым ip в инете |
||||
|
persistent_keepalive '20' помогает исключить дропание mapping на nat-е, если мы сидим за ним, |
||||
|
да и вообще полезная вещь, чтобы не было подвисших пиров |
||||
|
*) Статическая конфигурация ip интерфейса wgvps. |
||||
|
*) Маршрут default route на wgvps в отдельной таблице маршрутизации с номером 100. Аналог команды ip route add .. table 100 |
||||
|
*) Правило использовать таблицу 100 при выставлении в mark бита 0x800. Аналог команды ip rule. |
||||
|
*) Отдельная зона фаервола для VPN - 'tunvps'. В принципе ее можно не создавать, можете приписать интерфейс к зоне wan. |
||||
|
Но в случае с отдельной зоной можно настроить особые правила на подключения с vpn сервера в сторону клиента. |
||||
|
*) Разрешение форвардинга между локалкой за роутером и wgvps. |
||||
|
*) Разрешение принимать icmp от vpn сервера, включая пинги. ICMP жизненно важны для правильного функционирования ip сети ! |
||||
|
*) И обязательно проткнуть дырку в фаерволе, чтобы принимать пакеты wireguard со стороны инетовского ip vpn сервера. |
||||
|
|
||||
|
# fw3 restart |
||||
|
# ifup wgvps |
||||
|
# ifconfig wgvps |
||||
|
# ping 192.168.254.1 |
||||
|
|
||||
|
Если все хорошо, должны ходить пинги. |
||||
|
С сервера не помешает : |
||||
|
# ping 192.168.254.3 |
||||
|
|
||||
|
|
||||
|
--- Маркировка трафика --- |
||||
|
|
||||
|
Завернем на vpn все из ipset zapret на tcp:443 и все из ipban. |
||||
|
OUTPUT относится к исходящим с роутера пакетам, PREROUTING - ко всем остальным. |
||||
|
Если с роутера ничего заруливать не надо, можно опустить все до команд с PREROUTING. |
||||
|
|
||||
|
--/etc/firewall.user---------------------------- |
||||
|
. /lib/functions/network.sh |
||||
|
|
||||
|
network_find_wan wan_iface |
||||
|
|
||||
|
for ext_iface in $wan_iface; do |
||||
|
network_get_device DEVICE $ext_iface |
||||
|
|
||||
|
iptables -t mangle -C OUTPUT -p tcp --dport 443 -o $DEVICE -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 || |
||||
|
iptables -t mangle -I OUTPUT -p tcp --dport 443 -o $DEVICE -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 |
||||
|
iptables -t mangle -C OUTPUT -o $DEVICE -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 || |
||||
|
iptables -t mangle -I OUTPUT -o $DEVICE -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 |
||||
|
done |
||||
|
|
||||
|
iptables -t mangle -C PREROUTING -p tcp --dport 443 -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 || |
||||
|
iptables -t mangle -I PREROUTING -p tcp --dport 443 -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 |
||||
|
iptables -t mangle -C PREROUTING -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 || |
||||
|
iptables -t mangle -I PREROUTING -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 |
||||
|
------------------------------------------------ |
||||
|
|
||||
|
# fw3 restart |
||||
|
|
||||
|
|
||||
|
--- А если не заработало ? --- |
||||
|
|
||||
|
Мануал пишется не как копипастная инструкция, а как помощь уже соображающему. |
||||
|
В руки вам ifconfig, ip, iptables, tcpdump, ping. В умелых руках творят чудеса. |
Loading…
Reference in new issue