/usr/home/lissyara/>cd /usr/ports/ /usr/ports/>make search name='vpnd' Port: vpnd-1.1.2 Path: /usr/ports/security/vpnd Info: VPN daemon offering transparent blowfish encryption between networks Maint: anders@FreeBSD.org B-deps: R-deps: WWW: http://vpnd.dotsrc.org/ /usr/ports/>cd /usr/ports/security/vpnd /usr/ports/security/vpnd/>make && make install && make clean
После чего генерим ключ:
/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.222 538 # IP и порт сервера server 111.111.111.111 599 # Локальный 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 и запускаем демона:
/usr/local/etc/rc.d/>echo '' >> /etc/rc.conf /usr/local/etc/rc.d/>echo 'vpnd_enable="YES"' >> /etc/rc.conf /usr/local/etc/rc.d/>echo '' >> /etc/rc.conf /usr/local/etc/>rc.d/vpnd.sh start Starting vpnd. /usr/local/etc/>rc.d/vpnd.sh start /usr/local/etc/rc.d/>sockstat | grep vpn root vpnd 45566 0 dgram -> /var/run/logpriv root vpnd 45566 3 tcp4 111.111.111.111:599 *:* /usr/local/etc/rc.d/> /usr/local/etc/rc.d/>ifconfig sl0: flags=9091<UP,POINTOPOINT,NOARP,LINK0,MULTICAST> mtu 1500 inet 192.168.10.254 --> 192.168.20.254 netmask 0xffffffff
В итоге у нас появился новый интерфейс 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 перенёс, хотя это несекурно :))). Для начала выставляем права на ключ:
/usr/local/etc/>ls -lah | grep vpnd.key -rw-r--r-- 1 root wheel 72B 15 мар 21:55 vpnd.key /usr/local/etc/>chmod 400 vpnd.key /usr/local/etc/>ls -lah | grep vpnd.key -r-------- 1 root wheel 72B 15 мар 21:55 vpnd.key /usr/local/etc/>
Затем ставим vpnd из портов, как и на первой машине, и делаем такой конфиг:
# Конфиг vpnd # Где лежит pid pidfile /var/run/vpnd.pid # `Рандом` девайс randomdev /dev/urandom # Режим работы (клиент, или сервер) mode client # IP и порт клиента client 222.222.222.222 538 # IP и порт сервера server 111.111.111.111 599 # Локальный 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), и всё завелось:
/usr/local/etc/>rc.d/vpnd.sh start Starting vpnd. /usr/local/etc/>ifconfig sl0: flags=9091<UP,POINTOPOINT,NOARP,LINK0,MULTICAST> mtu 1500 inet 192.168.20.254 --> 192.168.10.254 netmask 0xffffffff /usr/local/etc/>sockstat | grep vpn root vpnd 68626 3 tcp4 222.222.222.222:538 111.111.111.111:599 root vpnd 68626 0 dgram syslogd[124]:3 /usr/local/etc/>
Добавляем в файрволл такие правила:
${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}
и пробуем пингануть удалённую машину:
Тока не надо пугаться временем ответа - в этом виноват не vpn а поганый провайдер... Итак, все забегало, но пока лишь между этими машинами - надо добавить роутинг, чтобы можно было лазить между сетями - действия одинаковые для обоих машин, только будут разные в таблицах роутинга. Ввиду того, что скрипты в /usr/local/etc/rc.d запускаются в алфавитном порядке, у меня возникли проблемы - у меня уже был файл, заполнявший таблицу маршрутизации (кстати, её можно посмотреть командой netstat -r), и назывался он вполне логично - route.sh, и запускаться он должен был до vpn. Потому пришлось схитрить:
/usr/local/etc/rc.d/>ls -lah | grep vpn -r-xr-xr-x 1 root wheel 462B 15 мар 21:58 vpnd.sh /usr/local/etc/rc.d/>mv vpnd.sh 000.vpnd.sh /usr/local/etc/rc.d/>ls -lah | grep vpn -r-xr-xr-x 1 root wheel 462B 15 мар 21:58 000.vpnd.sh /usr/local/etc/rc.d/>
Теперь вначале будет запускаться VPN а потом мой скипт, такого содержания:/usr/local/etc/rc.d/route.sh:
#!/bin/sh # на первой машине (FreeBSD6.0) /sbin/route add 192.168.20.0/24 192.168.20.254
#!/bin/sh # на второй машине (FreeBSD4.11) /sbin/route add 192.168.10.0/24 192.168.10.254
После чего делаем его выполняемым, и запускаем.
/usr/local/etc/rc.d/>chmod +x route.sh /usr/local/etc/rc.d/>
И становятся видны машины внутри сетей:
P.S. Советую прочесть документацию на сайте разработчика и идущую в комплекте, возможности по конфигурированию гораздо шире - в частности, вторая машина (клиент) может иметь динамический адрес, можно определить время жизни ключа, и отключить компрессию (по дефолту она включена) и многое другое.P.S.2 Решение не самое быстрое, на сетях между которыми большое время отклика. Поэтому мне придётся искать что-то другое... :(