Вопрос или проблема
Во-первых, я знаю, что WireGuard работает с одноранговыми узлами, но я буду использовать термины “клиент” и “сервер” для облегчения понимания.
Я пытаюсь настроить WireGuard на роутере с OpenWRT, чтобы
- удаленно подключаться к домашней сети, используя либо мой телефон, либо ноутбук.
- направлять трафик к трем определенным IP-адресам из моей домашней сети через удаленную сеть.
Я могу сделать так, чтобы оба сценария работали индивидуально, но не могу заставить их работать одновременно.
Это моя текущая настройка с обоими интерфейсами:
firewall.lan=zone
firewall.lan.name="https://superuser.com/questions/1870825/lan"
firewall.lan.input="ACCEPT"
firewall.lan.output="ACCEPT"
firewall.lan.forward='ACCEPT'
firewall.lan.network="https://superuser.com/questions/1870825/lan"
firewall.wan=zone
firewall.wan.name="wan"
firewall.wan.input="REJECT"
firewall.wan.output="ACCEPT"
firewall.wan.forward='REJECT'
firewall.wan.masq='1'
firewall.wan.mtu_fix='1'
firewall.wan.network='wan' 'wan6'
firewall.@zone[2]=zone
firewall.@zone[2].name="RemoteVPN"
firewall.@zone[2].input="REJECT"
firewall.@zone[2].output="ACCEPT"
firewall.@zone[2].forward='REJECT'
firewall.@zone[2].masq='1'
firewall.@zone[2].mtu_fix='1'
firewall.@zone[2].network='remote_network'
firewall.@forwarding[1]=forwarding
firewall.@forwarding[1].src="https://superuser.com/questions/1870825/lan"
firewall.@forwarding[1].dest="RemoteVPN"
firewall.wg=rule
firewall.wg.name="Allow-WireGuard"
firewall.wg.src="wan"
firewall.wg.dest_port="51820"
firewall.wg.proto='udp'
firewall.wg.target="ACCEPT"
network.remote_network=interface
network.remote_network.proto='wireguard'
network.remote_network.private_key=<redacted>
network.remote_network.listen_port="51000"
network.remote_network.addresses="10.10.10.11/32"
network.remote_network.dns="192.168.128.1"
network.@wireguard_remote_network[0]=wireguard_remote_network
network.@wireguard_remote_network[0].description='Imported peer configuration'
network.@wireguard_remote_network[0].public_key=<redacted>
network.@wireguard_remote_network[0].endpoint_host="<redacted>"
network.@wireguard_remote_network[0].endpoint_port="51000"
network.@wireguard_remote_network[0].route_allowed_ips="1"
network.@wireguard_remote_network[0].persistent_keepalive="25"
network.@wireguard_remote_network[0].allowed_ips="10.10.10.10/32" '<redacted>/32' '<redacted>/128'
network.HomeNetworkVPN=interface
network.HomeNetworkVPN.proto='wireguard'
network.HomeNetworkVPN.private_key='<redacted>'
network.HomeNetworkVPN.listen_port="51820"
network.HomeNetworkVPN.addresses="192.168.9.1/24"
network.wgclient=wireguard_HomeNetworkVPN
network.wgclient.public_key=<redacted>
network.wgclient.preshared_key='<redacted>'
network.wgclient.allowed_ips="192.168.9.2/32"
Настройка, показанная выше, является результатом выполнения этого руководства для настройки роутера в качестве клиента, подключающегося к удаленному серверу, и этого руководства для его настройки в качестве сервера, за исключением последней команды
uci add_list firewall.lan.network="${VPN_IF}"
На данный момент туннель к удаленному серверу работает. Однако, если я выполню упомянутую выше команду, оба перестанут работать.
Ответ или решение
Настройка WireGuard на маршрутизаторе OpenWRT, который будет выступать как сервером, так и клиентом, может вызвать некоторые сложности из-за необходимости обеспечения одновременной работы обоих туннелей. Попробуем разобраться в теории и следующих практических шагах для достижения этой цели.
Теория
WireGuard – это современный, эффективный и простой в использовании VPN-протокол, который использует современную криптографию. Основная концепция WireGuard заключается в использовании "пиров", но для простоты восприятия, обычно используем термины "сервер" и "клиент".
Когда вы настраиваете WireGuard в качестве сервера на вашем маршрутизаторе OpenWRT, вы позволите удаленным устройствам подключаться к вашей домашней сети через VPN. Другая задача заключается в настраивании маршрутизатора для туннелирования определенного трафика из домашней сети к удаленной сети через другой WireGuard-туннель, в котором маршрутизатор сам будет работать в роли клиента.
Пример
Ваша текущая конфигурация загружает два интерфейса WireGuard:
HomeNetworkVPN
– для принятия входящих соединений, тем самым выступая в роли сервера для удаленного доступа к домашней сети.remote_network
– для установления исходящих соединений с удаленной сетью, таким образом выступая в роли клиента.
Проблема, с которой вы столкнулись, заключается в конфликте маршрутизации или использовании ресурсов, что приводит к неработоспособности обеих конфигураций при совместном использовании.
Применение
Для решения этой проблемы порядок настроек может понадобиться пересмотреть следующим образом:
-
Настройка Firewall:
Выполните следующие команды, чтобы корректно настроить правила для обеих конфигураций:
# Для входящих подключений к вашему домашнему VPN uci set firewall.homevpn=zone uci set firewall.homevpn.name='homevpn' uci set firewall.homevpn.input='ACCEPT' uci set firewall.homevpn.output='ACCEPT' uci set firewall.homevpn.forward='REJECT' uci set firewall.homevpn.network='HomeNetworkVPN' uci add firewall rule uci set firewall.@rule[-1]=rule uci set firewall.@rule[-1].name='Allow-WireGuard-Inbound' uci set firewall.@rule[-1].src='wan' uci set firewall.@rule[-1].dest_port='51820' uci set firewall.@rule[-1].proto='udp' uci set firewall.@rule[-1].target='ACCEPT' # Для исходящего трафика через удаленный VPN uci set firewall.remotewvpn=zone uci set firewall.remotewvpn.name='remotewvpn' uci set firewall.remotewvpn.input='REJECT' uci set firewall.remotewvpn.output='ACCEPT' uci set firewall.remotewvpn.forward='REJECT' uci set firewall.remotewvpn.network='remote_network' uci add firewall forwarding uci set firewall.@forwarding[-1].src='lan' uci set firewall.@forwarding[-1].dest='remotewvpn' uci commit firewall service firewall restart
-
Настройка интерфейсов WireGuard:
Убедитесь, что каждый интерфейс WireGuard имеет уникальные параметры, адаптированные для его задачи.
uci set network.HomeNetworkVPN=interface uci set network.HomeNetworkVPN.proto='wireguard' uci set network.HomeNetworkVPN.private_key='<private_key>' uci set network.HomeNetworkVPN.listen_port='51820' uci set network.HomeNetworkVPN.addresses='192.168.9.1/24' uci set network.remote_network=interface uci set network.remote_network.proto='wireguard' uci set network.remote_network.private_key='<private_key>' uci set network.remote_network.listen_port='51000' uci set network.remote_network.addresses='10.10.10.11/32' # Настройка пиров для remote_network uci set network.@wireguard_remote_network[0]=interface uci set network.@wireguard_remote_network[0].public_key='<peer_public_key>' uci set network.@wireguard_remote_network[0].endpoint_host='<endpoint_host>' uci set network.@wireguard_remote_network[0].endpoint_port='51000' uci set network.@wireguard_remote_network[0].allowed_ips='10.10.10.10/32' uci set network.@wireguard_remote_network[0].route_allowed_ips='1' uci set network.@wireguard_remote_network[0].persistent_keepalive='25' # Настройка пиров для HomeNetworkVPN uci set network.wgclient=wireguard_HomeNetworkVPN uci set network.wgclient.public_key='<client_public_key>' uci set network.wgclient.preshared_key='<preshared_key>' uci set network.wgclient.allowed_ips='192.168.9.2/32' uci commit network service network restart
-
Маршрутизация и дополнительные настройки:
Проверьте таблицы маршрутизации на конфликтующие маршруты или помехи. Возможно, потребуется ручная настройка таблиц маршрутизации, чтобы убедиться, что пакеты направляются через соответствующие туннели в зависимости от их назначения.
-
Проверка работы:
После настройки перезагрузите маршрутизатор и выполните команду
logread
, чтобы убедиться, что служба WireGuard работает корректно. Используйтеwg show
для проверки состояния туннелей и активности пиров. -
Диагностика возможных проблем:
- Если туннели все еще не работают одновременно, попробуйте отключить "маскарадинг" для зоны
RemoteVPN
, если это не требуется. - Убедитесь, что каждая конфигурация используется на различной подсети, чтобы избежать конфликтов между IP-адресами.
- Если туннели все еще не работают одновременно, попробуйте отключить "маскарадинг" для зоны
Эти шаги должны позволить добиться работоспособности обеих настроек туннелей WireGuard на OpenWRT с правильной маршрутизацией и подходящими параметрами.