Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Гостевые при основном соединении VPN #185

Closed
AltGrF13 opened this issue Oct 21, 2024 · 2 comments
Closed

Гостевые при основном соединении VPN #185

AltGrF13 opened this issue Oct 21, 2024 · 2 comments

Comments

@AltGrF13
Copy link
Contributor

AltGrF13 commented Oct 21, 2024

И снова приходит IKEv2) Связка с ShadowSocks работала идеально, с основным VPN же проблемы.
image

Непосредственно добавление

При вводе команды kvas vpn net add вызывается из opt/bin/libs/vpn сначала cmd_bridge_vpn_access_add, затем bridge_vpn_access_add; где идёт вызов ikev2_net_access_add из opt/etc/ndm/ndm, приводящий к

iptables -A POSTROUTING -t nat -s "${net_pool}" -o "${ikev2_inface}" -j MASQUERADE

Тут всё выглядит осуществлённым правильно (само правило оценить не могу, т.к. не обладаю должной квалификацией в сетях).

Передобавление по хукам

Есть куча хуков, которые последовательно вызывают из opt/etc/ndm/ndm

  1. ip4_mark_vpn_network
  2. set_guest_nets_rules
  3. ip4_add_guest_to_vpn_network
  4. ip4_add_selected_guest_to_vpn_network:
get_guest_net(){
	ip addr show "${1}" | grep global | sed 's/^.*inet \(.*\).*/\1/' | cut -d' ' -f1
}
ip4_add_selected_guest_to_vpn_network(){
	guest_inface="${1}"
#	rules_masq=$(ip4save  | grep "\-j MASQUERADE" | grep " ${guest_inface} ")
#	rules_dns=$(ip4save | grep " ${guest_inface} " | grep DNAT | grep 53)
#	if [ -z "${rules_masq}" ] ; then
			# Маркируем трафик гостевой сети
	{
		log_warning "Подключаем правила маркировки гостевого трафика для VPN."
		ip4tables POSTROUTING -t nat -s "$(get_guest_net "${guest_inface}")" -o "${guest_inface}" -j MASQUERADE

	} &>/dev/null
	rules_masq=$(ip4save | grep "\-j MASQUERADE" | grep " ${guest_inface} ")
	if [ -z "${rules_masq}" ] ; then
		error "[${FUNCNAME}] Возникла ошибка при маркировке гостевого трафика ${guest_inface} [$(guest_net "${guest_inface}")] для VPN."
	fi
#	fi
}

Видно, что случай IKEv2 тут не рассмотрен, добавлено будет совсем не то. Код должен быть таким:


# Получение IP или маски локальной подсети по сетевому интерфейсу
#Example: 192.168.2.0/24
#Example: 192.168.112.156
get_guest_net(){
	ip addr show "${1}" | grep global | sed 's|^.*inet \([0-9\.\/]*\).*|\1|' | sed 's|[0-9]*\/|0\/|'
}

# Получение маски локальной подсети клиентов IKEv2
#Example: 192.168.3.0/24
#TODO: этот кусок кода использовался уже в 1-2 местах, заменить там копипасту на вызов этой функции
get_ikev2_net_pool() {
	ikev2_settings=$(curl -s "${LOCALHOST_IP}:79/rci/crypto/virtual-ip-server-ikev2")
	pool_start=$(echo "${ikev2_settings}" | grep pool-start | cut -d':' -f2 | sed 's/[\,\" ]//g;')
	echo "${pool_start}" | sed 's/\.[0-9]\{1,3\}$/.0\/24/'
}

ip4_add_selected_guest_to_vpn_network() {
	guest_inface="${1}"

	if echo "${guest_inface}" | grep -q ikev2 ; then
		guest_inface=$(get_entware_ikev2_inface)

		# IKEv2 не имеет отдельного сетевого интерфейса, поэтому запишем и что добавляем, и используемый СИ
		submessage="IKEv2 (${guest_inface} "
		net_pool=$(get_ikev2_net_pool)
	else
		submessage="${guest_inface} ("
		net_pool=$(get_guest_net "${guest_inface}")
	fi
	submessage=" гостевого трафика ${submessage}${net_pool}) для VPN."

	log_warning "Подключаем правила${submessage}"
	{
		ip4tables POSTROUTING -t nat -s "${net_pool}" -o "${guest_inface}" -j MASQUERADE
	} &>/dev/null
	if ! iptables-save | grep POSTROUTING | grep "${net_pool}" | grep "${guest_inface}" | grep -q MASQUERADE ; then
		error "[${FUNCNAME}] Возникла ошибка при маркировке${submessage}"
	fi
}
@AltGrF13
Copy link
Contributor Author

AltGrF13 commented Oct 21, 2024

Если проверять iptables-save | grep MASQUERADE после kvas vpn net del гостевого WiFi, то видно, что правила не подчищаются (до перезагрузки).

Удаление гостевого WiFi

В bridge_vpn_access_del в opt/bin/libs/vpn есть закомменченная строчка ip4_firewall_rm_selected_guest_net "${guest_bridge_id}". Функция ip4_firewall_rm_selected_guest_net и не должна там быть, она прунит все правила и обходит весь список гостевых! Тут нужна

-#                ip4_firewall_rm_selected_guest_net "${guest_bridge_id}"
+		ip4_firewall_rm_vpn_selected_guest_net "${guest_bridge_id}"

Она в opt/etc/ndm/ndm

ip4_firewall_rm_vpn_selected_guest_net(){
	guest_inface="${1}"
	if echo "${guest_inface}" | grep -q ikev2 ; then
		ikev2_net_access_del dont_del_config
	else
		iptab -D POSTROUTING -t nat -s "$(guest_net "${guest_inface}")" -o "${guest_inface}" -j MASQUERADE
	fi
}

Немного причешем

ip4_firewall_rm_vpn_selected_guest_net() {
	guest_inface="${1}"

	if echo "${guest_inface}" | grep -q ikev2 ; then
		ikev2_net_access_del dont_del_config
	else
		net_pool=$(get_guest_net "${guest_inface}")
		log_warning "Отключаем правила гостевого трафика ${guest_inface} (${net_pool}) для VPN."
		iptab -D POSTROUTING -t nat -s "${net_pool}" -o "${guest_inface}" -j MASQUERADE
	fi
}

Удаление гостевого IKEv2

Здесь правила удаляются корректно, но по аналогии с остальными местами добавим одну строчку для записи в лог в ikev2_net_access_del в opt/etc/ndm/ndm

		else
			if iptables-save | grep POSTROUTING | grep "${net_pool}" | grep "${ikev2_inface}" | grep -q MASQUERADE ; then
				log_warning "Отключаем правила гостевого трафика IKEv2 (${ikev2_inface} ${net_pool}) для VPN."
				iptab -D POSTROUTING -t nat -s "${net_pool}" -o "${ikev2_inface}" -j MASQUERADE
			fi
		fi

@AltGrF13 AltGrF13 changed the title IKEv2 при основном соединении VPN Гостевые при основном соединении VPN Oct 21, 2024
@qzeleza
Copy link
Owner

qzeleza commented Oct 23, 2024

Спасибо, подправил.
Прошу Вас, по возможности дать подобные предложения в разделе Pull request

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants