优化nat校验
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user