Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

IKEv2 не работает в некоторых случаях #194

Closed
AltGrF13 opened this issue Oct 31, 2024 · 6 comments
Closed

IKEv2 не работает в некоторых случаях #194

AltGrF13 opened this issue Oct 31, 2024 · 6 comments

Comments

@AltGrF13
Copy link
Contributor

AltGrF13 commented Oct 31, 2024

По сути расширение #114. Предположу, что новый виток связан с обновлением прошивки.

Прикладываю два файла на разном железе от команды ip a. В названиях указано, какой интерфейс должен быть выбран функцией get_entware_ikev2_inface в bin/libs/main. В обоих случаях в inet там IP, с которым мы ходили в интернет.

Если не найдётся хорошего способа вычленить сетевой интерфейс, который является внешним подключением к интернету, то можно брать несколько предполагаемых вариантов. Рассмотрим все, где есть global:

  • ezcfg0 петлевой интерфейс-костыль, он не может являться таковым;
  • eth* могут быть;
  • br0 и br1 не могут таковыми являться;
  • ppp0 и ppp1 могут быть;
  • "OpenVPN","Wireguard","IKE","SSTP","PPPOE","L2TP","PPTP" и "Proxy" (если перевести их в сетевые интерфейсы) тоже не могут таковыми являться.

Итого остаются 2–4 сетевых интерфейса (eth* и ppp*), которые могут быть претендентами (если есть global) на подключение к интернету. В случае чего, можно создать просто 2×4 правила с ограничением -i на них и используемом сейчас диапазоне IP. Это, в любом случае, будет лучше; чем два правила (tcp и udp) без указания сетевого интерфейса, которые навесятся на 36–45 сетевых интерфейсов разом.

@AltGrF13
Copy link
Contributor Author

AltGrF13 commented Nov 1, 2024

Удалил старую версию функции, т.к. снова обновил её из-за 4.2

@qzeleza
Copy link
Owner

qzeleza commented Nov 4, 2024

Добавил в следующую бету. Спасибо.

@AltGrF13
Copy link
Contributor Author

AltGrF13 commented Nov 5, 2024

Ох. Я обновил прошивку роутера до последней стабильной версии, удалил компонент IKEv2 и поставил его заново. Не знаю, какое из действий повлияло, но у меня перестал работать обход IKEv2 даже при наличии правильных правил. Пошёл искать. Добавляешь общее — всё хорошо. Уменьшаешь диапазон внешним подключением к интернету (у меня eth3) — и не работает.

iptables -A PREROUTING -w -t mangle -s 192.168.3.0/24         -m set --match-set kvas_ipset dst -j VPNREDIR
iptables -A PREROUTING -w -t mangle -s 192.168.3.0/24 -i eth3 -m set --match-set kvas_ipset dst -j VPNREDIR
  1. На "больших" Linux'ах IKEv2 хорошо виден по ip route, но там пусто.
  2. В цикле перепробовал все интерфейсы из ip a и ifconfig — ни черта.
  3. Снял дамп iptables и среди блока IKE обнаружил
-A _IPSEC_VIPSERVER_FWD -i xfrms+ -o xfrms+ -j ACCEPT
-A _IPSEC_VIPSERVER_FWD -i vpn+ -o xfrms1 -m set --match-set _NDM_SRV_IKE1VPNSRV src --return-nomatch ! --update-counters ! --update-subcounters -j ACCEPT
-A _IPSEC_VIPSERVER_FWD -i sstp+ -o xfrms1 -m set --match-set _NDM_SRV_IKE1VPNSRV src --return-nomatch ! --update-counters ! --update-subcounters -j ACCEPT
-A _IPSEC_VIPSERVER_FWD -i l2tp+ -o xfrms1 -m set --match-set _NDM_SRV_IKE1VPNSRV src --return-nomatch ! --update-counters ! --update-subcounters -j ACCEPT
-A _IPSEC_VIPSERVER_FWD -i oc+ -o xfrms1 -m set --match-set _NDM_SRV_IKE1VPNSRV src --return-nomatch ! --update-counters ! --update-subcounters -j ACCEPT

Я про них:

  • xfrms+
  • vpn+
  • sstp+
  • l2tp+
  • oc+

Этих интерфейсов нет среди ip a, но xfrms+ — ответ на мой вопрос (sstp+ точно работает для SSTP серверов). Походу, они для IKEv2 создали какой-то виртуальный интерфейс-надстройку для упрощения маршрутизации. Встречалось обсуждение про XFRM на смежную тему.

Итого я снова переписал эту функцию, для меня работает. Но потребуется, очевидно, проверка на большем количестве устройств. И да, оно требует фикса из #205

is_os_below_4_2() {
	if [ -n "${1}" ]; then
		local os_version="${1}"
	else
		local os_version="$(version_os)"
	fi

	local os_subversion=$(echo "${os_version}" | cut -d '.' -f 1)
	if [ "${os_subversion}" -lt 4 ]; then
		return
	fi

	if [ "${os_subversion}" -eq 4 ]; then
		os_subversion=$(echo "${os_version}" | cut -d '.' -f 2)
		if [ "${os_subversion}" -lt 2 ]; then
			return
		fi
	fi

	false
}

function is_ip_private() {
	if echo "$1" | grep -qE '^(192\.168\.|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)'; then
		return
	fi

	false
}

get_entware_ikev2_inface() {
	if ! is_os_below_4_2 ; then
		# на последних прошивках IKEv2 на этом интерфейсе, но у всех ли?
		echo 'xfrms+'
		return
	fi

	local interfaces=$( ip a )
	# внешние интерфейсы для проверки
	for interface in eth3 eth2.2 ppp0 ppp1 ; do
		local interface_address=$( echo "$interfaces" | grep "global ${interface}" | tr -s ' ' | cut -d ' ' -f 3 )
		if [ -z "${interface_address}" ]; then
			continue
		fi
		if is_ip_private $interface_address; then
			continue
		fi

		# в этом интерфейсе есть global и нет private IP
		# в идеале можно ещё проверить, что это вообще IP или диапазон
		echo "${interface}"
		return
	done

	log_error 'Сетевой интерфейс для IKEv2 найти не удалось'
	# чтобы остальной код продолжал работать, вернём точно имеющийся интерфейс
	echo 'br0'
}

В общем, сейчас учтены случаи новой прошивки и подключения через PPPoE по сравнению кодом beta6

@AltGrF13 AltGrF13 changed the title IKEv2 не работает на некоторых моделях IKEv2 не работает в некоторых случаях Nov 5, 2024
@qzeleza
Copy link
Owner

qzeleza commented Nov 7, 2024

Внес крайние изменения в код - появятся в 7 бете

@AltGrF13
Copy link
Contributor Author

AltGrF13 commented Nov 11, 2024

Просто запись на будущее

Для проверки, если у кого-то что-то не работает, нужно запрашивать вывод команд:

  1. iptables-save | grep -F 53 | grep -Fv _NDM | grep -Fv :INPUT | grep -Fv :PREROUTING | grep -Fv :OUTPUT для проверки роутинга DNS;
  2. iptables-save | grep -F kvas_ipset для проверки роутинга трафика;
  3. ip route после подключения к IKEv2 любым устройством для узнавания сетевого интерфейса IKEv2;
  4. test_ikev2_int.sh для проверки функций определения сетевого интерфейса и версии прошивки.
    test_ikev2_int.zip

@qzeleza
Copy link
Owner

qzeleza commented Nov 11, 2024

Просто запись на будущее

Благодарю Вас.
Добавил в бету 8, команду debug ikev2 для отображения всех перечисленных выше тестов.

AltGrF13 pushed a commit to AltGrF13/kvas that referenced this issue Nov 17, 2024
AltGrF13 pushed a commit to AltGrF13/kvas that referenced this issue Nov 17, 2024
AltGrF13 pushed a commit to AltGrF13/kvas that referenced this issue Nov 17, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants