Внезапно потребовалось пробросить 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 туннеля зашифрован.
В конфиге сервера нет параметра remote