ifconfig-noexec не спасёт вашу SSH-сессию: что он на самом деле делает
Он подавляет собственную настройку адреса интерфейса в OpenVPN. Он не резервирует маршрут ответа для SSH, не отключает все изменения маршрутов и не выдаёт недостающий адрес.
В одной ветке форума ifconfig-noexec его предлагают как исправление, которое сохраняет SSH-сессию живой при поднятии туннеля. Рассуждение звучит правдоподобно, пока не проверишь, чего эта опция на самом деле касается. Она мешает OpenVPN настраивать адрес интерфейса туннеля и вместо этого передаёт эти значения скриптам; о том, куда уходят ответы на ваше управляющее соединение, она не говорит ничего. Вера в обратное даёт туннель без пригодного адреса и SSH-сессию, которая всё равно обрывается.
Что эта опция на самом деле делегирует
По умолчанию клиент поднимает устройство туннеля и назначает локальный и удалённый адреса, которые передал ему сервер. Когда ifconfig-noexec задана, этот шаг пропускается, а согласованные значения экспортируются в окружение скриптов, чтобы что-то другое могло их применить.
Владение переходит. На его месте ничего не выдумывается.
Итак, вопрос, на который отвечает опция, — кто настраивает интерфейс, а вопрос, на который она не отвечает, — как пакеты находят путь обратно к вам. Держите эти две вещи раздельно, иначе проведёте весь вечер, редактируя маршруты, чтобы компенсировать интерфейс без адреса.
Три похожие опции с разными задачами
Это семейство легко перепутать, потому что имена различаются одним словом, а симптомы пересекаются. Прочитайте, что подавляет каждая, прежде чем выбирать любую.
| Option | What stops happening |
|---|---|
ifconfig-noexec | OpenVPN's own tunnel-address configuration; values go to scripts instead |
route-noexec | Automatic route addition and removal; route details go to a script |
route-nopull | Server-pushed routes and related options such as DNS are rejected |
Это альтернативы, которые нужно понимать по отдельности, а не набор для склейки. Подавление настройки адреса не подавляет изменения маршрутов, правила брандмауэра или проталкиваемые опции, несущие DNS. Делегированный скрипт также волен менять маршруты, и это решение, которое вы передаёте, а не избегаете.
Если клиент поставщика оборачивает движок, используйте его поддерживаемую интеграцию вместо того, чтобы класть директиву низкого уровня в профиль и надеяться, что обёртка её уважит. Обёртки часто пересоздают профиль при подключении, поэтому ручная правка исчезает без ошибки. Проверьте, где клиент хранит свои настройки, прежде чем тратить на файл целый вечер. Это относится к каждой строке таблицы, а не только к той, ради которой вы пришли.
SSH-сессия, которую вы хотели защитить
У SSH-соединения есть адрес источника, адрес назначения и путь ответа. На сервере, который только что установил полнотуннельное умолчание, ответ на ваш публичный адрес совпадает с туннелем, и VPN-шлюз его отбрасывает.
Ничто в настройке адресов интерфейса туннеля этого не меняет.
Исправляет это более конкретный маршрут для вашего адреса управления через шлюз до туннеля или правило политики, направляющее этот трафик, плюс настройки фильтра, которые применяет ваш хост. Две проблемы иногда появляются вместе, и так одну принимают за лекарство от другой. Проверяйте их по отдельности: поднимите туннель без опции, посмотрите на адрес интерфейса и путь ответа, затем решите, какая из двух действительно сломана.
Что должен взять на себя делегированный скрипт
Если вы действительно хотите, чтобы интерфейс настраивал другой владелец, перечислите работу: примените локальный и удалённый адрес, поднимите устройство, восстановите или удалите адресацию при разборке и сделайте то же самое снова после переподключения. Значения из одной удачной сессии нельзя зашивать в код, потому что в следующий раз сервер может выдать другую пару.
Переменные окружения, которые экспортирует клиент, — единственный поддерживаемый вход для этой работы.
env | grep -E '^ifconfig_|^route_'Внутри скрипта route-up эти переменные доступны; из задания cron или ручной оболочки — нет. Подтвердите, какой хук жизненного цикла использует ваша версия, и подтвердите, что хук запускается с достаточными правами для изменения интерфейса, поскольку клиент мог уже опуститься до непривилегированного пользователя.
Проверяйте весь жизненный цикл, а не одну сессию
Поднимите туннель, проверьте адрес на устройстве, затем переподключитесь и проверьте снова. Конфигурация, которая работает один раз и отказывает со второй попытки, обычно означает, что делегированный шаг выполняется только при первом подключении.
Затем проверьте оба критерия приёмки вместе: новое SSH-соединение по задуманному пути управления работает, и разрешённое приложение правильно использует туннель.
Старая SSH-сессия, которая случайно выживает, пока у туннеля нет адреса, — не успех, и это ровно то состояние, которое создаёт опция, когда работу никто не берёт. Сначала проверьте адрес интерфейса, затем путь ответа управления, затем приложение. Если два из трёх неверны, опция переместила работу, но не дала ей владельца.