11use crate :: {
22 Dispatcher ,
33 common:: auth:: ThreadSafeAuthenticator ,
4+ proxy:: utils:: { ToCanonical , try_create_dualstack_tcplistener} ,
45 session:: { Network , Session } ,
56} ;
67
78use super :: { http, inbound:: InboundHandlerTrait , socks, utils:: apply_tcp_options} ;
89use crate :: common:: errors:: new_io_error;
910use async_trait:: async_trait;
1011use std:: { net:: SocketAddr , sync:: Arc } ;
11- use tokio:: net:: TcpListener ;
1212use tracing:: warn;
1313
1414pub struct MixedInbound {
@@ -54,7 +54,7 @@ impl InboundHandlerTrait for MixedInbound {
5454 }
5555
5656 async fn listen_tcp ( & self ) -> std:: io:: Result < ( ) > {
57- let listener = TcpListener :: bind ( self . addr ) . await ?;
57+ let listener = try_create_dualstack_tcplistener ( self . addr ) ?;
5858
5959 loop {
6060 let ( socket, _) = match listener. accept ( ) . await {
@@ -65,13 +65,15 @@ impl InboundHandlerTrait for MixedInbound {
6565 }
6666 } ;
6767 let src_addr = match socket. peer_addr ( ) {
68- Ok ( a) => a,
68+ Ok ( a) => a. to_canonical ( ) ,
6969 Err ( e) => {
7070 warn ! ( "failed to get peer address: {:?}" , e) ;
7171 continue ;
7272 }
7373 } ;
74- if !self . allow_lan && src_addr. ip ( ) != socket. local_addr ( ) ?. ip ( ) {
74+ if !self . allow_lan
75+ && src_addr. ip ( ) != socket. local_addr ( ) ?. ip ( ) . to_canonical ( )
76+ {
7577 warn ! ( "Connection from {} is not allowed" , src_addr) ;
7678 continue ;
7779 }
@@ -101,7 +103,7 @@ impl InboundHandlerTrait for MixedInbound {
101103 socks:: SOCKS5_VERSION => {
102104 let mut sess = Session {
103105 network : Network :: Tcp ,
104- source : socket. peer_addr ( ) ?,
106+ source : socket. peer_addr ( ) ?. to_canonical ( ) ,
105107 so_mark : fw_mark,
106108 ..Default :: default ( )
107109 } ;
@@ -118,7 +120,7 @@ impl InboundHandlerTrait for MixedInbound {
118120 }
119121
120122 _ => {
121- let src = socket. peer_addr ( ) ?;
123+ let src = socket. peer_addr ( ) ?. to_canonical ( ) ;
122124 let dispatcher = dispatcher. clone ( ) ;
123125 let authenticator = authenticator. clone ( ) ;
124126 tokio:: spawn ( async move {
0 commit comments