Страница 1 из 1

Проблема: перестают ходить пакеты внутри туннеля (ipsec)

Добавлено: 2012-07-27 5:48:47
sm4sh
Всем здравствуйте!
Хочу описать проблему, с которой столкнулся администрируя VPN-туннели между шлюзом с FreeBSD и "файрволами" D-Link DFL-210. В общей сложности сейчас поднято более 30 каналов. Более года все шло хорошо, но в последнее время я начал замечать что периодически внутри какого-нибудь канала перестает ходить трафик. При этом по ssh на эти точки я захожу, даже могу их перезагрузить. Остальные каналы при этом работают. Проблема решается ТОЛЬКО перезапуском ipsec или racoon на FreeBSD. То есть перезагрузка роутера не помогает. Версия фрихи была 8.0, сделал бинарное обновление до 8.3, обновил все порты (в том числе и ipsec-tools), но проблема не исчезла - также периодически какие-то каналы "подвисают". После проведенного исследования я выяснил, что в базе SA на фрихе появляются дублирующиеся записи для одного и того же хоста (X.X.X.X - мой шлюз):

Код: Выделить всё

FREE# setkey -D
. . .
X.X.X.X Y.Y.Y.Y 
	esp mode=tunnel spi=2746933399(0xa3bae097) reqid=0(0x00000000)
	E: rijndael-cbc  f360e41c 3b84d37b 41aea87e 55a7476c
	A: hmac-md5  a00a284d 9867001d d861b09d 830cc602
	seq=0x00000000 replay=4 flags=0x00000000 state=mature 
	created: Jul 27 05:43:57 2012	current: Jul 27 08:58:35 2012
	diff: 11678(s)	hard: 43200(s)	soft: 34560(s)
	[b]last:[/b]                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=23 pid=8702 refcnt=1
X.X.X.X Y.Y.Y.Y 
	esp mode=tunnel spi=4264316708(0xfe2c4f24) reqid=0(0x00000000)
	E: rijndael-cbc  220fa7a8 9be7a061 b10aa17c bccc91d3
	A: hmac-md5  286993c5 0a477e63 44790fa2 d22c1860
	seq=0x00000000 replay=4 flags=0x00000000 state=mature 
	created: Jul 27 04:40:47 2012	current: Jul 27 08:58:35 2012
	diff: 15468(s)	hard: 43200(s)	soft: 34560(s)
	[b]last:[/b]                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=22 pid=8702 refcnt=1
X.X.X.X Y.Y.Y.Y 
	esp mode=tunnel spi=4278676248(0xff076b18) reqid=0(0x00000000)
	E: rijndael-cbc  7eaf53c0 9be29fd8 aa6808a7 909c6ac8
	A: hmac-md5  05f10c42 eb9bb445 91647794 6edec657
	seq=0x000004e9 replay=4 flags=0x00000000 state=mature 
	created: Jul 27 04:39:56 2012	current: Jul 27 08:58:35 2012
	diff: 15519(s)	hard: 43200(s)	soft: 34560(s)
	[b]last: Jul 27 08:58:27 2012[/b]	hard: 0(s)	soft: 0(s)
	current: 112856(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 1257	hard: 0	soft: 0
	sadb_seq=21 pid=8702 refcnt=2
Y.Y.Y.Y X.X.X.X 
	esp mode=tunnel spi=223402791(0x0d50db27) reqid=0(0x00000000)
	E: rijndael-cbc  7e03c3ca 4fe8e1a5 4b8bb9ef aaba3273
	A: hmac-md5  fce3a0dd b95da09c 8afe136a 07f5b4bd
	seq=0x000004a9 replay=4 flags=0x00000000 state=mature 
	created: Jul 27 05:43:57 2012	current: Jul 27 08:58:35 2012
	diff: 11678(s)	hard: 43200(s)	soft: 34560(s)
	last: Jul 27 08:58:27 2012	hard: 0(s)	soft: 0(s)
	current: 57660(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 1193	hard: 0	soft: 0
	sadb_seq=19 pid=8702 refcnt=1
Y.Y.Y.Y X.X.X.X 
	esp mode=tunnel spi=181776993(0x0ad5b261) reqid=0(0x00000000)
	E: rijndael-cbc  c78472c3 22ceb212 66b40a2f ebf36d56
	A: hmac-md5  107568f4 13ff13fc b3992624 e5c3fea1
	seq=0x0000016c replay=4 flags=0x00000000 state=mature 
	created: Jul 27 04:40:47 2012	current: Jul 27 08:58:35 2012
	diff: 15468(s)	hard: 43200(s)	soft: 34560(s)
	last: Jul 27 05:41:17 2012	hard: 0(s)	soft: 0(s)
	current: 17472(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 364	hard: 0	soft: 0
	sadb_seq=18 pid=8702 refcnt=1
Y.Y.Y.Y X.X.X.X 
	esp mode=tunnel spi=182258880(0x0add0cc0) reqid=0(0x00000000)
	E: rijndael-cbc  550e25fb 4e2b7bb3 27b3b01b fd97e03c
	A: hmac-md5  ae62da0c ebed5b61 79e88ed0 baa5cf0c
	seq=0x00000008 replay=4 flags=0x00000000 state=mature 
	created: Jul 27 04:39:56 2012	current: Jul 27 08:58:35 2012
	diff: 15519(s)	hard: 43200(s)	soft: 34560(s)
	last: Jul 27 04:40:37 2012	hard: 0(s)	soft: 0(s)
	current: 384(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 8	hard: 0	soft: 0
	sadb_seq=17 pid=8702 refcnt=1
. . .
Моё внимание привлеко отсутствие записей last для двух из них. Потом я пошел дальше и посмотрел вывод tcpdump:

Код: Выделить всё

FREE# tcpdump -s0 -vvvv -ni inet1 host Y.Y.Y.Y
tcpdump: listening on inet1, link-type EN10MB (Ethernet), capture size 65535 bytes
10:20:48.135083 IP (tos 0x0, ttl 251, id 473, offset 0, flags [none], proto UDP (17), length 96)
    Y.Y.Y.Y.500 > X.X.X.X.500: [udp sum ok] isakmp 1.0 msgid  cookie ->: phase 2/others ? inf[E]: [encrypted hash]
10:20:57.754864 IP (tos 0x0, ttl 236, id 508, offset 0, flags [none], proto ESP (50), length 88)
    Y.Y.Y.Y > X.X.X.X: ESP(spi=0x0d50db27,seq=0x699), length 68
10:20:57.755052 IP (tos 0x0, ttl 64, id 36118, offset 0, flags [none], proto ESP (50), length 88)
    X.X.X.X > Y.Y.Y.Y: ESP(spi=0xff076b18,seq=0x702), length 68
10:21:07.753979 IP (tos 0x0, ttl 236, id 516, offset 0, flags [none], proto ESP (50), length 88)
    Y.Y.Y.Y > X.X.X.X: ESP(spi=0x0d50db27,seq=0x69a), length 68
10:21:07.754341 IP (tos 0x0, ttl 64, id 36187, offset 0, flags [none], proto ESP (50), length 88)
    X.X.X.X > Y.Y.Y.Y: ESP(spi=0xff076b18,seq=0x703), length 68
10:21:08.135586 IP (tos 0x0, ttl 251, id 166, offset 0, flags [none], proto UDP (17), length 96)
    Y.Y.Y.Y.500 > X.X.X.X.500: [udp sum ok] isakmp 1.0 msgid  cookie ->: phase 2/others ? inf[E]: [encrypted hash]
10:21:17.754507 IP (tos 0x0, ttl 236, id 226, offset 0, flags [none], proto ESP (50), length 88)
    Y.Y.Y.Y > X.X.X.X: ESP(spi=0x0d50db27,seq=0x69b), length 68
10:21:17.754710 IP (tos 0x0, ttl 64, id 36240, offset 0, flags [none], proto ESP (50), length 88)
    X.X.X.X > Y.Y.Y.Y: ESP(spi=0xff076b18,seq=0x704), length 68
. . .
Здесь я вижу, что идут какие-то запросы от удаленного узла, касающиеся второй фазы согласования, и еще идут зашифрованные пакеты и ОТВЕТЫ на них со стороны фрихи! Посмотрев в локалку, я увидел, что это пинги. На д-линках настроено keep-alive и они каждые 10 секунд пингуют мой хост. Но самое главное, что хост им отвечает! При этом "вручную" ни с одной стороны пинги не идут.

Код: Выделить всё

FREE# tcpdump -s0 -vvvv -ni local host B.B.B.B
tcpdump: listening on local, link-type EN10MB (Ethernet), capture size 65535 bytes
10:33:17.775025 IP (tos 0x0, ttl 254, id 11432, offset 0, flags [none], proto ICMP (1), length 28)
    B.B.B.B > A.A.A.A: ICMP echo request, id 42653, seq 16495, length 8
10:33:17.775305 IP (tos 0x0, ttl 64, id 4362, offset 0, flags [none], proto ICMP (1), length 28)
    A.A.A.A > B.B.B.B: ICMP echo reply, id 42653, seq 16495, length 8
10:33:27.775079 IP (tos 0x0, ttl 254, id 60835, offset 0, flags [none], proto ICMP (1), length 28)
    B.B.B.B > A.A.A.A: ICMP echo request, id 42653, seq 16496, length 8
10:33:27.775363 IP (tos 0x0, ttl 64, id 4474, offset 0, flags [none], proto ICMP (1), length 28)
    A.A.A.A > B.B.B.B: ICMP echo reply, id 42653, seq 16496, length 8
. . .
Отсюда я делаю вывод, что проблема заключается как раз в наличии этих дублирующих SA-записей. Видимо, одна из них "рабочая", а остальные нет. Но по какой причине образуются лишние я никак не пойму. В логах racoon ничего подозрительного нет. На всякий случай привожу свой конфиг:

Код: Выделить всё

FREE# cat /usr/local/etc/racoon/racoon.conf
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;

log notify;

padding
{
	maximum_length 20;	# maximum padding length.
	randomize off;		# enable randomize length.
	strict_check off;	# enable strict check.
	exclusive_tail off;	# exctract last one octet.
}

listen
{
	isakmp X1.X1.X1.X1 [500];
	isakmp X2.X2.X2.X2 [500];
	isakmp X3.X3.X3.X3 [500];
}

timer
{
	counter 5;
	interval 20 sec;
	persend 1;
	
	phase1 60 sec;
	phase2 30 sec;
}

remote anonymous
{
	exchange_mode main;
	lifetime time 24 hour ;
	doi ipsec_doi;
	situation identity_only;
	nonce_size 16;
	initial_contact on;
	
	proposal {
		encryption_algorithm 3des;
		hash_algorithm md5;
		authentication_method pre_shared_key ;
		dh_group 2;
	}
	
	proposal_check obey;
}

sainfo anonymous
{
        pfs_group 2;
        lifetime time 12 hour ;
        encryption_algorithm 3des, cast128, blowfish 448, des, rijndael ;
        authentication_algorithm hmac_sha1, hmac_md5 ;
        compression_algorithm deflate ;
}
Настройки lifetime одинаковы на всех устройствах. Единственное, в логах racoon появляются сообщения типа

Код: Выделить всё

WARNING: trns_id mismatched: my:3DES peer:AES
, но на установку канала это не влияет. При старой прошивке роутера (двухлетней давности) таких сообщений не было. Но перепрошивал устройства я достаточно давно (около года назад), после этого все работало исправно.

В общем, прошу помощи :)

Re: Проблема: перестают ходить пакеты внутри туннеля (ipsec)

Добавлено: 2012-07-31 3:39:07
sm4sh
Блин, какого черта мой топик переместили в этот раздел? На лс никто не отвечает. Тут есть кто живой вообще?

Re: Проблема: перестают ходить пакеты внутри туннеля (ipsec)

Добавлено: 2012-08-06 4:37:13
sm4sh
Всем огромное спасибо за участие в обсуждении и оказанную помощь.
Для тех, кто, возможно, столкнется с этой проблемой:

Для того, чтобы FreeBSD всегда выбирала новые SA, нужно поставить параметр ядра

Код: Выделить всё

# sysctl -w net.key.preferred_oldsa=0
Также рекомендуется изменить значение параметра

Код: Выделить всё

# sysctl -w net.key.blockacq_count=0
Правда в моем случае это не помогло.

Саму причину появления дублирующихся записей мне выяснить так и не удалось... Возможно, это связано с изменившимся механизмом в новых версиях racoon...