Раніше я був поверхнево написав про Встановлення з'єднання wireguard між Mikrotik та Linux (Debian), але є нюанс… тоді була задача поєднати швиденько Linux-хост з Mikrotik-ом, але досконало вивчати нюанси було ліньки 😢
Але от нещодавно відбулася подія яка примусила більш докладно підійти до процесу: злетів офісний vpn-сервер на базі Debian і було прийнято рішення перенести конфігурацію на RB3011. Окрім того, що було піднято сервіси L2TP/IPSec та інші, також захотілося більш докладно підійти до WireGuard…
Що сказати, незважаючи на те, що MikroTIK молодці і доволі докладно підходять до написання документації, але не все, що хочеться там є. Доводиться притягати весь попередній досвід щоб розібратися що до чого і як. Звісно, можливо, десь є більш докладне документування (я переконаний, що є), але ж то було б не настільки цікавим процесом.
Що хотілося? Хотілося створити багато клієнтів, які б підключалися по wireguard і отримували через організований тунель доступ до ресурсів та до Інтернет.
Спочатку думалося, що можна створити один wireguard інтерфейс і до нього купу малу peer-ів, але… але щось в мене пішло не так. Нормально в такій схемі захотів працювати тільки перший peer, всі хто підключалися після нього чомусь пасли задніх, хоча трафік від них в wireguard-інтерфейсі через torch я бачив. Пляски з бубном не допомогали… можливо бубен був не тієї конструкції, можливо щось інше, але прийшов врешті-решт до схеми яка не те що запрацювала, а запрацювала майже ідеально.
Далі по кроках.
По-перше, під кожного клієнта створюємо окремий wireguard-інтерфейс. При цьому слухати будемо різні порти.
/interface wireguard
add listen-port=12001 mtu=1420 name=wireguard1
add listen-port=12005 mtu=1420 name=wireguard5
add listen-port=12009 mtu=1420 name=wireguard9
add listen-port=13231 mtu=1420 name=wireguard13
Далі до кожного інтерфейса додамо адресу в мережі /30, в якій молодшу адресу й надаму інтерфейсу:
/ip address
add address=192.168.77.1/30 interface=wireguard1
add address=192.168.77.5/30 interface=wireguard5
add address=192.168.77.9/30 interface=wireguard9
add address=192.168.77.13/30 interface=wireguard13
Далі для кожного інтерфейса створимо peer-а:
/interface wireguard peers
add allowed-address=0.0.0.0/0 client-address=192.168.77.2/30 client-endpoint=NA.NB.NC.ND client-keepalive=20s interface=wireguard1 is-responder=yes name=peer-2 private-key=auto
add allowed-address=0.0.0.0/0 client-address=192.168.77.6/30 client-endpoint=NA.NB.NC.ND client-keepalive=20s interface=wireguard5 is-responder=yes name=peer6 private-key=auto
add allowed-address=0.0.0.0/0 client-address=192.168.77.10/30 client-endpoint=NA.NB.NC.ND client-keepalive=20s interface=wireguard9 is-responder=yes name=peer-10 private-key=auto
add allowed-address=0.0.0.0/0 client-address=192.168.77.14/30 client-endpoint=NA.NB.NC.ND client-keepalive=20s interface=wireguard13 is-responder=yes name=peer-10 private-key=auto
Тут NA.NB.NC.ND це ip-адреса серверної частини WireGuard.
В принципі все, що стосується налаштування саме серверної частини WireGuard ми фактично зробили. Ми створили клієнтів яким дозволили через тунель весь трафік (тобто не тільки приватні мережі, а й вихід до Інтернет).
Подивитися конфігурацію для налаштування клієнта, а також і QR-код, можна, наприклад, так:
/interface/wireguard/peers show-client-config number=[find interface=wireguard1 ]
або ж через winbox.
Тепер пару слів про налаштування файрволу. Звісно, що у кожного може бути своє бачення, але поділюся своїм. Весь файрвол, безумовно, наводити не стану, лише ту частину яка стосується саме WireGuard.
/interface list
add name=WIREGUARD/interface list member
add interface=wireguard1 list=WIREGUARD add interface=wireguard5 list=WIREGUARD add interface=wireguard9 list=WIREGUARD add interface=wireguard13 list=WIREGUARD/ip firewall address-list
add address=192.168.77.0/24 list=WIREGUARD/ip firewall filter
add action=accept chain=input in-interface-list=WIREGUARD add action=jump chain=input in-interface-list=INTERNET jump-target=wireguard add action=fasttrack-connection chain=forward connection-state=established,related hw-offload=yes add action=accept chain=forward connection-state=established,related add action=accept chain=forward in-interface-list=WIREGUARD out-interface-list=LAN add action=accept chain=forward in-interface-list=WIREGUARD out-interface-list=INTRANET add action=accept chain=forward in-interface-list=WIREGUARD out-interface-list=INTERNET add action=accept chain=wireguard dst-port=12001 protocol=udp add action=accept chain=wireguard dst-port=12005 protocol=udp add action=accept chain=wireguard dst-port=12009 protocol=udp add action=accept chain=wireguard dst-port=12013 protocol=udp/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=LAN src-address-list=WIREGUARD add action=masquerade chain=srcnat out-interface-list=INTRANET src-address-list=WIREGUARD add action=masquerade chain=srcnat out-interface-list=INTERNET src-address-list=WIREGUARD
Ідея, сподіваюся, є прозорою і зрозумілою, тому розжовувати що тут до чого, ну от не хочу.
От і все. В такій конфігурації клієнти (peer-и) чудово працюють паралельно, не заважаючи один одному.
Звісно, що порти та назви інтерфейсів кожен може взяти і обізвати так як йому зручно. Мені було зручно щоб був збіг з останнім октетом приватної адреси… якщо ж не вистачить то буде якось інакше.
Про налаштування кліантів на Android писати не стану там все не просто, а дуже просто: скануєте qr-код і все працює!
З очевидних недоліків такої конфігурації - дуже багато інтерфейсів і адрес, які треба прописати. Тому там де можна було введено list-и.
Очевидний плюс: простота налаштування клієнта - в переважній більшості все зводиться до простого сканування qr-кода.