Глава 16 Серверное программное обеспечение (Сетевой сервис шифрования) - FreeS/WAN VPN (часть 2)
В этой главе
Linux OPENSSL сервер
Конфигурации
Команды
Организация защиты Openssl
Linux FreeS/WAN VPN
Настройка RSA private keys secrets
Требования по настройке сети для IPSec
Тестирование инсталляции
Здесь приводятся некоторые вещи, которые вы должны проверить для
корректной работы FreeS/WAN. Они важны, если вы не хотите получить
сообщения об ошибке при запуске VPN.
Шаг 1
Вам нужно включить TCP/IP forwarding на обоих шлюзах. В Red Hat Linux, это
в зависимости от версии делается так:
Для Red Hat Linux 6.1
Редактируйте файл network (vi /etc/sysconfig/network) и измените следующую
строку:
FORWARD_IPV4="false”
Должна быть:
FORWARD_IPV4="yes"
Вы должны перезапустить настройки сети, чтобы изменения вступили в силу:
[root@deep /]# /etc/rc.d/init.d/network restart
Bringing up interface lo [ OK ]
Bringing up interface eth0 [ OK ]
Bringing up interface eth1 [ OK ]
Для Red Hat Linux 6.2
Редактируйте файл “/etc/sysctl.conf” и добавьте следующую строку:
# Enable packet forwarding
net.ipv4.ip_forward = 1
Вы должны перезапустить настройки сети, чтобы изменения вступили в силу:
[root@deep /]# /etc/rc.d/init.d/network restart
Bringing up interface lo [ OK ]
Bringing up interface eth0 [ OK ]
Bringing up interface eth1 [ OK ]
Шаг 2
Помниту, что соединения с автоматическим снабжением ключами использует
ключи автоматически созданные демоном согласования ключей Pluto. Этот
демон стартуя устанавливает соединение с Pluto демоном на другом конце
туннеля. Из этих соображений шлюх IPSEC должен иметь правила фильтра
пакетов разрешающие следующие протоколы:
- UDP порт 500 для IKE реализации демона Pluto
- Протокол 50 для ESP шифрования и аутентификации
- Протокол 51 для аутентификации на уровне пакетов AH
Редактируйте скрипт firewall (vi /etc/rc.d/init.d/firewall) на обоих шлюзах и
добавьте следующие строки, чтобы разрешить IPSEC пакетам перемещаться
между обоими концами туннеля:
# FreeS/WAN IPSec VPN
# -------------------
# Если вы используете FreeSWAN IPSec VPN, вы должны заполнить
# адреса шлюзов в IPSECSG и виртуальных интурфейсов для
# FreeS/Wan IPSEC в параметре FREESWANVI. Смотрите начало
# этого скрипта для определения этих параметров.
# IPSECSG это разделенный пробелами список удаленных шлюзов.
# FREESWANVI это разделенный пробелами список виртуальных
# интерфейсов для реализации FreeS/Wan IPSEC.
# Включите только те, которые фактически используются.
# Разрешите протокол IPSEC из удаленных шлюзов на внешнем интерфейсе
# IPSEC использует три основных типа пакетов:
# IKE использует UDP протокол и порт 500,
# ESP использует протокол номер 50 и
# AH использует протокол номер 51
ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
-s $IPSECSG -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
-d $IPSECSG -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p 50 \
-s $IPSECSG -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p 50 \
-d $IPSECSG -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p 51 \
-s $IPSECSG -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p 51 \
-d $IPSECSG -j ACCEPT
# Разрешите весь трафик к виртуальному интерфейсу FreeS/WAN
ipchains -A input -i $FREESWANVI \
-s $ANYWHERE \
-d $ANYWHERE -j ACCEPT
ipchains -A output -i $FREESWANVI \
-s $ANYWHERE \
-d $ANYWHERE -j ACCEPT
# Пересылка всего из виртуального интерфейса FreeS/WAN IPSEC туннеля
ipchains -A forward -i $FREESWANVI \
-s $ANYWHERE \
-d $ANYWHERE -j ACCEPT
где EXTERNAL_INTERFACE="eth0" # Ваш внешний интерфейс к Интернет.
где ANYWHERE="any/0" # имеет значение все 0.0.0.0/0.
где IPSECSG=”208.164.186.2” # разделенный пробелами список удаленных VPN шлюзов.
где FREESWANVI=”ipsec0” # разделенный пробелами список виртуальных интерфейсов для FreeS/Wan.
ЗАМЕЧАНИЕ. Смотрите главу 7, “Сетевой брандмауэр” для большей
информации. Не забудьте добавить эти правила на других шлюзах.
Шаг 3
Подсистема rp_filter (связанная с защитой от IP spoofing) должна быть
выключена на обоих шлюзах для корректной работы IPSEC. Это достигается
проверкой значения содержащегося в файлах
“/proc/sys/net/ipv4/conf/ipsec0/rp_filter и “/proc/sys/net/ipv4/conf/eth0/rp_filter”.
Оно должно быть равно 0:
[root@deep /]# cat /proc/sys/net/ipv4/conf/ipsec0/rp_filter
0
[root@deep /]# cat /proc/sys/net/ipv4/conf/eth0/rp_filter
0
ЗАМЕЧАНИЕ. Подкаталог “ipsec0” в нашем примере будет создан только после
перезагрузки системы. Так, что проверить значение файла “rp_filter” в каталоге
“ipsec0” можно будет только когда система перезагрузится.
Для установки значения 0 (off) в оба файла вручную используйте команды:
[root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter
[root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
Также можно добавить эти строки в скрипт файл firewall (/etc/rc.d/init.d/firewall)
на обоих шлюзах, чтобы значение 0 (off) устанавливалось автоматически при
каждой загрузке системы:
# Disable IP spoofing protection to allow IPSEC to work properly
echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
ЗАМЕЧАНИЕ. В нашем примере мы предполагаем что для установления
соединений используется интерфейс eth0. Конечно, если вы используете eth1
вам надо просто заменить eth0 на eth1.
Если вы забудете сделать этот шаг, то получите на вашем терминале следующие
сообщения об ошибках при запуске FreeSWAN IPSEC:
ipsec_setup: WARNING: ipsec0 has route filtering turned on, KLIPS may not work
ipsec_setup: (/proc/sys/net/ipv4/conf/ipsec0/rp_filter = `1', should be 0)
ipsec_setup: WARNING: eth0 has route filtering turned on, KLIPS may not work
ipsec_setup: (/proc/sys/net/ipv4/conf/eth0/rp_filter = `1', should be 0)
Шаг 4
Важно заметить, что любые правила маскарадинга для внутренней сети, которая
использует IPSEC, должны находится после правил разрешающих трафик
связанный с IPSEC (шаги 2 и 3 выше), или машина будет маскарадить трафик
вместо пропускания его через IPSEC.
Редактируйте скрипт firewall (vi /etc/rc.d/init.d/firewall) на обоих шлюзовых
машинах и добавьте следующие строки позволяющие маскарадить пакеты
направляемые на удаленный шлюз и обратно:
# Маскарадинг внутреннего трафика.
# Весь внутренний трафик будет выглядеть.
ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET_1 -j MASQ
где EXTERNAL_INTERFACE="eth0" # Ваш внешний интерфейс в Интернет.
где LOCALNET_1=" 192.168.1.0/24" # диапазон внутренних адресов который вы
используете.
ЗАМЕЧАНИЕ. Смотрите главу 8 “Сетевой брандмауэр с поддержкой
маскарадинга и форвардингом” для большей информации.
Сейчас, вы можете перезагрузить вашу систему, и машины за шлюзом A
должны без проблем обмениваться информацией с машинами за шлюзом B.
Перезагрузите оба шлюза для запуска FreeS/WAN.
Просмотрите файл “/var/log/messages” для выявления сообщений о возникших
трудностях. Если все хорошо, то вы должны увидеть что-то подобное:
Feb 2 05:22:35 deep ipsec_setup: Starting FreeS/WAN IPSEC snap2000jan31b...
Feb 2 05:22:35 deep ipsec_setup: KLIPS debug `none'
Feb 2 05:22:35 deep ipsec_setup: KLIPS ipsec0 on eth0 192.168.1.1/255.255.255.0
broadcast 192.168.1.255
Feb 2 05:22:36 deep ipsec_setup: Disabling core dumps:
Feb 2 05:22:36 deep ipsec_setup: Starting Pluto (debug `none'):
Feb 2 05:22:37 deep ipsec_setup: Loading Pluto database `deep-mail':
Feb 2 05:22:37 deep ipsec_setup: Enabling Pluto negotiation:
Feb 2 05:22:37 deep ipsec_setup: Routing for Pluto conns `deep-mail':
Feb 2 05:22:37 deep ipsec_setup: Initiating Pluto tunnel `deep-mail':
Feb 2 05:22:39 deep ipsec_setup: 102 "deep-mail" #1: STATE_MAIN_I1: initiate
Feb 2 05:22:39 deep ipsec_setup: 104 "deep-mail" #1: STATE_MAIN_I2: from
STATE_MAIN_I1; sent MI2, expecting MR2
Feb 2 05:22:39 deep ipsec_setup: 106 "deep-mail" #1: STATE_MAIN_I3: from
STATE_MAIN_I2; sent MI3, expecting MR3
Feb 2 05:22:39 deep ipsec_setup: 004 "deep-mail" #1: STATE_MAIN_I4: SA
established
Feb 2 05:22:39 deep ipsec_setup: 110 "deep-mail" #2: STATE_QUICK_I1: initiate
Feb 2 05:22:39 deep ipsec_setup: 004 "deep-mail" #2: STATE_QUICK_I2: SA
established
Feb 2 05:22:39 deep ipsec_setup: ...FreeS/WAN IPSEC started
Изучите файл “/var/log/secure” для выявления возникших трудностей. Если все
хорошо, то вы должны увидеть нечто подобное:
Feb 21 14:45:42 deep Pluto[432]: Starting Pluto (FreeS/WAN Version 1.3)
Feb 21 14:45:43 deep Pluto[432]: added connection description "deep-mail"
Feb 21 14:45:43 deep Pluto[432]: listening for IKE messages
Feb 21 14:45:43 deep Pluto[432]: adding interface ipsec0/eth0 192.168.1.1
Feb 21 14:45:43 deep Pluto[432]: loading secrets from "/etc/ipsec.secrets"
Feb 21 14:45:43 deep Pluto[432]: "deep-mail" #1: initiating Main Mode
Feb 21 14:45:44 deep Pluto[432]: "deep-mail" #1: ISAKMP SA established
Feb 21 14:45:44 deep Pluto[432]: "deep-mail" #2: initiating Quick Mode
POLICY_RSASIG+POLICY_ENCRYPT+POLICY_AUTHENTICATE+POLICY_T
UNNEL+POLICY_PFS
Feb 21 14:45:46 deep Pluto[432]: "deep-mail" #2: sent QI2, IPsec SA established
Feb 21 14:45:47 deep Pluto[432]: "deep-mail" #3: responding to Main Mode
Feb 21 14:45:49 deep Pluto[432]: "deep-mail" #3: sent MR3, ISAKMP SA
established
Feb 21 14:45:49 deep Pluto[432]: "deep-mail" #4: responding to Quick Mode
Feb 21 14:45:50 deep Pluto[432]: "deep-mail" #4: IPsec SA established
На обоих шлюзах, должны существовать следующие элементы в каталоге
“/proc/net/”:
[root@deep /]# ls -l /proc/net/ipsec_*
-r--r--r-- 1 root root 0 Feb 2 05:30 /proc/net/ipsec_eroute
-r--r--r-- 1 root root 0 Feb 2 05:30 /proc/net/ipsec_klipsdebug
-r--r--r-- 1 root root 0 Feb 2 05:30 /proc/net/ipsec_spi
-r--r--r-- 1 root root 0 Feb 2 05:30 /proc/net/ipsec_spigrp
-r--r--r-- 1 root root 0 Feb 2 05:30 /proc/net/ipsec_spinew
-r--r--r-- 1 root root 0 Feb 2 05:30 /proc/net/ipsec_tncfg
-r--r--r-- 1 root root 0 Feb 2 05:30 /proc/net/ipsec_version
Интерфейсы IPSEC должны быть подключены поверх определенных
физических интерфейсов.
Проверьте что:
[root@deep /]# cat /proc/net/ipsec_tncfg
ipsec0 -> eth0 mtu=16260 -> 1500
ipsec1 -> NULL mtu=0 -> 0
ipsec2 -> NULL mtu=0 -> 0
ipsec3 -> NULL mtu=0 -> 0
Сейчас выполните следующую команду для получения минимальной
отладочной информации и проверьте, что полученный результат выглядит
примерно так:
[root@deep /]# ipsec look
deep.openna.com Fri Feb 4 17:25:17 EST 2000
============-============
192.168.1.1/32 -> 192.168.1.2/32 => tun0x106@192.168.1.2 esp0x4450894d@192.168.1.2
ah0x4450894c@192.168.1.2
------------=------------
ah0x3350f551@192.168.1.1 AH_HMAC_MD5: dir=in ooowin=32 seq=115 bit=0xffffffff alen=128
aklen=16 life(c,s,h)=bytes(16140,0,0)add(51656,0,0)use(54068,0,0)packets(115,0,0) idle=499
ah0x4450894c@192.168.1.2 AH_HMAC_MD5: dir=out ooowin=32 seq=2828 alen=128 aklen=16
life(c,s,h)=bytes(449488,0,0)add(51656,0,0)use(51656,0,0)packets(2828,0,0) idle=6
esp0x3350f552@192.168.1.1 ESP_3DES: dir=in ooowin=32 seq=115 bit=0xffffffff eklen=24
life(c,s,h)=bytes(13380,0,0)add(51656,0,0)use(54068,0,0)packets(115,0,0) idle=499
esp0x4450894d@192.168.1.2 ESP_3DES: dir=out ooowin=32 seq=2828 eklen=24
life(c,s,h)=bytes(381616,0,0)add(51656,0,0)use(51656,0,0)packets(2828,0,0) idle=6
tun0x105@192.168.1.1 IPIP: dir=in 192.168.1.2 -> 192.168.1.1 life(c,s,h)=add(51656,0,0)
tun0x106@192.168.1.2 IPIP: dir=out 192.168.1.1 -> 192.168.1.2
life(c,s,h)=bytes(327581,0,0)add(51656,0,0)use(51656,0,0)packets(2828,0,0) idle=6
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 ipsec0
192.168.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
192.168.1.2 192.168.1.2 255.255.255.255 UGH 0 0 0 ipsec0
Destination Gateway Genmask Flags MSS Window irtt Iface
Выполните команду ping 192.168.1.2 из 192.168.1.1. Если она работает, тогда
вы все установили корректно. Если не работает, то проверьте, что с машины
208.164.186.1 видна 208.164.186.2, что включен TCP-IP forwarding, и что на
вашем брандмауэре нет правил блокирующих пакеты и правила маскарадинга
находятся после правил, связанных с трафиком IPSec.
208.164.186.1 ---- 205.151.222.250 ---- 205.151.222.251 ---- 208.164.186.2
| |
192.168.1.0/24 192.168.1.0/24
| |
192.168.1.1 192.168.1.2
Последнее замечание об инсталляции FreeSWAN IPSEC, если вы столкнулись с
проблемами с которыми не можете разобраться, то вы можете использовать
следующую команду для просмотра отладочной информации, связанной с
системой шифрования/аутентификации IPSEC, которую вы можете послать в
список рассылки Linux-IPSEC (linux-ipsec@clinet.fi) с просьбой помочь вам:
[root@deep /]# ipsec barf > result
Эта команда первично предоставляла возможность удаленной отладки;
единичная команда упаковывает (и помечает) всю информацию, которая могла
бы быть уместна для диагностирования проблем в IPSEC.
Дополнительная документация
Для получения большей информации вы можете ознакомиться со страницами
руководства перечисленными ниже:
$ man ipsec (8) – вызов утилит IPSEC
$ man ipsec atoaddr, addrtoa (3) – конвертирование Интернет адресов в и из ASCII
$ man ipsec atoasr (3) – конвертирование ASCII в Интернет адреса, подсети и диапазоны
$ man ipsec atobytes, bytestoa (3) – конвертирование байтов двоичных данных в и из ASCII формат
$ man ipsec atodata, datatoa (3) – конвертирование двоичных данных из и в ASCII формат
$ man ipsec atosa, satoa (3) – конвертирует IPSEC Security Association IDs в и из ASCII
$ man ipsec atosubnet, subnettoa (3) – конвертирует подсеть/маска в ASCII форме в и из адрес
$ man ipsec atoul, ultoa (3) – конвертирует unsigned-long числа в и из ASCII
$ man ipsec auto (8) – контролирует автоматическое снабжение ключами соединений IPSEC
$ man ipsec barf (8) – выделение набора отладочной информации IPSEC
$ man ipsec bitstomask (3) – конвертирование набора единиц и нулей в маску подсети Интернет
$ man ipsec eroute (8) – манипулирование таблицами маршрутизации IPSEC
$ man ipsec goodmask (3) – является ли эта маска правильной?
$ man ipsec hostof (3) – получает Интернет адрес и маску подсети и возвращает часть связанную с хостом
$ man ipsec klipsdebug (8) – устанавливает отладочные возможности и уровень Klips (ядерная поддержка IPSEC)
$ man ipsec look (8) – выводит минимальную отладочную информацию
$ man ipsec manual (8) – поднимает и опускает IPSEC соединения с ручным снабжением ключами
$ man ipsec masktobits (3) – конвертирует маску подсети Интернет в набор нолей и единиц
$ man ipsec optionsfrom (3) – читает дополнительные опции командной строки из файла
$ man ipsec pluto (8) – демон манипуляции ключами IPsec IKE
$ man ipsec ranbits (8) – генератор случайного набора битов в виде ASCII
$ man ipsec rangetoa (3) – конвертирует диапазон Интернет адресов в ASCII
$ man ipsec rsasigkey (8) – создает сигнатурный ключ RSA
$ man ipsec setup (8) – контролирует подсистему IPSEC
$ man ipsec spi (8) – управляет IPSEC Security Associations
$ man ipsec spigrp (8) - группирует/расгруппирует IPSEC Security Associations
$ man ipsec subnetof (3) – получает Интернет адрес и маску подсети и вохвращает часть связанную с подсетью
$ man ipsec tncfg (8) - ассоциирует виртуальный интерфейс IPSEC с реальным интерфейсом
$ man ipsec whack (8) – контролирует интерфейс для демона управления ключами IPSEC
$ man ipsec.conf (5) – конфигурация и соединения IPSEC
$ man ipsec.secrets (5) – секреты для IKE/Ipsec аутентификации
Инсталлированные файлы
> /etc/rc.d/init.d/ipsec
> /etc/rc.d/rc0.d/K68ipsec
> /etc/rc.d/rc1.d/K68ipsec
> /usr/man/man3/ipsec_atoasr.3
> /usr/man/man3/ipsec_rangetoa.3
> /usr/man/man3/ipsec_atodata.3
> /etc/rc.d/rc2.d/S47ipsec
> /etc/rc.d/rc3.d/S47ipsec
> /etc/rc.d/rc4.d/S47ipsec
> /etc/rc.d/rc5.d/S47ipsec
> /etc/rc.d/rc6.d/K68ipsec
> /etc/ipsec.conf
> /etc/ipsec.secrets
> /usr/lib/ipsec
> /usr/lib/ipsec/spi
> /usr/lib/ipsec/eroute
> /usr/lib/ipsec/spigrp
> /usr/lib/ipsec/tncfg
> /usr/lib/ipsec/klipsdebug
> /usr/lib/ipsec/pluto
> /usr/lib/ipsec/whack
> /usr/lib/ipsec/ipsec
> /usr/lib/ipsec/barf
> /usr/lib/ipsec/manual
> /usr/lib/ipsec/auto
> /usr/lib/ipsec/look
> /usr/lib/ipsec/showdefaults
> /usr/lib/ipsec/_include
> /usr/lib/ipsec/_confread
> /usr/lib/ipsec/_keycensor
> /usr/lib/ipsec/_secretcensor
> /usr/lib/ipsec/_updown
> /usr/lib/ipsec/ranbits
> /usr/lib/ipsec/rsasigkey
> /usr/lib/ipsec/setup
> /usr/man/man3/ipsec_atoaddr.3
> /usr/man/man3/ipsec_addrtoa.3
> /usr/man/man3/ipsec_atosubnet.3
> /usr/man/man3/ipsec_subnettoa.3
> /usr/man/man3/ipsec_atobytes.3
> /usr/man/man3/ipsec_bytestoa.3
> /usr/man/man3/ipsec_datatoa.3
> /usr/man/man3/ipsec_atosa.3
> /usr/man/man3/ipsec_satoa.3
> /usr/man/man3/ipsec_atoul.3
> /usr/man/man3/ipsec_ultoa.3
> /usr/man/man3/ipsec_goodmask.3
> /usr/man/man3/ipsec_masktobits.3
> /usr/man/man3/ipsec_bitstomask.3
> /usr/man/man3/ipsec_optionsfrom.3
> /usr/man/man3/ipsec_subnetof.3
> /usr/man/man3/ipsec_hostof.3
> /usr/man/man3/ipsec_broadcastof.3
> /usr/man/man5/ipsec.secrets.5
> /usr/man/man5/ipsec.conf.5
> /usr/man/man8/ipsec_spi.8
> /usr/man/man8/ipsec.8
> /usr/man/man8/ipsec_eroute.8
> /usr/man/man8/ipsec_spigrp.8
> /usr/man/man8/ipsec_tncfg.8
> /usr/man/man8/ipsec_klipsdebug.8
> /usr/man/man8/ipsec_pluto.8
> /usr/man/man8/ipsec_whack.8
> /usr/man/man8/ipsec_barf.8
> /usr/man/man8/ipsec_look.8
> /usr/man/man8/ipsec_manual.8
> /usr/man/man8/ipsec_auto.8
> /usr/man/man8/ipsec_setup.8
> /usr/man/man8/ipsec_ranbits.8
> /usr/man/man8/ipsec_rsasigkey.8
> /usr/sbin/ipsec |