vpnd - организация защищённого VPN-туннеля под FreeBSD [2011]
Возникла необходимость поднять туннель между двумя машинами - 6.0 и 4.11 FreeBSD. Вначале хотел сделать на racoon, но произошёл косяк - при запуске racoon фряха(6.0) падала... Мальца поковырявшись понял - причину я не знаю, и определить не могу... Чтож - это решение не единственное, но т.к. людям надо было работать (происходило это на фоне сдохшей мамы старого сервера, и в процессе переноса всего и настройки нового), временно поднял нешифрованный туннель на gif-интерфейсах и полез в порты - смотреть что ещё есть на тему vpn. Openvpn - штука популярная, но документация и мануалы какие-то невнятные - даже не стал ставить. Зато нашлось другое решение - vpnd, по нему на русском не было вообще, зато подкупил пример конфига, в пять строк, на сайте разработчика. Решил поставить, для начала на машине с FreeBSD6.0:
/usr/local/etc/>vpnd -m vpnd.key
This may take a while. Please continue working in another session to allow
gathering of random data.
New key file /usr/local/etc/vpnd.key created.
/usr/local/etc/>
/usr/local/etc/>ls -alh | grep vpnd.key
-r-------- 1 root wheel 72B 15 мар 20:34 vpnd.key
/usr/local/etc/>
И делаем такой конфиг /usr/local/etc/vpnd.conf
# Конфиг vpnd
# Где лежит pid
pidfile /var/run/vpnd.pid
# `Рандом` девайс
randomdev /dev/urandom
# Режим работы (клиент, или сервер)
mode server
# IP и порт клиента
client 222.222.222.222538
# IP и порт сервера
server 111.111.111.111599
# Локальный IP (из локальной частной сети)
local 192.168.10.254
# Удалённый IP (из удалённой частной сети)
remote 192.168.20.254
# Файло с ключом
keyfile /usr/local/etc/vpnd.key
# следующие строки понадобились ввиду большого времени отклика,
# Причём без последних двух (обе про компрессию) тормозило вообще жутко
# - едва ли не байты в секунду.
keepalive 2
noanswer 3
retry 5
nocslip
nocompress
После чего добавляем пару строк в /etc/rc.conf и запускаем демона:
В итоге у нас появился новый интерфейс sl0, и слушаемый порт - tcp:599. Сразу разрешаем его в файрволле, строками типа (до natd!):
${FwCMD} add allow tcp from 222.222.222.222 to ${IpOut} 599 via ${LanOut}
${FwCMD} add allow ip from any to any via ${LanTunnel}
${FwCMD} add allow ip from 192.168.10.0/24 to 192.168.20.0/24 via ${LanIn}
${FwCMD} add allow ip from 192.168.20.0/24 to 192.168.10.0/24 via ${LanIn}
где ${IpOut} - внешний IP машины, ${LanOut} - внешняя сетевуха, ${LanTunnel} - имя туннельного интерфейса (sl0 - но я не уверен в необходимости этого правила, ибо без него работает, но по этому правилу ходят пакеты - подозреваю оно перекрывалось каким-то другим. Лучше добавить.) Всё. Идём на другую машину, захватив с собой нагенерённый ключ - он должен быть одинаковым (я по ftp перенёс, хотя это несекурно :))). Для начала выставляем права на ключ:
Затем ставим vpnd из портов, как и на первой машине, и делаем такой конфиг:
# Конфиг vpnd
# Где лежит pid
pidfile /var/run/vpnd.pid
# `Рандом` девайс
randomdev /dev/urandom
# Режим работы (клиент, или сервер)
mode client
# IP и порт клиента
client 222.222.222.222538
# IP и порт сервера
server 111.111.111.111599
# Локальный IP (из локальной частной сети)
local 192.168.20.254
# Удалённый IP (из удалённой частной сети)
remote 192.168.10.254
# Файло с ключом
keyfile /usr/local/etc/vpnd.key
# следующие строки понадобились ввиду большого времени отклика,
# Причём без последних двух (обе про компрессию) тормозило вообще жутко
# - едва ли не байты в секунду.
keepalive 2
noanswer 3
retry 5
nocslip
nocompress
Конфиги отличаются совсем немного - тремя строками. После чего запускаем vpnd:
/usr/local/etc/>rc.d/vpnd.sh start
.: Can't open /etc/rc.subr: No such file or directory
Тут была засада - неверный путь в скрипте запуска. Поправил на тот, что в 4.11 (/usr/local/etc/rc.subr), и всё завелось:
${FwCMD} add allow tcp from 111.111.111.111 to ${IpOut} 538
${FwCMD} add allow ip from any to any via ${LanTunnel}
${FwCMD} add allow ip from 192.168.10.0/24 to 192.168.20.0/24 via ${LanIn}
${FwCMD} add allow ip from 192.168.20.0/24 to 192.168.10.0/24 via ${LanIn}
и пробуем пингануть удалённую машину:
/usr/home/lissyara/>ping 192.168.10.254 PING 192.168.10.254 (192.168.10.254): 56 data bytes 64 bytes from 192.168.10.254: icmp_seq=0 ttl=64 time=140.558 ms 64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=141.514 ms 64 bytes from 192.168.10.254: icmp_seq=2 ttl=64 time=139.954 ms 64 bytes from 192.168.10.254: icmp_seq=3 ttl=64 time=139.423 ms 64 bytes from 192.168.10.254: icmp_seq=4 ttl=64 time=139.855 ms 64 bytes from 192.168.10.254: icmp_seq=5 ttl=64 time=141.216 ms ^C --- 192.168.10.254 ping statistics --- 6 packets transmitted, 6 packets received, 0% packet loss round-trip min/avg/max/stddev = 139.423/140.420/141.514/0.751 ms /usr/home/lissyara/>
Тока не надо пугаться временем ответа - в этом виноват не vpn а поганый провайдер... Итак, все забегало, но пока лишь между этими машинами - надо добавить роутинг, чтобы можно было лазить между сетями - действия одинаковые для обоих машин, только будут разные в таблицах роутинга. Ввиду того, что скрипты в /usr/local/etc/rc.d запускаются в алфавитном порядке, у меня возникли проблемы - у меня уже был файл, заполнявший таблицу маршрутизации (кстати, её можно посмотреть командой netstat -r), и назывался он вполне логично - route.sh, и запускаться он должен был до vpn. Потому пришлось схитрить:
/usr/local/etc/rc.d/>ping 192.168.10.1 PING 192.168.10.1 (192.168.10.1): 56 data bytes 64 bytes from 192.168.10.1: icmp_seq=0 ttl=127 time=140.528 ms 64 bytes from 192.168.10.1: icmp_seq=1 ttl=127 time=140.671 ms 64 bytes from 192.168.10.1: icmp_seq=2 ttl=127 time=140.117 ms 64 bytes from 192.168.10.1: icmp_seq=3 ttl=127 time=140.556 ms 64 bytes from 192.168.10.1: icmp_seq=4 ttl=127 time=140.991 ms ^C --- 192.168.10.1 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 140.117/140.573/140.991/0.281 ms /usr/local/etc/rc.d/>
P.S. Советую прочесть документацию на сайте разработчика и идущую в комплекте, возможности по конфигурированию гораздо шире - в частности, вторая машина (клиент) может иметь динамический адрес, можно определить время жизни ключа, и отключить компрессию (по дефолту она включена) и многое другое.
P.S.2 Решение не самое быстрое, на сетях между которыми большое время отклика. Поэтому мне придётся искать что-то другое... :(