1
This commit is contained in:
1 parent
1a171d5a24
commit
8bad15b7bb
7 files changed
+91
-19
No files matched your search
+2
-12
@@ -926,7 +926,7 @@ static int etcp_send_ping_raw(struct ETCP_DGRAM* dgram, socket_t fd, sc_context_
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "sendto failed for ping, err=%d", socket_get_error());
|
||||
return -1;
|
||||
}
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_BGP, "ping sendto succeeded, sent=%zd bytes", sent);
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_BGP, "ping sendto succeeded to %s sent=%zd bytes", sent, sockaddr_storage_to_str(addr).str);
|
||||
return (int)sent;
|
||||
}
|
||||
|
||||
@@ -1593,18 +1593,8 @@ int init_sockets(struct UTUN_INSTANCE* instance) {
|
||||
}
|
||||
success_count++;
|
||||
|
||||
// Convert IP to string for logging
|
||||
char addr_str[INET6_ADDRSTRLEN + 10];
|
||||
if (server->ip.ss_family == AF_INET) {
|
||||
struct sockaddr_in* sin = (struct sockaddr_in*)&server->ip;
|
||||
snprintf(addr_str, sizeof(addr_str), "%s:%d", ip_to_str(&sin->sin_addr, AF_INET).str, ntohs(sin->sin_port));
|
||||
} else {
|
||||
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)&server->ip;
|
||||
snprintf(addr_str, sizeof(addr_str), "%s:%d", ip_to_str(&sin6->sin6_addr, AF_INET6).str, ntohs(sin6->sin6_port));
|
||||
}
|
||||
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "Initialized server %s on %s (links: %zu)",
|
||||
server->name, addr_str, e_sock->num_channels);
|
||||
server->name, sockaddr_storage_to_str(&server->ip).str, e_sock->num_channels);
|
||||
server = server->next;
|
||||
}
|
||||
|
||||
|
||||
+10
-6
@@ -424,7 +424,7 @@ void route_bgp_new_conn(struct ETCP_CONN* conn) {
|
||||
while (c) {
|
||||
struct ETCP_LINK* l = c->links;
|
||||
while (l) {
|
||||
if (l->initialized && l->conn && l->nat_check_status == NAT_CHECK_NONE) {
|
||||
if (l->initialized && l->conn && l->nat_check_status < NAT_CHECK_IN_PROGRESS) {
|
||||
route_bgp_start_link_nat_check(bgp, l);
|
||||
}
|
||||
l = l->next;
|
||||
@@ -687,9 +687,10 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
|
||||
// Find third node to send ping through
|
||||
struct ETCP_CONN* third_conn = route_bgp_find_third_node(bgp, link->etcp);
|
||||
if (!third_conn) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: no third node found for link");
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "no third node found for link");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get target address - use nat_ip/nat_port if set, otherwise use remote_addr
|
||||
uint32_t target_ip;
|
||||
uint16_t target_port;
|
||||
@@ -701,6 +702,9 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
|
||||
target_ip = ntohl(sin->sin_addr.s_addr);
|
||||
target_port = ntohs(sin->sin_port);
|
||||
}
|
||||
|
||||
if (is_local_subnet(target_ip)) { DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "local ip: %s, skip nat check", ip_to_str(&target_ip, AF_INET).str); return; }
|
||||
|
||||
// Allocate callback arg
|
||||
struct nat_check_arg* arg = u_calloc(1, sizeof(struct nat_check_arg));
|
||||
if (!arg) return;
|
||||
@@ -711,7 +715,7 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
|
||||
const uint8_t* pubkey = link->etcp->crypto_ctx.peer_key_set ? link->etcp->crypto_ctx.peer_public_key : NULL;
|
||||
if (!pubkey) {
|
||||
u_free(arg);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: no peer pubkey for link=%p", (void*)link);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "no peer pubkey for link=%p", (void*)link);
|
||||
return;
|
||||
}
|
||||
// Send ping via third node - embed peer pubkey for NAT detection
|
||||
@@ -720,11 +724,11 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
|
||||
pubkey);
|
||||
if (ret == 0) {
|
||||
link->nat_check_status = NAT_CHECK_IN_PROGRESS;
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: started for link=%p via=%s",
|
||||
(void*)link, third_conn->log_name);
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "ping remote request via=%s (%s:%d)",
|
||||
(void*)link, third_conn->log_name, ip_to_str(&target_ip, AF_INET).str, target_port);
|
||||
} else {
|
||||
u_free(arg);
|
||||
DEBUG_WARN(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: failed to start for link=%p",
|
||||
DEBUG_WARN(DEBUG_CATEGORY_BGP, "failed to start for link=%p",
|
||||
(void*)link);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,3 +24,19 @@ bgp_update local nodelist:
|
||||
bgp_withdraw(struct ROUTE_BGP bgp, uint64_t node_to_del, uint64_t wd_source) - wd_source это узел который захотел withdraw.
|
||||
- находим у себя node to del. удаляем если в hoplist найден wd_node (или мы = wd_node)
|
||||
если удалили - распространяем по всем линкам с этими же аргументами
|
||||
|
||||
|
||||
|
||||
===============================
|
||||
определение nat
|
||||
|
||||
определяем что оба узла в локальной сети:
|
||||
-если обе ноды имеют локальные адреса сокетов пробуем пинг по локальным адресам
|
||||
|
||||
если узел подключился и его сокетовый ip:port отличается от connection ip:port - устанавливаем флаг nat. и инициируем проверку пингом третьим узлом:
|
||||
проверка считается успешной если по результату пинга ip источника пинга отличается от ip запросившего пинг узла.
|
||||
|
||||
проверка типа nat узла который подключился:
|
||||
- пингуем узел с целью зафиксировать свой ip (в сокете может быть например 0.0.0.0)
|
||||
- даём команду третьему узлу пингануть этот узел.
|
||||
- по результатам двух пингов определяем тип nat
|
||||
Reference in new issue
Block a user