Должен ли ваш клиент OpenVPN использовать nobind или фиксированный порт?
nobind позволяет ядру выбирать исходный порт для клиента, который подключается наружу. Три условия решают, нужен ли вам этот вариант или, скорее, закреплённый локальный порт.
Два профиля, отличающиеся одной строкой, ведут себя по-разному в тот момент, когда на том же хосте запускается второй клиент. Один несёт nobind и берёт любой локальный порт, который выдаёт ядро; другой резервирует 1194, и второй экземпляр умирает с адресом, уже используемым. Эта строка решает, кто выбирает исходный порт, а это, в свою очередь, решает, может ли профиль сосуществовать с чем-либо ещё на машине. Три вопроса решают это, и первый отвечает для большинства профилей, прежде чем вы доберётесь до двух других.
Что nobind на самом деле пропускает
По умолчанию клиент привязывает локальный сокет перед вызовом, и локальный порт равен 1194, если профиль не говорит иного. nobind снимает это резервирование, поэтому стек выделяет неиспользуемый порт при подключении. Это исключение, а не значение по умолчанию, и клиент без строки держит 1194, именно поэтому незакреплённый второй экземпляр конфликтует. Большинство поставляемых клиентских профилей несут эту директиву именно по этой причине, и то, что пример файла что-то делает, не означает, что механизм делает это по умолчанию.
Что не меняется, так это дальняя сторона. Сервер по-прежнему слушает там, где профиль говорит, что слушает, а порт назначения в конфигурации по-прежнему порт назначения. Динамический исходный порт меняет адрес возврата вашего собственного сокета и ничего — сокета сервера.
Он также ничего не скрывает. Ваш публичный адрес — это то, во что его преобразует маршрут, пакет по-прежнему проходит через локальную сеть, и тот, кто управляет этой сетью, по-прежнему видит поток. nobind не является ни функцией конфиденциальности, ни обходом брандмауэра.
Три условия, которые это решают
Один вопрос решает два других, поэтому ответьте на него, прежде чем что-либо редактировать. Если партнёр подключается наружу, остальные вопросы лишь уточняют уже принятое решение. Если он принимает входящие подключения, никакая настройка локального порта не делает его достижимым.
Инициирует ли этот партнёр соединение? Если он подключается наружу, динамический исходный порт безвреден и обычно предпочтителен, потому что ответ идёт тем же потоком обратно. Если он ждёт входящих подключений, динамический порт делает его недостижимым, если что-то впереди не публикует порт. Этот единственный ответ отделяет каждый клиентский профиль от каждого серверного.
Фильтрует ли маршрут по исходному порту? Строгое правило, написанное для одного известного порта, требует явного локального порта, и профиль должен записывать, какому правилу он соответствует. Большинство сетей фильтруют только по назначению, поэтому это условие встречается реже первого. Там, где оно применяется, оно перевешивает предпочтение динамического порта.
Делят ли несколько экземпляров хост? Один фиксированный порт не может обслужить два из них, а перезапущенный экземпляр может найти 1194 всё ещё в состоянии закрытия. Динамические порты устраняют этот конфликт, ничего больше не меняя. Если вы не можете уверенно ответить на это, предположите «да» и позвольте ядру выбрать.
Где закреплённый порт — правильный ответ
Некоторые сети фильтруют и по исходному порту, и по назначению, поэтому оператор мог написать правило, которое пропускает трафик только из одного известного порта. Закрепление локального порта тогда правильно, и профиль должен нести комментарий с названием правила, которому соответствует. Закрепление ради симметрии с портом сервера не является причиной, потому что эти два числа ничего общего друг с другом не имеют. Если закрепление существует только потому, что оно было в шаблоне, удалите его.
Иначе закреплённый порт покупает неприятности: два клиента на одной машине не могут оба держать 1194, и второй терпит неудачу с ошибкой, указывающей на порт, а не на профиль. Контейнер, быстро перезапускающийся, упирается в ту же стену. Исправление — это директива, которую поставляемые профили уже содержали.
Сервер и клиент не симметричны
руководство OpenVPN 2.6 ставит nobind рядом с lport, что и есть аргумент в одной строке: один вариант говорит, что выбирает ядро, другой — что вы. Динамический локальный порт работает только для партнёра, который подключается наружу, потому что отвечающая сторона не может знать порт заранее. Поэтому копирование клиентского профиля на сервер создаёт слушателя, до которого никто не может добраться.
На хосте с несколькими сетевыми интерфейсами адрес — отдельное решение от порта. Привязка конкретного локального адреса и привязка конкретного порта — две разные настройки, и сервер с двумя восходящими каналами обычно закрепляет обе. Клиент, который закрепляет обе, принял ту же жёсткость без всякой выгоды.
Сводка о ролях, а не о безопасности: тот, кто подключается наружу, может быть гибким в отношении своего источника, а тот, кто отвечает, — нет. Ни один выбор не меняет того, что другая сторона узнаёт о вашей личности. Поэтому директива встречается в клиентских примерах и почти никогда в серверных.
Проверьте порт, выбранный ядром
После подключения читайте сокет, а не конфигурацию, потому что конфигурация заявляет намерение, а сокет — то, что произошло. Факты, которые стоит записать, — это локальный порт, удалённая конечная точка и слушает ли что-то ещё. На хосте Linux все три на расстоянии одной команды.
ss -unp | grep openvpn
ss -lunp | grep openvpn
sudo lsof -nP -i | grep openvpn
Клиент с nobind показывает высокий локальный порт и настроенный удалённый порт, что и есть ожидаемая форма. Сервер показывает слушающий сокет на своём настроенном порту, и если этого сокета нет, профиль либо не слушатель, либо не смог привязаться. Когда поток есть, но пакеты не возвращаются, сравните выбранный исходный порт с любым фильтром портов на пути перед редактированием профиля. Измените одну вещь, переподключитесь и снова прочитайте сокет.