До сих пор весьма распространено подключение, когда провайдер ставит свой роутер и выдает клиенту приватные адреса. Чтобы иметь возможность построить IPsec туннель через подобное подключение и был придуман NAT Traversal (NAT-T). В свое время я потратил много времени на осознание того, что нужно указывать в качестве локального и удаленного хостов на концах туннеля в OpenSWAN. Кому интересна эта тема, добро пожаловать под кат.
Все тесты я проводил на стенде, собрав вот такую конфигурацию:
![](https://habrastorage.org/files/66c/864/be2/66c864be2daa4a7784459780620de01d.jpg)
В данном случае задача состоит в том, чтоб построить IPsec туннель между FW1 и FW2, при этом FW1 имеет на WAN интерфейсе приватный адрес — 172.30.0.254 и находится за роутером провайдера.
Сразу оговорюсь, что есть несколько условий для этого и все зависит от возможности настройки роутера провайдера:
Вариант 1:
То есть все пакеты с исходящим адресом 2.2.2.2 и с адресом назначения 5.5.5.5 по протоколу UDP приходящие на порт 500 перенаправлять на 172.30.0.254(это наш FW1) также на порт 500. И тоже самое делать со всеми пакетами по протоколам 50 и 51(ESP и AH соответственно).
Это не NAT-T, на самом деле так работает обычный IPsec. Проблема в том, что этот метод может «заработать», а может и «не заработать», и никто не может дать гарантий(это во многом зависит от провайдера), поэтому советуют использовать второй вариант.
Вариант 2: NAT Traversal (NAT-T)
Как видно, тут используется только UDP протокол, который разрешен по умолчанию у большинства провайдеров.
Как устанавливать и настраивать OpenSWAN, на Хабре писали не раз, например, вот здесь, поэтому приведу просто примеры конфигураций.
Для FW1:
/etc/ipsec.conf
Для FW2:
/etc/ipsec.conf
с обоих сторон должна быть одинаковая запись ключа:
Ну и версия Openswan:
ipsec --version
Linux Openswan U2.6.37/K3.2.0-83-generic-pae (netkey)
перезапускаем OpenSWAN и проверяем:
/etc/init.d/ipsec restart
root@fw2:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:cd:12:76
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
root@fw2:~# ping -I eth0 192.168.0.1
PING 192.168.0.1 (192.168.0.1) from 10.0.0.1 eth0: 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=0.577 ms
Все тесты я проводил на стенде, собрав вот такую конфигурацию:
![](https://habrastorage.org/files/66c/864/be2/66c864be2daa4a7784459780620de01d.jpg)
В данном случае задача состоит в том, чтоб построить IPsec туннель между FW1 и FW2, при этом FW1 имеет на WAN интерфейсе приватный адрес — 172.30.0.254 и находится за роутером провайдера.
Сразу оговорюсь, что есть несколько условий для этого и все зависит от возможности настройки роутера провайдера:
Вариант 1:
ACTION | SOURCE | DESTINATION | PROTOCOL | PORT | FORWARD |
---|---|---|---|---|---|
DNAT | 2.2.2.2 | 5.5.5.5 | 50 | 172.30.0.254 | |
DNAT | 2.2.2.2 | 5.5.5.5 | 51 | 172.30.0.254 | |
DNAT | 2.2.2.2 | 5.5.5.5 | udp | 500 | 172.30.0.254:500 |
То есть все пакеты с исходящим адресом 2.2.2.2 и с адресом назначения 5.5.5.5 по протоколу UDP приходящие на порт 500 перенаправлять на 172.30.0.254(это наш FW1) также на порт 500. И тоже самое делать со всеми пакетами по протоколам 50 и 51(ESP и AH соответственно).
Это не NAT-T, на самом деле так работает обычный IPsec. Проблема в том, что этот метод может «заработать», а может и «не заработать», и никто не может дать гарантий(это во многом зависит от провайдера), поэтому советуют использовать второй вариант.
Вариант 2: NAT Traversal (NAT-T)
ACTION | SOURCE | DESTINATION | PROTOCOL | PORT | FORWARD |
---|---|---|---|---|---|
DNAT | 2.2.2.2 | 5.5.5.5 | udp | 500 | 172.30.0.254:500 |
DNAT | 2.2.2.2 | 5.5.5.5 | udp | 4500 | 172.30.0.254:4500 |
Как видно, тут используется только UDP протокол, который разрешен по умолчанию у большинства провайдеров.
Как устанавливать и настраивать OpenSWAN, на Хабре писали не раз, например, вот здесь, поэтому приведу просто примеры конфигураций.
Для FW1:
/etc/ipsec.conf
nat_traversal=yes protostack=netkey conn connection_to_fw2 type=tunnel auto=start authby=secret pfs=yes ike=aes256-sha1;modp2048 phase2=esp phase2alg=aes256-sha1;modp2048 left=172.30.0.254 leftnexthop=172.30.0.1 leftsourceip=192.168.0.1 leftsubnet=192.168.0.0/24 leftid=@left right=2.2.2.1 rightsubnets=10.0.0.0/24 rightid=@right
Для FW2:
/etc/ipsec.conf
nat_traversal=yes protostack=netkey conn connection_to_fw1 type=tunnel auto=start authby=secret pfs=yes ike=aes256-sha1;modp2048 phase2=esp phase2alg=aes256-sha1;modp2048 right=2.2.2.1 rightid=@right rightsourceip=10.0.0.1 rightsubnet=10.0.0.0/24 left=5.5.5.1 leftid=@left leftsubnet=192.168.0.0/24 leftnexthop=172.30.0.1
с обоих сторон должна быть одинаковая запись ключа:
@left @right : PSK "123456789"
Ну и версия Openswan:
ipsec --version
Linux Openswan U2.6.37/K3.2.0-83-generic-pae (netkey)
перезапускаем OpenSWAN и проверяем:
/etc/init.d/ipsec restart
root@fw2:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:cd:12:76
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
root@fw2:~# ping -I eth0 192.168.0.1
PING 192.168.0.1 (192.168.0.1) from 10.0.0.1 eth0: 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=0.577 ms
ValdikSS
Почему OpenSwan, а не, например, нормально обновляющийся Libreswan?
Почему в 2015 вы все еще используете ifconfig и /etc/init.d?
phantasm1c
Поддерживаю, незачем плодить туториалы на abandonware. Openswan, насколько мне известно, пилит один человек и делает это изредка (последний коммит в гитхабе — 13 марта).
Есть Strongswan, которым занимается профессор информационной безопасности: www.strongswan.org/about.html и который регулярно дорабатывается, судя по коммитам чуть ли не каждый день.
Есть Libreswan, разработка которого также ведётся довольно живо.
zorixx Автор
К сожалению, в нашей компании не я решаю какой софт использовать. Мне сказали — поднять на openswan, ибо он стоит у всех клиентов и я даже не разбирался в альтернативах, спасибо за подсказку, попробую посмотреть на возможность миграции.
Во втором вопросе не хватает альтернативы, почему ifconfig, а не ".....". Наверно дело привычки, и, к примеру, если вместо /etc/init.d я могу использовать service, но что вместо ifconfig — ума не приложу.
ValdikSS
ifconfig уже лет 10 не обновляется, нужно использовать ip. Вот хороший список устаревших команд и их аналогов.