tl; dr: Добавить явный маршрут к удаленному хосту мистической программы (/32).
Я посмотрел руководство OpenVPN, но остается неясным, может ли он делать это изначально (через --route). Чтобы быть в безопасности, используйте скрипты / программы с --up и --down . Важно отметить , что изменение маршрутизации конфигурации требует корень, который вы не имеете , когда --down работает , если --user также указан.
Чтобы быть переносимым, скрипту / программе --up потребуется выполнить следующее, в зависимости от того, как соединяется ваша таинственная программа:
- Разрешить удаленный IP-адрес загадочной программы ($remote_addr)
- Определите шлюз ($gateway) для удаленного IP-адреса - это может или не может быть шлюз по умолчанию
- Добавьте явный маршрут, например, ip route add $remote_addr via $gateway
Таким образом, он будет правильно работать с --redirect-gateway .
Скрипт / программа --down должен будет выполнять почти то же самое, за исключением того, что он должен удалить маршрут.
При написании скрипта (Bash) проблемы действительно начинаются уже с шага 1. Вам нужен только IP-адрес и больше ничего. Что-то вроде getent hosts сделало бы свое дело, но оно очень предпочитает адреса IPv6, что может или не может быть уместным. Другие инструменты (dig +short т.д.) Не используют распознаватель ОС, а напрямую запрашивают DNS, что может быть не тем, что вам нужно (например, /etc/hosts).
Шаг второй относительно легок на любой ОС (ip route get т.д.), Кроме Windows. В Windows вам нужно запрограммировать алгоритм, чтобы самостоятельно найти наиболее подходящий маршрут.
Если вы чувствуете, что все статично (удаленный IP-адрес, IP-адрес следующего перехода), вы также можете использовать OpenVPN --route:
route 1.2.3.4 255.255.255.255 10.1.2.3
... где 1.2.3.4 - это удаленный хост тайной программы, а 10.1.2.3 - следующий прыжок на маршрутизацию, чтобы достичь его.
Другое решение - не использовать --persist-tun , то есть сетевой интерфейс VPN будет полностью закрыт, когда OpenVPN потеряет соединение. Это имеет очень серьезное значение: трафик будет пропадать, как только соединение будет разорвано.