Туннель OpenVPN внутри SSH

Внезапно потребовалось пробросить OpenVPN внутри SSH туннеля. Дело в том, что зачастую мобильные интернет провайдеры режут трафик OpenVPN и шифрованное соединение получается очень медленным. Кроме того, опыт посещения КНР одним моим знакомым показал, что OpenVPN успешно запрещен наружу великой китайской стеной(файрволом), а SSH как раз разрешен и работает.
Я использую в качестве роутера OrangePi с Ubuntu 16 и модифицированный Залманзоном модем Huawei E3372, который прошит, как сетевая карта. Действовал я так:
Первым делом установил, естественно, openvpn — сервер на домашней тачке и openvpn клиент на OrangePi с модемом. Тема разжевана в интернетах очень подробно, и даже у меня есть заметка по установке клиента и сервера OpenVPN. Кроме того, на клиенте я установил программку поддержания SSH туннелей autossh.

apt install autossh

Следует обратить внимание на некоторые опции в конфигах OpenVPN сервера и клиента:
В конфиге сервера OpenVPN (обычно лежит /etc/openvpn/openvpn.conf) я использую TCP а не UDP, это опция proto tcp
В опции remote IP-OpenVPN-SERVER указываем

remote localhost 1194

Соответственно, в конфиге клиента тоже используем TCP
Пробрасываем порт с сервера на клиента используя ssh туннель:

ssh user@IP.ADDR.OpenVPN.SERVER -L 1194:localhost:1194

Обращаю внимание — перед тем, как включить openvpn чтобы он заработал через SSH туннель, нам нужно пробросить наружу IP адрес сервера OpenVPN и IP адрес ДНС. Для этого требуется добавить в файрвол следующие строчки:

IP='IP.ADDR.OpenVPN.SERVER'
OldGW='192.168.8.1'
 
ssh -N -f $IP -L 1194:localhost:1194
 
route add -host $IP gw $OldGW
route add -host 8.8.8.8 gw $OldGW
route add -host 8.8.4.4 gw $OldGW

Здесь присутствуют два параметра — первый это IP сервера VPN, а второй нужно выяснить ДО старта OpenVPN. Проще всего это сделать командой ip route:

ip route | grep default
default via 192.168.8.1 dev enx0c5b8f279a64

Видим, что текущий route default IP 192.168.8.1, его и указываем в файрвол
Наконец запускаем клиента OpenVPN:

sudo service openvpn restart

И проверяем работу нашего OpenVPN туннеля, работающего внутри SSH
Для того, чтобы SSH тунель работал надежно и переподнимался при обрыве соединения, autossh мониторил наш SSH тунель, необходимо его настроить. Для этого инициализируем необходимые переменные и будем использовать для туннеля autossh вместо ssh:

export AUTOSSH_GATETIME=0
export AUTOSSH_PORT=1194 
/usr/lib/autossh/autossh root@$IP -N -f -L 1194:localhost:1194

Конечно же, внутри ssh туннеля можно пробросить vpn pptp, l2tp (даже если у провайдера запрещен gre трафик 🙂 ), диск через sshfs, или еще что то, это безопасно даже без шифрования, ведь трафик внутри SSH туннеля зашифрован.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *