Продолжая тему туннелей привожу ещё один способ поднять туннель между серверами под OS FreeBSD — это netgraph туннели.
Netgraph туннель как и OpenVPN туннель позволяет выбрать порт и протокол по которому будет устанавливаться туннель.
Их основное отличие в том, что netgraph туннель реализован на уровне ядра системы и использует все доступные ядра CPU, а OpenVPN реализован в userland`е и использует только одно ядро CPU.
Задача
Поднять netgraph туннель между двумя FreeBSD серверами и пророутить через туннель некоторые подсети.
Дано
- Внешний IP-адрес сервера FreeBSD1: 1.1.1.1
- Внешний IP-адрес сервера FreeBSD2: 2.2.2.2
- Тунельный IP-адрес сервера FreeBSD1: 10.0.0.1
- Тунельный IP-адрес сервера FreeBSD2: 10.0.0.2
Настройка
Туннель устанавливается между двумя внешнему IP-адресами по выбранному нами порту 2000 и протоколу UDP, на туннеле назначаются IP-адреса из серой подсети 10.0.0.0/30.
Я приведу настройку только одной стороны, т.к. вторая сторона это просто зеркальное отражение первой.
Создадим интерфейс ng:
# ngctl mkpeer iface dummy inet
Укажем что будем использовать протокол UDP:
# ngctl mkpeer ng0: ksocket inet inet/dgram/udp
Укажем внешний IP сервера FreeBSD-1 (с которого мы и начали настройку) и зададим порт:
# ngctl msg ng0:inet bind inet/1.1.1.1:2000
Укажем внешний IP сервера FreeBSD-2 и порт, на которой мы и устанавливаем туннель:
ngctl msg ng0:inet connect inet/2.2.2.2:2000
Назначим IP-адреса на сам туннель (созданный интерфейс ng0):
ifconfig ng0 10.0.0.1 10.0.0.2 netmask 255.255.255.252
Теперь можно посмотреть что получилось:
# ifconfig ng0 ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1500 inet 10.0.0.1 --> 10.0.0.2 netmask 0xfffffffc
Туннель с одной стороны готов, настройте зеркально вторую сторону (сервер FreeBSD-2) и вы должны «увидеть» (пинговать) туннельные IP-адреса с обоих сторон.
После чего можно уже роутить что угодно через установленный вами туннель.
Команда для уничтожения netgraph туннеля:
# ngctl shutdown ng0:
Внимание ! Символ двоеточия в конце это не очепятка, как многие думают, он должен там быть.
Для автозапуска туннеля заглянем в предоставленный нам пример /usr/share/examples/netgraph/udp.tunnel и создадим свой стартовый скрипт /usr/local/etc/rc.d/ng_tun_start.sh
#!/bin/sh
case "$1" in
stop)
if ifconfig ng0 >/dev/null 2>&1; then
ifconfig ng0 inet down delete >/dev/null 2>&1
ngctl shutdown ng0:
echo "tunnel ng0 was destroyed";
fi
;;
start)
LOC_EXTERIOR_IP=1.1.1.1
REM_EXTERIOR_IP=2.2.2.2
LOC_INTERIOR_IP=10.0.0.1
REM_INTERIOR_IP=10.0.0.2
UDP_TUNNEL_PORT=2000
if ifconfig ng0 >/dev/null 2>&1; then
echo "tunnel ng0 already up";
else
ngctl mkpeer iface dummy inet
ngctl mkpeer ng0: ksocket inet inet/dgram/udp
ngctl msg ng0:inet bind inet/${LOC_EXTERIOR_IP}:${UDP_TUNNEL_PORT}
ngctl msg ng0:inet connect inet/${REM_EXTERIOR_IP}:${UDP_TUNNEL_PORT}
ifconfig ng0 ${LOC_INTERIOR_IP} ${REM_INTERIOR_IP} netmask 255.255.255.252
fi
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
;;
esac
Теперь при старте сервера туннель будет автоматически создан и у вас есть возможность в ручную стартовать туннель:
# /usr/local/etc/rc.d/ng_tun_start.sh start
или разрушать его:
# /usr/local/etc/rc.d/ng_tun_start.sh stop
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.
Автор: Панфилов Алексей (lehis (at) subnets.ru)