Две несвязанные неисправности дают одну и ту же жалобу. В первой один клиент не доходит до другого даже по адресу туннеля, потому что адреса не в одной подсети или сервер не пересылает трафик между участниками. Во второй ping работает, а список устройств в приложении остаётся пустым, потому что обнаружение опирается на широковещание, которое туннель 3-го уровня нести не может. Один ping разделяет их, и исправление каждого совсем не похоже на исправление другого.

Один ping делит проблему на две

С одного клиента пропингуйте адрес туннеля другого клиента, а не его имя и не его адрес в LAN. Если это не удаётся, проблема в пересылке или адресации, и обнаружение неважно, пока это не исправлено. Если удаётся, пересылка уже работает, а оставшийся пробел — широковещание или разрешение имён.

ip addr show tun0

Прежде всего прочитайте интерфейс клиента, потому что маска сети называет топологию. /24 или другая маска подсети означает общий пул; /30 с адресом партнёра означает старую схему точка-точка, где у каждого клиента ровно один сосед — сервер.

net30 против подсети, прочитано со стороны клиента

What you observenet30subnet
Client netmask/30 with a peer addressThe pool's own mask
Peers a client can address directlyOne, the serverEvery client in the pool
AddressingOne /30 block per client, with the server as the only peerOne pool mask shared by all clients
Effect of client-to-clientRequired for any peer trafficRequired for peer traffic, still no broadcast

При net30 сервер выдаёт небольшой блок на клиента, поэтому маршрута к адресу туннеля другого клиента нет, если сервер его не перешлёт. При подсети весь пул — одна сеть, каждый клиент может обратиться к любому другому, и сервер пересылает между ними. Поэтому одна конфигурация сервера может выглядеть здоровой, пока ping между участниками не проходит: ничего не сломано, клиенты просто не в одной сети. Клиент видит работающее соединение и адрес участника, который не отвечает, что читается как межсетевой экран, но на деле это схема адресации.

Переключение директивы — это правка на стороне сервера плюс перезапуск, и она действует для следующего подключения, а не для уже открытых сеансов. Переподключите клиентов, прежде чем судить об изменении. Если устройство заново генерирует конфигурацию из веб-интерфейса, запишите директиву, файл и дату, и вносите правку через интерфейс, когда он есть, потому что пересборка перезапишет ручную правку при следующем сохранении.

client-to-client — отдельные ворота

Даже внутри одной подсети сервер отбрасывает пакеты, которые приходят от одного клиента и адресованы другому, если не задан client-to-client. Это ключевое слово превращает сервер в пересыльщика трафика между участниками, а не в конечную точку, которая только его принимает. Это второе условие, которое упускают после исправления топологии.

Это не распространяется на широковещание. Настройка пересылает одноадресный трафик между клиентами; она не превращает туннель в общий сегмент, и никакое её количество не доставит запрос обнаружения многоадресной рассылки каждому участнику.

TUN против TAP, и что каждый может нести

PropertyTUNTAP
LayerLayer 3, IP packetsLayer 2, Ethernet frames
Broadcast and multicastNot carriedCarried
Bridging to the LANNot applicableRequired for a shared segment
Client platform supportEverywhereMissing on Android and iOS, limited on macOS

Мост tap-устройства в LAN помещает удалённых клиентов в широковещательный домен офиса, что полностью решает обнаружение. Цена — платформы, которые не реализуют TAP, мост, который должен существовать на сервере, и домен отказа, где широковещательный шторм на офисном кабеле достигает каждого удалённого ноутбука.

Для двух-трёх рабочих станций, которым нужно разрешение имён, запись в hosts или одноадресный адрес намного дешевле моста. Беритесь за TAP, когда протокол, который вы не можете заменить, зависит от обнаружения на 2-м уровне, и не раньше.

Клиенты одной подсети без моста

Выдача адреса из диапазона LAN не ставит клиента на кабель. Сервер маршрутизирует между туннелем и Ethernet, поэтому ARP для этого адреса останавливается на интерфейсе сервера, и остальная LAN так и не узнаёт, где он живёт.

ip neigh add proxy 10.50.1.250 dev eth0

Proxy ARP закрывает этот пробел: сервер отвечает от имени клиента. Для диапазона parpd управляет записями по мере прихода и ухода клиентов, а sysctl net.ipv4.conf.eth0.proxy_arp=1 отвечает за всё, что маршрутизируется в другое место, и это достаточно широко, чтобы создать собственные сюрпризы на оживлённом сегменте.

Какой бы путь вы ни выбрали, уберите NAT между туннелем и кабелем. Правило MASQUERADE скрывает именно тот вопрос адресации, на который вы пытаетесь ответить. Оно также оставляет следующему человеку топологию, о которой он не сможет рассуждать со стороны клиента.

Прежде чем что-то менять, перехватите одну попытку на сервере с tcpdump -ni tun0 и подтвердите, приходит ли пакет участника вообще. Приходит и отбрасывается — это указывает на client-to-client; никогда не приходит — на топологию или маршрутизацию. Руководство OpenVPN 2.6 описывает оба ключевых слова и топологию по умолчанию, и это стоит сверить со своей версией, прежде чем копировать строку из сообщения на форуме.

  • Интерфейс tun показывает маску пула, а не пару участников /30.
  • Прямой ping на другой адрес туннеля проходит до проверки обнаружения.
  • Конфигурация сервера содержит client-to-client всякий раз, когда участники должны обмениваться пакетами.
  • Назовите протокол обнаружения, который вы проверяете, вместо того чтобы говорить, что приложение не работает.
  • Используйте TAP только если его поддерживает каждая клиентская платформа в группе.
  • Держите NAT вне пути между туннелем и LAN, когда важна доступность внутри одной подсети.

Похожие статьи