вторник, 19 февраля 2019 г.

wireguard on openwrt

Заметки о конфигурации vpn туннеля под openwrt.
Да да он еще не безопасный и об этом явно написано, но нам по обыкновению плевать. Почему? Да потому что нам просто надо спрятать трафик от йотпы.

готовимся


ставим из репозитариев без лишней возни
opkg update
opkg install luci-proto-wireguard
И получаем ошибку не соответствии ядра:
root@nethead:~# opkg install luci-proto-wireguard
Installing luci-proto-wireguard (git-19.042.42292-b7fabbd-1) to root...
Downloading http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/luci/luci-proto-wireguard_git-19.042.42292-b7fabbd-1_all.ipk
Collected errors:
 * satisfy_dependencies_for: Cannot satisfy the following dependencies for luci-proto-wireguard:
 *      kernel (= 4.14.98-1-38f482742ce3398079b12d4bf561b99c) *         kernel (= 4.14.98-1-38f482742ce3398079b12d4bf561b99c) *       kernel (= 4.14.98-1-38f482742ce3398079b12d4bf561b99c) *
 * opkg_install_cmd: Cannot install package luci-proto-wireguard.
Какая же у нас? стоит спросить у
uname -r
и получить неутешительный ответ: 4.9.86. Придется обновляться до 4.14.98-1

первые объебы


Конечно же нельзя вот так просто взять и обновить прошивку.
Да я расчитывал взять последний последний билд из каталога по старее
или по новее (бинарь) и просто обновиться с сохранением настроек. Но нет, ни nethead.lan ни 192.168.1.12 ни 192.168.1.1 не прозванивались ни по http ни по https.
Несколько удивило то, что wan жив и я уже качнул zenmap и запустил с таргетом `192.168.1.0/24` (помним, что я ленивый енот) и тут глядя на отчет понял: 80 порта нет. Просто нет. Потому что ни LuCi ни uhttpd там нет. Просто нет, потому что это голый билд. Придется ставить ручками все от начала до конца.

Благо nmap подсказал нам хост, осталось только подобрать порт для ssh. Дефолтный 22 я сменил еще до обновления прошивки и он успешно прозвонился с пол пинка. Это успех

восстановление системных пакетов


Ну во первых стоит возликовать: ядрышко обновилось до 4.4.14
Ну а дальше дело техники
opkg update
opkg install openssh-sftp-server
opkg install luci
opkg install luci-theme-openwrt

По идее люся тут же должна начать отзываться, но не по 80 порту а 81. Ну потому что конфиги такие раньше были. Но не тут то было. Раньше конфиг был такой
config uhttpd 'main'
    list listen_http '127.0.0.1:81'
    option home '/www'
    option rfc1918_filter '0'
    option max_requests '3'
    option max_connections '100'
    option cgi_prefix '/cgi-bin'
    option script_timeout '60'
    option network_timeout '30'
    option http_keepalive '20'
    option tcp_keepalive '1'
    option ubus_prefix '/ubus'
    option redirect_https '0'

на надо было попросить его слушать не только локалхост, но и вообще все интерфейсы на 81 порту:
list listen_http '0.0.0.0:81'

старые роуты остались в конфигах, осталось донастроить только лично приготовленные фигли.

nginx


Такие сильные изменения в ядре не должны остаться незамеченными. На всякий случай пересобиру бинарь веб-сервера.

Бонус: nginx_1.12.2-1_mipsel_24kc.ipk

аплоадим старый бинарь в темп и погнали
cd /tmp/
ls -la | grep nginx
opkg install nginx_1.12.1-1_mipsel_24kc.ipk
opkg install ca-certificates openssl-util
opkg install luci-app-acme
/etc/init.d/nginx enable
/etc/init.d/nginx start
/etc/init.d/nginx reload


sslh


надо еще не забыть подправить конфиг на методе anyport

package 'sslh'

config 'sslh' 'default'
    # disable or enable
    option 'enable' '1'
    # listen defaults to '0.0.0.0:443' (all interfaces)
    # multiple -p arguments may be supplied using a uci list
    # -p :
    option 'listen' '0.0.0.0:443'
    # ssh defaults to 'localhost:22'
    # --ssh :
    option 'ssh' 'localhost:2250'
    # ssl defaults to 'localhost:443'
    # --ssl :
    option 'ssl' 'localhost:8443'
    # openvpn defaults to 'localhost:1194'
    # --openvpn :
    #option 'openvpn' ''
    # tinc defaults to 'localhost:655'
    # --tinc :
    #option 'tinc' ''
    # xmpp defaults to 'localhost:5222'
    # --xmpp :
    #option 'xmpp' ''
    #option wireguard
    option 'anyport' 'localhost:8444'
    # timeout (for ssh, then ssl is assumed) defaults to 2
    # -t
    option 'timeout' '2'
    # verbose defaults to off
    # -v
    option 'verbose' '0'
    # use external config file
    # option configfile '/etc/sslh.conf'

нужно только рестартануть
/etc/init.d/sslh reload


Ну а дальше можно попробовать еще раз.

ставим wireguard еще разок


пробуем
opkg update
opkg install luci-proto-wireguard luci-app-wireguard wireguard kmod-wireguard wireguard-tools

и на этот раз получаем благословение:
Configuring kmod-udptunnel6.
Configuring kmod-udptunnel4.
Configuring kmod-wireguard.
Configuring libmnl.
Configuring ip-tiny.
Configuring wireguard-tools.
Configuring luci-proto-wireguard.
root@nethead:~#


Вообще есть неплохой ман на английском для GUI и еще один для CLI.
Но в обоих случаях используются странные хаки с подсетями для разграничения доступа. По этому у меня адаптация под свои нужды. Возможно не правильная, позже подтюню.

firewall конфигурация


пилим дырку в файрволе:
uci add firewall rule
uci set firewall.@rule[-1].src="*"
uci set firewall.@rule[-1].target="ACCEPT"
uci set firewall.@rule[-1].proto="udp"
uci set firewall.@rule[-1].dest_port="1234"
uci set firewall.@rule[-1].name="Allow-Wireguard-Inbound"
uci commit firewall
/etc/init.d/firewall restart

В результате это должно заапендиться в `vim /etc/config/firewall`
config rule
    option src '*'
    option target 'ACCEPT'
    option proto 'tcp udp'
    option dest_port '8444'
    option name 'Allow-Wireguard-Inbound'

теперь делаем спец DMZ под нашу будущую сетевую активность
uci add firewall zone
uci set firewall.@zone[-1].name='wg'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci set firewall.@zone[-1].network='wg0'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='wg'
uci set firewall.@forwarding[-1].dest='wan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='wg'
uci set firewall.@forwarding[-1].dest='lan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='wg'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='wan'
uci set firewall.@forwarding[-1].dest='wg'
uci commit firewall
/etc/init.d/firewall restart

роутер ругнется тем, что не нашел интерфейса и девайса.
Warning: Section @zone[2] (wg) cannot resolve device of network 'wg0'
Warning: Section @zone[1] (wg) has no device, network, subnet or extra options

Сейчас сделаем ему интейфейс

wireguard конфигурация


WireGuard keys


Нам потребуется минимум 3 ключа:

1. для сервера
2. для мобилы: tun4britz
3. для ноута: tun4bitard
4. для сомнительных подключений в гостях: roadwarrior

mkdir wgkeys && cd wgkeys
wg genkey | tee server-private.key | wg pubkey > server-public.key
wg genkey | tee tun4britz-private.key | wg pubkey > tun4britz-public.key
wg genkey | tee tun4bitard-private.key | wg pubkey > tun4bitard-public.key
wg genkey | tee roadwarrior-private.key | wg pubkey > roadwarrior-public.key
wg genpsk > preshared

WireGuard interface


конфиг сервера
uci set network.wg0="interface"
uci set network.wg0.proto="wireguard"
uci set network.wg0.private_key="$(cat server-private.key)"
uci set network.wg0.listen_port="8444"
uci add_list network.wg0.addresses='192.168.1.41/24'
# .11 у меня был прописан прошлому роутеру; .12 у меня занят под роутер текущий; .13 будет под будущйи ротер, .31 - под ретранcлятор. Посему пусть . 41 будет под впн
uci commit network
/etc/init.d/network reload

конфиг клиента
uci add network wireguard_wg0
uci set network.@wireguard_wg0[-1].public_key="$(cat tun4britz-public.key)"
uci set network.@wireguard_wg0[-1].route_allowed_ips="1"
uci add_list network.@wireguard_wg0[-1].allowed_ips="0.0.0.0/0"
uci add_list network.@wireguard_wg0[-1].allowed_ips="::/0"
uci set network.@wireguard_wg0[-1].persistent_keepalive='25'
uci set network.@wireguard_wg0[-1].description='tun4britz'
uci commit network
/etc/init.d/network reload

Есть некоторые сомнения относительно allowed_ips для клиента, озвученные в коммюнити

по этому итоговый хвост конфиг:
config interface 'wg0'
    option proto 'wireguard'
    option private_key 'server-private.key'
    option listen_port '8444'
    list addresses '192.168.1.12/24'
    list addresses '192.168.2.1/24'
    option mtu '1350'

config wireguard_wg0
    option public_key 'tun4britz-public.key'
    option route_allowed_ips '1'
    option endpoint_port '8444'
    option persistent_keepalive '25'
    option description 'britz'
    option endpoint_host 'box.now.io'
    list allowed_ips '192.168.1.0/32'

И в принципе все даже работает. Напоследок скринщоты из под GUI

server
client



Комментариев нет :

Отправить комментарий