OpenVPN

2013.12.16

Предыдущая заметка по настройке OpenVPN была написана в 2010 году.  Тогда я использовал для подключения аплет для Network Manager и настройки были довольно простыми.  Сейчас ситуация изменилась, изменились и требования к подключению: теперь мне нужно не только попадать в удалённую сеть, но и возвращать некоторые порты, чтобы работали торренты и некоторые другие сложные приложения.  (Для простых случаев, когда просто надо куда-то сходить, я использую sshuttle.)

Во-первых, для аутентификации я всё ещё использую статические ключи («pre-shared static key»).  Это не так круто, как TLS и подписывание сертификатов, но, во-первых, мне сейчас не нужна VPN-ферма с кучей непроверенных клиентов, которых может понадобится отозвать, а во-вторых, у статических ключей есть одно важное преимущество: сессия шифрована с самого первого байта и механизмы DPI не могут опознать в ней OpenVPN.

Настройка сервера

Конфиг на сервере лежит в файле /etc/openvpn/umonkey-tcp.conf и выглядит очень просто:

dev tun
proto tcp-server
ifconfig 10.1.0.1 10.1.0.2
up ./umonkey.up
down ./umonkey.down
secret umonkey.key
ping 15
ping 15
ping-restart 45
ping-timer-rem
persist-tun
persist-key
verb 3

Рядом лежит файл umonkey-udp.conf, который отличается двумя строками:

proto udp
ifconfig 10.2.0.1 10.2.0.2

Таким образом я получаю VPN на стандартном порту 1194, к которому могу подключить клиента по протоколу TCP или UDP, в зависимости от ситуации (UDP иногда перестаёт работать, или оператор связи его иногда режет).

Возврат портов включает скрипт umonkey.up, выглядит так:

#!/bin/sh
# $0=cmd $1=tun_dev $2-tun_mtu $3=link_mtu $4=ifconfig_local_ip $5=ifconfig_remote_ip $6=[ init | restart ]

add_port()
{
    iptables -A PREROUTING -t nat -i eth0 -p $1 --dport $3 -j DNAT --to $2:$3
    iptables -A FORWARD -p $1 -d $2 --dport $3 -j ACCEPT
}

# Forward port 12345 (rtorrent).
add_port tcp $4 12345
add_port udp $4 12345

# Forward UDP port for DHT (rtorrent).
add_port udp $4 6881

Отмена этих операций прописана в аналогичном файле umonkey.down, в котором для iptables вместо ключа -A указан ключ -D.

Настройка клиента

На клиенте я использую почти такой же конфигурационный файл, только с опцией remote и перевёрнутыми IP-адресами.

Для подключения к разным сетям я использую скрипты вроде vpn-foo, которые выглядят примерно так:

#!/bin/sh
cd $HOME/.openvpn
umask 077
sudo openvpn --config $HOME/.openvpn/example.conf 2>&1 | tee example.log

Запускаю скрипт, делаю всё, что нужно сделать через VPN, прерываю скрипт по Ctrl+C.  Вот так просто.

Следить за развитием событий можно через RSS ленту или почтовую рассылку.