В моей настройке сначала нужно подключиться к VPN, а затем подключиться к серверу по SSH.
В настоящее время я делаю так:
openvpn myconfig.ovpn
ssh myuser@myserver
что заставляет весь мой сетевой трафик проходить через этот VPN.
Однако я делаюнетхочу, чтобы весь мой трафик данных проходил через этот VPN. Используя GNU/Linux, какие инструменты мне использовать, чтобы использовать VPN только в одном конкретном соединении ssh?
То есть, какие инструменты я могу использовать в bash-скрипте, чтобы иметь возможность делать следующее:
ssh-over-vpn.sh myuser.ovpn [email protected]
и использовать конфигурацию vpn только для ssh-подключения[email protected]?
Мой текущий файл конфигурации myuser.ovpn имеет:
client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 200.200.200.18 443
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-GCM
setenv opt block-outside-dns
key-direction 1
verb 3
<ca> ... </ca> <cert> ...<key> ...<tls-auth> ...
решение1
Однако я не хочу, чтобы весь мой трафик данных проходил через этот VPN. Используя GNU/Linux, какие инструменты мне использовать, чтобы использовать VPN только в одном конкретном соединении ssh?
Измените конфигурацию клиента OpenVPN нанетизвлечь маршрут «по умолчанию» с сервера; вместо этого указать только необходимые маршруты:
route-nopull
route 10.0.0.66 255.255.255.255 vpn_gateway
То есть, какие инструменты я могу использовать в bash-скрипте, чтобы иметь возможность делать следующее:
Выбор невелик. Аналогичные инструменты относительно просты для SOCKS-прокси (например, torify), поскольку туннели транспортного уровня напрямую сопоставляются с сокетами, которые создает обернутая программа – это становитсянемногосложнее с туннелями IP-уровня (VPN), поскольку в этом случае инструменту оболочки придется перереализовывать большую часть сетевого стека операционной системы (генерировать IP-пакеты, сопоставлять полученные пакеты с эмулируемыми сокетами...) в дополнение к перереализаци самого протокола OpenVPN.
Самое близкое, что вы могли бы использовать, этосетевые пространства имен(один из строительных блоков для контейнеров), которые дают программе полностью изолированный набор интерфейсов и таблиц маршрутизации. Легко создать сетевое пространство имен с помощью unshare
или ip netns
и запускать программы внутри, но по умолчанию они отключены (клиент openvpn не будет иметь доступа к серверу), поэтому вам также нужно связать его с "главным" пространством имен с помощью veth и т. д.
Вся эта настройка пространства имен в конечном итоге приводит к повторной реализации частей Docker/nspawn/etc, поэтому можно просто развернуть контейнер Docker, который запустит ваш клиент OpenVPN и клиент SSH.
решение2
Таким образом, VPN по своей сути не знают ничего, что находится выше третьего уровнямодель OSI, то есть они не могут видеть, какие порты или протоколы используются. Возможно, можно использовать магию брандмауэра, чтобы добиться желаемого эффекта, но я бы рекомендовал вам использовать SSH напрямую.
Я предполагаю, что все задействованные системы и сети принадлежат вам и управляются вами. SSH — очень безопасный протокол при правильной настройке, и его использование через Интернет должно быть таким же безопасным, как и OpenVPN. Есть несколько замечательныхгидыдля "укрепления" openssh. Еще несколько рекомендаций по безопасности:
- Измените порт сервера на что-то непонятное.Это на самом деле не делает его более "безопасным" как таковым, но это уменьшает количество веб-скрейпинговых ботов, которые заполняют логи неудачными попытками входа. Я сделал это несколько лет назад, и с тех пор не видел ни одной попытки.
- Посмотрите на fail2ban.Это удобная программа, которая отслеживает попытки входа в систему и «запрещает» IP-адресам доступ к вашему серверу после ряда неудачных попыток, добавляя правило брандмауэра в iptables. Это фантастика.
После этого вы сможете использовать опцию конфигурации ProxyJump в openssh, чтобы использовать это соединение в качестве туннеля для других соединений в локальной сети.
Надеюсь это поможет!