@@ -31,8 +31,6 @@ const (
3131 udpBufferSize int = 4096
3232)
3333
34- var googleDNSAddr * net.UDPAddr = & net.UDPAddr {IP : net .ParseIP ("8.8.8.8" ), Port : 53 }
35-
3634type udpConn struct {
3735 * socks5.UDPConn
3836 srcAddr * net.UDPAddr
@@ -179,40 +177,44 @@ func newTproxyServerUDP(p *proxyapp) *tproxyServerUDP {
179177 tsu .p .logger .Fatal ().Err (err ).Msgf ("[udp %s] Failed getting default interface" , tsu .p .tproxyMode )
180178 }
181179 }
182- gw , err := network .GetGatewayIPv4FromInterface (tsu .iface .Name )
183- if err != nil {
184- tsu .p .logger .Fatal ().Err (err ).Msgf ("[udp %s] failed getting gateway from %s" , tsu .p .tproxyMode , tsu .iface .Name )
185- }
186- tsu .gwDNS = & net.UDPAddr {IP : net .ParseIP (gw .String ()), Port : 53 }
187- lc = net.ListenConfig {
188- Control : func (network , address string , conn syscall.RawConn ) error {
189- var operr error
190- if err := conn .Control (func (fd uintptr ) {
191- operr = unix .SetsockoptInt (int (fd ), unix .SOL_IP , unix .IP_TRANSPARENT , 1 )
192- operr = unix .SetsockoptInt (int (fd ), unix .SOL_IP , unix .IP_FREEBIND , 1 )
193- operr = unix .SetsockoptInt (int (fd ), unix .SOL_SOCKET , unix .SO_REUSEADDR , 1 )
194- }); err != nil {
195- return err
196- }
197- return operr
198- },
199- }
200- pconn , err = lc .ListenPacket (context .Background (), "udp4" , tsu .gwDNS .String ())
201- if err != nil {
202- tsu .p .logger .Fatal ().Err (err ).Msgf ("[udp %s] failed listening on gateway DNS" , tsu .p .tproxyMode )
180+ if tsu .p .arpspoofer != nil {
181+ gw , err := network .GetGatewayIPv4FromInterface (tsu .iface .Name )
182+ if err != nil {
183+ tsu .p .logger .Fatal ().Err (err ).Msgf ("[udp %s] failed getting gateway from %s" , tsu .p .tproxyMode , tsu .iface .Name )
184+ }
185+ tsu .gwDNS = & net.UDPAddr {IP : net .ParseIP (gw .String ()), Port : 53 }
186+ lc = net.ListenConfig {
187+ Control : func (network , address string , conn syscall.RawConn ) error {
188+ var operr error
189+ if err := conn .Control (func (fd uintptr ) {
190+ operr = unix .SetsockoptInt (int (fd ), unix .SOL_IP , unix .IP_TRANSPARENT , 1 )
191+ operr = unix .SetsockoptInt (int (fd ), unix .SOL_IP , unix .IP_FREEBIND , 1 )
192+ operr = unix .SetsockoptInt (int (fd ), unix .SOL_SOCKET , unix .SO_REUSEADDR , 1 )
193+ }); err != nil {
194+ return err
195+ }
196+ return operr
197+ },
198+ }
199+ pconn , err = lc .ListenPacket (context .Background (), "udp4" , tsu .gwDNS .String ())
200+ if err != nil {
201+ tsu .p .logger .Fatal ().Err (err ).Msgf ("[udp %s] failed listening on gateway DNS" , tsu .p .tproxyMode )
202+ }
203+ tsu .gwConn = pconn .(* net.UDPConn )
203204 }
204- tsu .gwConn = pconn .(* net.UDPConn )
205205 return tsu
206206}
207207
208208func (tsu * tproxyServerUDP ) ListenAndServe () {
209209 tsu .startingFlag .Store (true )
210210 tsu .wg .Add (1 )
211211 go tsu .clients .Cleanup ()
212- go func () {
213- tsu .listenAndServeDNS ()
214- tsu .wg .Done ()
215- }()
212+ if tsu .p .arpspoofer != nil {
213+ go func () {
214+ tsu .listenAndServeDNS ()
215+ tsu .wg .Done ()
216+ }()
217+ }
216218 buf := make ([]byte , udpBufferSize )
217219 oob := make ([]byte , 1500 )
218220 tsu .startingFlag .Store (false )
@@ -417,11 +419,11 @@ func (dc *dnsConn) close() error {
417419 return dc .Close ()
418420}
419421
420- func newDNSConn (srcAddr * net.UDPAddr , mark uint ) (* dnsConn , error ) {
422+ func newDNSConn (srcAddr , dstAddr * net.UDPAddr , mark uint ) (* dnsConn , error ) {
421423 dialer := getBaseDialer (timeout , mark )
422424 ctx , cancel := context .WithTimeout (context .Background (), timeout )
423425 defer cancel ()
424- conn , err := dialer .DialContext (ctx , "udp4" , googleDNSAddr .String ())
426+ conn , err := dialer .DialContext (ctx , "udp4" , dstAddr .String ())
425427 if err != nil {
426428 return nil , err
427429 }
@@ -432,7 +434,7 @@ func newDNSConn(srcAddr *net.UDPAddr, mark uint) (*dnsConn, error) {
432434 return & dnsConn {
433435 UDPConn : udpConn ,
434436 srcAddr : srcAddr ,
435- dstAddr : googleDNSAddr ,
437+ dstAddr : dstAddr ,
436438 reqChan : make (chan layers.Layer ),
437439 respChan : make (chan layers.Layer ),
438440 }, nil
@@ -456,9 +458,9 @@ func (tsu *tproxyServerUDP) listenAndServeDNS() {
456458 }
457459 n , srcAddr , er := tsu .gwConn .ReadFromUDP (buf )
458460 if n > 0 {
459- conn , err := newDNSConn (srcAddr , tsu .p .mark )
461+ conn , err := newDNSConn (srcAddr , tsu .gwDNS , tsu . p .mark )
460462 if err != nil {
461- tsu .p .logger .Error ().Err (err ).Msgf ("[udp %s] Failed creating UDP connection %s→ %s" , tsu .p .tproxyMode , srcAddr , googleDNSAddr )
463+ tsu .p .logger .Error ().Err (err ).Msgf ("[udp %s] Failed creating UDP connection %s→ %s" , tsu .p .tproxyMode , srcAddr , tsu . gwDNS )
462464 continue
463465 }
464466 srcConnStr := fmt .Sprintf ("%s→ %s" , srcAddr , tsu .gwConn .LocalAddr ())
0 commit comments