Настройка ip-ip тоннеля с IPsec шифрованием в Debian

Данная статья написана на основе моих мучений с тоннелем между нашими основными офисами. Исторически сложилось, что тоннель этот, был построен на базе ip-ip + IPsec и изначально он был между двумя FreeBSD шлюзами.

Шло время и шлюзы начали помирать. Вначале, умер один шлюз и нужно было его оперативно заменить, что и было сделано. Вместо него встал шлюза на моем любимом Debian.

В процессе настройки, выяснилось ужасное!! IPsec в этой связке не работал, причем не работал уже очень давно.

IPsec был настроен на работу между внешними ip, и тоннель работал между внешними ip, но однажды случился факап (4 провайдера назад), были изменены внешние ip, в конфигах ip-ip тоннеля они были поправлен — в IPsec нет. Вот и вышло, что IPsec не работал.

Т.к. фряху я не люблю и копаться с настройками тоннелей я не хотел, я просто привел в норму то, что уже было сделано, убедился в нормальной работе IPsec и забил.

Забил ровно до момента смерти второго BSD шлюза. Вместо умершего шлюза, был так же поставлен Debian и началось шаманство. Дабы учесть ошибки прошлого, и сделать все хорошо, я решил употребить иную схему применения связки ip-ip + IPsec — поднять ip-ip тоннель, а уже его содержимое, обернуть в IPsec.

Зачем я вообще решил оставить ip-ip тоннель?

И действительно, все мануалы, в том числе и официальная wiki решали задачу обходясь без тоннелей, т.е. просто шифровали трафик между внешними ip, для удобства привязывая их к виртуальным сетевушкам, а иногда и без них.

Вот официальная wiki в ней обошлись без сетевух. Тут повторили конфиг из wiki, но с применением виртуальных интерфейсов eth0:1.

Я не стал делать так, про нескольким причинам:

1. При шифрование трафика между внешними ip неминуемого появляется дырка в безопасности, в виде spoofing, т.е. на внешнем интересе, где должны быть сети класса А, появится сеть класса С и их придется разрешить.

2. Трафик между шлюзами, очень тяжело считать. Гораздо проще считать трафик на интерфейсе, чем трафик между сетями. Виртуальный eth0:1 тут тоже не спасает, ибо считается устаревшим и убогим и не поддерживается iptables.

3. Не наглядность конфигурации. Это конечно спорный момент, но для меня это так.

4. Усложнение, точнее нагромождение маршрутизации. Я люблю, когда все маршруты, идут через свои устройства. Это наглядно, это понятно.

Может быть описанные выше причины кому то покажутся и не причинами вовсе. Но у меня так.

При таком подходе я получаю полноценный интерфейс tun0, на котором можно легко и просто считать трафик, на основе которого получаются внятные маршруты, и который полностью поддерживается iptables. Конфигурация IPsec перестает зависеть от внешних ip и от маршрутизируемых сетей, что упрощает перенастройку, в случае чего.

В общем, к делу.

Ставим:  apt-get install racoon ipsec-tools

Вводные данные:

Внутренняя сеть на объекте А — 192.168.16.0/21

IP в тоннеля на стороне А — 192.168.77.1

Внешний IP на объекте А — 10.0.0.65

Внутренняя сеть на объекте В — 192.168.0.0/24

IP в тоннеля на стороне В — 192.168.77.2

Внешний IP на объекте В — 195.0.0.65

И настраиваем на первом шлюзе А в /etc/network/interfaces:

auto tun0
 iface tun0 inet static
 address 192.168.77.1
 network 255.255.255.255
 pointopoint 192.168.77.2
 mtu 1350
 pre-up /sbin/ip tunnel add tun0 mode ipip remote <strong>195.0.0.65</strong> local <strong>10.0.0.65</strong> dev eth0
 pre-up /sbin/ip link set tun0 up
 post-up /sbin/ip route add 192.168.0.0/24 dev tun0 src 192.168.77.1
 pre-down /sbin/ip route del 192.168.0.0/24 dev tun0 src 192.168.77.1
 post-down /sbin/ip link set tun0 down
 post-down /sbin/ip tunnel del tun0

И настраиваем на первом шлюзе В в /etc/network/interfaces:

auto tun0
 iface tun0 inet static
 address 192.168.77.2
 network 255.255.255.255
 pointopoint 192.168.77.1
 mtu 1350
 pre-up /sbin/ip tunnel add tun0 mode ipip remote <strong>10.0.0.65</strong> local <strong>195.0.0.65</strong> dev eth0
 pre-up /sbin/ip link set tun0 up
 post-up /sbin/ip route add 192.168.16.0/21 dev tun0 src 192.168.77.2
 pre-down /sbin/ip route del 192.168.16.0/21 dev tun0 src 192.168.77.2
 post-down /sbin/ip link set tun0 down
 post-down /sbin/ip tunnel del tun0

Так мы создали ip-ip тоннель между объектами и прописали маршруты через тоннель, до внутренних сетей. После перезагрузки или ifup tun0 пинги из сити А в сеть В и обратно должны ходить.

Теперь настраиваем IPsec:

В /etc/racoon/psk.txt  на объекте А пишем придуманную фразу и ip объекта В:

192.168.77.2  tryamromashka888

В /etc/racoon/psk.txt  на объекте В пишем придуманную фразу и ip объекта А:

192.168.77.1  tryamromashka888

В psk.txt на обоих объектах, вместо ip можно поставить звездочку, дабы не заморачиваться.

Конфиг /etc/racoon/racoon.conf на объекте А приводим к такому виду:

path pre_shared_key "/etc/racoon/psk.txt";
remote anonymous {
 exchange_mode main,aggressive;
 proposal {
 encryption_algorithm 3des;
 hash_algorithm sha1;
 authentication_method pre_shared_key;
 dh_group 2;
 }
 }
sainfo address 192.168.16.0/21 any address 192.168.0.0/24 any {
 pfs_group 2;
 lifetime time 1 hour;
 encryption_algorithm 3des, blowfish 448, rijndael;
 authentication_algorithm hmac_sha1, hmac_md5;
 compression_algorithm deflate;
 }

Конфиг /etc/racoon/racoon.conf на объекте В приводим к такому виду:

path pre_shared_key "/etc/racoon/psk.txt";
remote anonymous {
 exchange_mode main,aggressive;
 proposal {
 encryption_algorithm 3des;
 hash_algorithm sha1;
 authentication_method pre_shared_key;
 dh_group 2;
 }
 }
sainfo address 192.168.0.0/24 any address 192.168.16.0/21 any {
 pfs_group 2;
 lifetime time 1 hour;
 encryption_algorithm 3des, blowfish 448, rijndael;
 authentication_algorithm hmac_sha1, hmac_md5;
 compression_algorithm deflate;
 }

Конфиг /etc/ipsec-tools.conf на объекте А приводим к такому виду:

#!/usr/sbin/setkey -f
# NOTE: Do not use this file if you use racoon with racoon-tool
 # utility. racoon-tool will setup SAs and SPDs automatically using
 # /etc/racoon/racoon-tool.conf configuration.
 #
## Flush the SAD and SPD
 #
 flush;
 spdflush;
## Some sample SPDs for use racoon
 
spdadd 192.168.16.0/21 192.168.0.0/24 any -P out ipsec
 esp/tunnel/192.168.77.1-192.168.77.2/require;
spdadd 192.168.0.0/24 192.168.16.0/21 any -P in ipsec
 esp/tunnel/192.168.77.2-192.168.77.1/require;

Конфиг /etc/ipsec-tools.conf на объекте В приводим к такому виду:

#!/usr/sbin/setkey -f
# NOTE: Do not use this file if you use racoon with racoon-tool
 # utility. racoon-tool will setup SAs and SPDs automatically using
 # /etc/racoon/racoon-tool.conf configuration.
 #
## Flush the SAD and SPD
 #
 flush;
 spdflush;
## Some sample SPDs for use racoon
spdadd 192.168.0.0/24 192.168.16.0/21 any -P out ipsec
 esp/tunnel/192.168.77.2-192.168.77.1/require;
spdadd 192.168.16.0/21 192.168.0.0/24 any -P in ipsec
 esp/tunnel/192.168.77.1-192.168.77.2/require;

После этого на обоих шлюзах делаем /etc/init.d/setkey restart && /etc/init.d/racoon restart

и смотрим setkey -D

На обоих машинах должны сформироваться ключевые пары:

192.168.77.2 192.168.77.1
 esp mode=tunnel spi=248989780(0x0ed74854) reqid=0(0x00000000)
 E: 3des-cbc b976192f e8c17ff6 8fc64e5f 1efda225 c9333c6c 15b03656
 A: hmac-sha1 ae7e03ba d760a471 ef22f01e 0baca744 ef0371c6
 seq=0x00000000 replay=4 flags=0x00000000 state=mature
 created: Sep 9 16:32:56 2015 current: Sep 9 17:02:31 2015
 diff: 1775(s) hard: 3600(s) soft: 2880(s)
 last: Sep 9 16:35:13 2015 hard: 0(s) soft: 0(s)
 current: 260919(bytes) hard: 0(bytes) soft: 0(bytes)
 allocated: 3249 hard: 0 soft: 0
 sadb_seq=1 pid=30197 refcnt=0
 192.168.77.1 192.168.77.2
 esp mode=tunnel spi=52619622(0x0322e966) reqid=0(0x00000000)
 E: 3des-cbc a52242b8 0f0f7042 d92c8011 25242258 34385bc2 4f618b95
 A: hmac-sha1 1e98b340 1db1c65c d7368c5d ffc78cc7 3e9b3a33
 seq=0x00000000 replay=4 flags=0x00000000 state=mature
 created: Sep 9 16:32:56 2015 current: Sep 9 17:02:31 2015
 diff: 1775(s) hard: 3600(s) soft: 2880(s)
 last: Sep 9 16:33:05 2015 hard: 0(s) soft: 0(s)
 current: 2077093(bytes) hard: 0(bytes) soft: 0(bytes)
 allocated: 3832 hard: 0 soft: 0
 sadb_seq=0 pid=30197 refcnt=0

Проверяем пинг. Если он есть, и значение

diff: 2225(s)

в выводе setkey -D выше меняется, значит данные пошли внутри IPsec.

Если пинг идет, а ключевых пар нет, или если пинг не идет значит где то в конфигах IPsec ошибка. Смотрим правильность своих подсетей, пропускаем демонов и пингуем еще раз, до нужного результата.

Смотрите так же:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.