pfSense: WireGuard Site-to-Site

Собственно сабж. Пост будет дополняться по мере появления чего-нить нового.

Собственно сабж. Пост будет дополняться по мере появления чего-нить нового.

Берем два маршрутизатора и обновляем pfSense на обоих до версии 2.5.2. Маршрутизаторы условно назовем SERVER_A и SERVER_B.
Туннельная сеть пусть будет 172.0.0.0/30.
У SERVER_A будет 172.0.0.1/32 (lan 192.168.0.0/24), а у SERVER_B 172.0.0.2/32 (lan 192.168.1.0/24).
Устанавливаем экспериментальный пакет wireguard и запускаем на обоих серверах:

settings->enable->enable wireguard
settings->keep configuration->enable
settings->resolve interval->300
settings->interface group->only unussigned tunnels
settings->hide secrets->enable

ТУННЕЛИ

Создаем туннель на обоих серверах:

tunnels->enable
tunnels->description->WG_TUN_A (на втором будет WG_TUN_B)
tunnels->listen port->51887 (порт можно выбрать любой - я выбрал такой)
tunnels->interface keys->generate
tunnels->save tunnel

ПИРЫ

Тут для лучшего понимания приведу конфиги обоих серверов раздельно. В принципе смысл просто в том, чтобы крест на крест соединить туннели и пиры т.е. peerB подключается к tunnelA, а peerA подключается к tunnelB.

Конфиг пира для SERVER_A:

peers->enable
peers->tunnel->tun_wg0
peers->description->WG_PEER_A
peers->dynamic endpoint->disable
peers->endpoint->SERVER_B_IP->51887
peers->keep alive->30
peers->public_key->WG_TUN_B_PUBLIC_KEY
peers->allowed ips->172.0.0.2/32->SERVER_B_TUNNEL
peers->allowed ips->192.168.1.0/24->SERVER_B_LAN
peers->save peer

Конфиг пира для SERVER_B:

peers->enable
peers->tunnel->tun_wg0
peers->description->WG_PEER_B
peers->dynamic endpoint->disable
peers->endpoint->SERVER_A_IP->51887
peers->keep alive->30
peers->public_key->WG_TUN_A_PUBLIC_KEY
peers->allowed ips->172.0.0.1/32->SERVER_A_TUNNEL
peers->allowed ips->192.168.0.0/24->SERVER_A_LAN
peers->save peer

С endpoint я думаю все понятно. В AllowedIPs указываем те сети и адреса, к которым хотим получить доступ т.е. SERVER_A хочет получить доступ к туннелю сервера SERVER_B и к его локальной сети. Потому их и указываем на SERVER_A и наоборот.
Тут я думаю важно указать сперва адрес удаленного туннеля и только потом указывать адрес удаленной локальной сети поскольку трафик сперва должен пройти через туннельный шлюз.

ИНТЕРФЕЙСЫ

На обоих серверах надо создать интерфейс: assignments->tun_wg0.
Далее распишу конфиги интерфейсов раздельно на всякий случай. SERVER_A:

description->WG_SERVER_A
ipv4->static ipv4
ipv4 address->172.0.0.1/30
ipv4 upstream gateway->add new gateway->WG_SERVER_B_GW->172.0.0.2
save

И конфиг SERVER_B:

description->WG_SERVER_B
ipv4->static ipv4
ipv4 address->172.0.0.2/30
ipv4 upstream gateway->add new gateway->WG_SERVER_A_GW->172.0.0.1
save

FIREWALL

В firewall->nat->port forward пробрасываем порт 51887 на 127.0.0.1 51887.
В firewall->nat->outbound создаем правила:

wan->source 172.0.0.0/30->allow any protocol->wan address->destination port 500->static port->WG_SERVER_A

Второе правило аналогичное, но без destination port и static port.
firewall->rules->WireGuard создаем правило any to any.
firewall->rules->WG_SERVER_A создаем правило any to any.
Аналогичные правила создаем и на SERVER_B.

МАРШРУТИЗАЦИЯ

Настройка SERVER_A:

system->routing->static routes->add
destination network->192.168.1.0/24
gateway->WG_SERVER_B_GW

Настройка SERVER_B:

system->routing->static routes->add
destination network->192.168.0.0/24
gateway->WG_SERVER_A_GW

Перезапускаем пиры с обоих сторон и в статусе должны увидеть, что handshake прошел и обе стороны увидели друг друга.

О обфускации

Попробовал прикрутить shadowsocks-libev, но к сожалению в udp режиме ndpi все равно палит wireguard. V2ray ничем не помог. Инкапсулировать udp в tcp не имеет смысла поскольку теряется производительность udp. От разработчиков wireguard ждать обфускации трафика из под коробки ждать не приходится (вроде уже отклонили предложение).