По мотивам статьи "Setting up a FreeBSD IPSec Tunnel", написанной John J. Rushford <jjr@alisa.org>
Введение
Предположим, вам нужно объединить 2 различных сети, находящихся в
разных офисах (возможно даже в разных городах), причем так, чтобы была
возможность получить доступ к открытым для доступа из сети папкам на
рабочих станциях с ОС от Microsoft, сетевым принтерам. Чтобы была
возможность полноценно работать с сетевым окружением в системах от
Microsoft между двумя офисами за приемлемую цену и с невысокими
временными издержками. Помимо этого, допустим, вам нужно иметь
web-сервер и почтовый сервер. Этого можно добиться, соединив каждый из
офисов с интернет, скажем, по xDSL технологии, что сравнительно не
дорого для предлагаемых скоростей в 1-7 Мбит/с.
В каждой из двух сетей установим по одной машине на FreeBSD
4.2-STABLE, которые будут выполнять роль межсетевого экрана (firewall)
и шлюза в интернет. Т.к. эти машины будут иметь постоянное соединение
с интернет, а также благодаря надежности ОС FreeBSD, на них следует
установить почтовые и web-сервера (если необходимо), а также
Samba-сервер (см. рис. 1). Шлюз, обозначенный bsd1 будет выполнять
роль контроллера домена для Windows, первичного Wins-сервера, а также
мастер-браузера для домена MS, который мы назовем scanningcomp.
Машина bsd1 с FreeBSD 4.2 имеет внутренний адрес 192.168.1.254, машина
bsd2 с FreeBSD 4.2 имеет внутренний адрес 192.168.2.254. Диапазоны
192.168.x.x предназначены для внутреннего использования и их обычно
назначают во внутренних сетях. Внешние IP-адреса будут являться
конечными точками для организации VPN. Предположим, что внешние адреса
будут 172.16.1.254 и 172.17.1.254 для bsd1 и bsd2 соответственно.
Рисунок 1.
Соединение с Internet.
Предположим, что стоит некий DSL модем (например от Cisco), который
передает ваши пакеты по PPP (или любому другому протоколу) провайдеру.
Пусть как bsd1, так и bsd2 подсоединены каждый к своему модему через
сетевой интерфейс rl0. Соответственно, в файле /etc/rc.conf должен
быть прописан для данного интерфейса внешний адрес.
Настройка сети Microsoft.
Для того, чтобы работать с сетью Microsoft, пользоваться открытыми для
доступа из сети папкам на рабочих станциях с ОС от Microsoft, сетевыми
принтерами между двумя сетями на обе машины с FreeBSD установлена
Samba 2.0.7, однако рекомендуем взять последнюю версию пакеты под
FreeBSD (например, версию 2.0.10), в основном из-за соображений
безопасности.
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-01:45.samba.asc
На обеих машинах не создавались никакие открытые по
сети ресурсы, они обеспечивают только вход в сеть, сервисы WINS для
двух сетей 192.168.1.0 и 192.168.2.0. bsd1 сконфигурирован как
основной контроллер домена (primary domain controller) и как WINS
сервер для обоих сетей. bsd2 сконфигурирован как мастер-браузер для
своей сети и как прокси WINS-сервер с основным сервером bsd1.
Все компьютеры с Windows сконфигурированы получать IP адрес от bsd1 и
bsd2 через DHCP сервер, установленный на каждой из FreeBSD-машин. DHCP
сервера сконфигурированы обслуживать только внутренние сетевые
интерфейсы. Они также помимо адреса выдают свои адреса в качестве
шлюза по умолчанию (default gateway), широковещательные адреса и адрес
сервера имен netbios - 192.168.1.254.
bsd1 сконфигурирован в качестве почтового сервера, соответственно, на
всех машинах с Windows в Microsoft Outlook прописан в качестве SMTP и
POP3 сервера его адрес 192.168.1.254. В качестве обслуживающей
POP-клиентов программы на bsd1 установлен qpopper
(/usr/ports/mail/qpopper).
Заметим, что для того, чтобы нормально функционировала почта, внешний
адрес bsd1 должен быть прописан в MX записях зоны, которую он
обслуживает.
На обоих машинах также был установлен и настроен named для
обслуживания DNS запросов, перенаправляя их к DNS серверу провайдера.
На машину bsd1 установлен Webmin для управления пользователями и
сконфигурирован таким образом, что smbpasswd устанавливается равным
паролю unix, т.е. оба пароля одинаковы.
Конфигурация ядра FreeBSD 4.2-STABLE
Обе машины с FreeBSD должны быть сконфигурированы в качестве
межсетевых экранов (firewalls) для защиты внутренних сетей и должны
иметь опции IPSec для организации туннеля. Посему, в конфигурации ядра
должны быть следующие опции (конфиг ядра находится в
/usr/src/sys/i386/conf/).
# IP security
options IPSEC
options IPSEC_ESP
options IPSEC_DEBUG
# Псевдо-интерфейс для тунеля
pseudo-device gif 4
# Berkeley packet filter для dhcp.
pseudo-device bpf 4
# Firewall
options IPFIREWALL
options IPDIVERT
options IPFILTER
options IPFILTER_LOG
Для запуска firewall должны быть следующие опции в файле /etc/rc.conf:
gateway_enable="YES"
defaultrouter="172.x.1.110" # - выдается провайдером - адрес шлюза в
интернет
firewall_enable="YES"
firewall_type="open"
natd_enable="YES"
natd_interface="rl0"
named_enable="YES"
Конфигурация туннеля IPSec FreeBSD 4.2-STABLE
Чтобы обеспечить автоматический обмен ключами для работы IPSec между
двумя FreeBSD-машинами, загрузим и установим демон raacon, который
находится в коллекции потров. Выполните:
#cd /usr/ports/security/racoon ; make all install clean
После установки конфигурационные файлы для racoon находятся в
/usr/loca/etc/racoon/. Не будем менять конфигурацию по умолчанию, т.е.
оставим файл /usr/local/etc/racoon/racoon.conf как есть. Отредактируем
файл ключа (/usr/local/etc/racoon/psk.txt), добавив туда секретные
ключи.
# /usr/local/etc/racoon/psk.txt
# IPv4/v6 addresses
#
192.168.1.254 testkey
192.168.2.254 testkey
Файл с ключами следует защитить и установить права 0600:
# chown root.wheel /usr/local/etc/racoon/psk.txt
# chmod 0600 /usr/local/etc/racoon/psk.txt
Для того, чтобы автоматически стартовать racoon при загрузке, создадим
скрипт /etc/rc.local:
#!/bin/sh
#
# /etc/rc.local
#
# dhcp server
if [ -x /usr/local/sbin/dhcpd ]; then
echo -n "dhcpd "
/usr/local/sbin/dhcpd -cf /etc/dhcpd.conf rl1
fi
# webmin server
if [ -x /etc/webmin/start ]; then
echo -n "webmin "
/etc/webmin/start
fi
# racoon key exchange server
if [ -x /usr/local/sbin/racoon ]; then
echo -n "racoon "
/usr/local/sbin/racoon -f /usr/local/etc/racoon/racoon.conf
fi
Или же можно создать свои и поместить их /usr/local/etc/rc.d/. Для
того, чтобы создать соединение и обеспечить маршрут между двумя
сетями, создадим следующий скрипт /usr/local/etc/rc.d/tunnel.sh:
#!/bin/sh
#
BSD1_IP="192.168.1.254"
BSD1_PUB_IP="172.16.1.254"
BSD1_NET="192.168.1.0/24"
BSD2_IP="192.168.2.254"
BSD2_PUB_IP="172.17.1.254"
BSD2_NET="192.168.2.0/24"
GIF0="gif0 inet"
GIFCONFIG="/usr/sbin/gifconfig"
IFCONFIG="/sbin/ifconfig"
HOSTNAME=`/bin/hostname`
NETMASK="255.255.255.0"
echo "nStarting ipsec tunnel... "
case $HOSTNAME in
bsd1)
$GIFCONFIG $GIF0 $BSD1_PUB_IP $BSD2_PUB_IP
$IFCONFIG $GIF0 $BSD1_IP $BSD2_IP $NETMASK
/usr/sbin/setkey -FP
/usr/sbin/setkey -F
/usr/sbin/setkey -c << EOF
spdadd $BSD1_NET $BSD2_NET any -P out ipsec
esp/tunnel/${BSD1_IP}-${BSD2_IP}/require;
spdadd $BSD2_NET $BSD1_NET any -P in ipsec
esp/tunnel/${BSD2_IP}-${BSD1_IP}/require;
EOF
/sbin/route add $BSD2_NET $BSD1_IP
;;
bsd2)
$GIFCONFIG $GIF0 $BSD2_PUB_IP $BSD1_PUB_IP
$IFCONFIG $GIF0 $BSD2_IP $BSD1_IP $NETMASK
/usr/sbin/setkey -FP
/usr/sbin/setkey -F
/usr/sbin/setkey -c << EOF
spdadd $BSD2_NET $BSD1_NET any -P out ipsec
esp/tunnel/${BSD2_IP}-${BSD1_IP}/require;
spdadd $BSD1_NET $BSD2_NET any -P in ipsec
esp/tunnel/${BSD1_IP}-${BSD2_IP}/require;
EOF
/sbin/route add $BSD1_NET $BSD2_IP
;;
esac
Важно заметить, что конечными точками туннеля являются 192.168.1.254 и
192.168.2.254. Широковещательный трафик не будет проходить между
сетями (это следует учесть при настройке Samba, т.к. следует
использовать IP адрес сервера, а не широковещательный адрес для
remote_announce в другой сети).
После перекомпиляции ядра и перезагрузке шлюзы при первом обращении из
одной сети в другую установят шифрованное соединение между собой, по
которому будет проходить межсетевой трафик.
Ссылки:
- Setting up a FreeBSD IPSec Tunnel (http://www.freebsddiary.org/ipsec-tunnel.php)
- NetBSD Documentation: NetBSD IPsec (http://www.netbsd.org/Documentation/network/ipsec/)
- FreeBSD IPsec mini-HOWTO (http://www.daemonnews.org/200101/ipsec-howto.html)
559 Прочтений • [[FreeBSD] Установка и настройка IPSec туннеля на FreeBSD. (freebsd ipsec tunnel)] [08.05.2012] [Комментариев: 0]