优化nat校验

This commit is contained in:
lubeilin
2023-09-18 21:51:08 +08:00
parent bf8397e6e3
commit 9495e39700
3 changed files with 26 additions and 37 deletions
+5 -2
View File
@@ -50,9 +50,12 @@ impl NatInfo {
public_port_range: u16, public_port_range: u16,
local_ipv4_addr: SocketAddrV4, local_ipv4_addr: SocketAddrV4,
ipv6_addr: SocketAddrV6, ipv6_addr: SocketAddrV6,
nat_type: NatType, mut nat_type: NatType,
) -> Self { ) -> Self {
public_ips.retain(|ip| !ip.is_loopback() && !ip.is_private()); public_ips.retain(|ip| !ip.is_loopback() && !ip.is_private() && !ip.is_unspecified());
if public_ips.len() > 1 {
nat_type = NatType::Symmetric;
}
Self { Self {
public_ips, public_ips,
public_port, public_port,
+6 -24
View File
@@ -431,18 +431,9 @@ impl ChannelDataHandler {
} }
std::net::IpAddr::V6(_) => {} std::net::IpAddr::V6(_) => {}
}, },
ControlPacket::AddrResponse(addr_packet) => { ControlPacket::AddrResponse(addr_packet) => self
if !addr_packet.ipv4().is_multicast() .nat_test
&& !addr_packet.ipv4().is_broadcast() .update_addr(addr_packet.ipv4(), addr_packet.port()),
&& !addr_packet.ipv4().is_unspecified()
&& !addr_packet.ipv4().is_loopback()
&& !addr_packet.ipv4().is_private()
&& addr_packet.port() != 0
{
self.nat_test
.update_addr(addr_packet.ipv4(), addr_packet.port())
}
}
} }
Ok(()) Ok(())
} }
@@ -630,18 +621,9 @@ impl ChannelDataHandler {
) )
.await?; .await?;
} }
ControlPacket::AddrResponse(addr_packet) => { ControlPacket::AddrResponse(addr_packet) => self
if addr_packet.port() != 0 .nat_test
&& !addr_packet.ipv4().is_multicast() .update_addr(addr_packet.ipv4(), addr_packet.port()),
&& !addr_packet.ipv4().is_broadcast()
&& !addr_packet.ipv4().is_unspecified()
&& !addr_packet.ipv4().is_loopback()
&& !addr_packet.ipv4().is_private()
{
self.nat_test
.update_addr(addr_packet.ipv4(), addr_packet.port())
}
}
_ => {} _ => {}
} }
Ok(()) Ok(())
+15 -11
View File
@@ -99,10 +99,18 @@ impl NatTest {
self.info.lock().clone() self.info.lock().clone()
} }
pub fn update_addr(&self, ip: Ipv4Addr, port: u16) { pub fn update_addr(&self, ip: Ipv4Addr, port: u16) {
let mut guard = self.info.lock(); if !ip.is_multicast()
guard.public_port = port; && !ip.is_broadcast()
if !guard.public_ips.contains(&ip) { && !ip.is_unspecified()
guard.public_ips.push(ip); && !ip.is_loopback()
&& !ip.is_private()
&& port != 0
{
let mut guard = self.info.lock();
guard.public_port = port;
if !guard.public_ips.contains(&ip) {
guard.public_ips.push(ip);
}
} }
} }
pub async fn re_test( pub async fn re_test(
@@ -131,13 +139,9 @@ impl NatTest {
ipv6_addr: SocketAddrV6, ipv6_addr: SocketAddrV6,
) -> NatInfo { ) -> NatInfo {
return match stun_test::stun_test_nat(stun_server.clone()).await { return match stun_test::stun_test_nat(stun_server.clone()).await {
Ok((nat_type, ips, port_range)) => { Ok((nat_type, mut public_ips, port_range)) => {
let mut public_ips = Vec::new(); if !public_ips.contains(&public_ip) {
public_ips.push(Ipv4Addr::from(public_ip)); public_ips.push(public_ip)
for ip in ips {
if ip != public_ip {
public_ips.push(ip);
}
} }
NatInfo::new( NatInfo::new(
public_ips, public_ips,