Skip to content

crash problem when runing in tproxy mode with dns listener. OSError: [Errno 98] Address in use #1050

@pythonwood

Description

@pythonwood

sshuttle v1.3.1

step 1:
sshuttle --method tproxy --ns-hosts 1.1.1.1 -r user@remote:22 10.0.0.0/12 -v

...
c : TCP redirector listening on ('127.0.0.1', 12300).                                                                                                                                                                         
c : UDP redirector listening on ('127.0.0.1', 12300).                                                                                                                                                                              
c : DNS listening on ('127.0.0.1', 12299).    
...

step 2
dig -p12299 @127.0.0.1 tiktok.com

sshuttle server crash when send dns request to dns listener
what expect is a dns response.


Traceback (most recent call last):                                                                                    
  File "/usr/bin/sshuttle", line 8, in <module>                                                                       
    sys.exit(main())                                                                                                  
             ^^^^^^                                                                                                   
  File "/usr/lib/python3.11/site-packages/sshuttle/cmdline.py", line 89, in main                                                                                                                                                             
    return_code = client.main(ipport_v6, ipport_v4,                                                                   
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                   
  File "/usr/lib/python3.11/site-packages/sshuttle/client.py", line 1070, in main                                                                                                                                                            
    return _main(tcp_listener, udp_listener, fw, ssh_cmd, remotename,                                                 
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                 
  File "/usr/lib/python3.11/site-packages/sshuttle/client.py", line 724, in _main                                     
    ssnet.runonce(handlers, mux)                                                                                                                                                                                                             
  File "/usr/lib/python3.11/site-packages/sshuttle/ssnet.py", line 616, in runonce                                    
    h.callback(s)                                                                                                                                                                                                                            
  File "/usr/lib/python3.11/site-packages/sshuttle/ssnet.py", line 504, in callback                                                                                                                                                          
    self.handle()                                                                                                                                                                                                                            
  File "/usr/lib/python3.11/site-packages/sshuttle/ssnet.py", line 492, in handle                                     
    self.got_packet(channel, cmd, data)                                                                               
  File "/usr/lib/python3.11/site-packages/sshuttle/ssnet.py", line 437, in got_packet                                                                                                                                                        
    callback(cmd, data)                                                                                               
  File "/usr/lib/python3.11/site-packages/sshuttle/client.py", line 510, in <lambda>                                                                                                                                                         
    mux.channels[chan] = lambda cmd, data: dns_done(                                                                  
                                           ^^^^^^^^^                                                                                                                                                                                         
  File "/usr/lib/python3.11/site-packages/sshuttle/client.py", line 491, in dns_done                                                                                                                                                         
    method.send_udp(sock, srcip, dstip, data)                                                                                                                                                                                                
  File "/usr/lib/python3.11/site-packages/sshuttle/methods/tproxy.py", line 95, in send_udp                                                                                                                                                  
    sender.bind(srcip)                                                                                                
OSError: [Errno 98] Address in use

source:

    def send_udp(self, sock, srcip, dstip, data):
        if not srcip:
            debug1(
                "-- ignored UDP to %r: "
                "couldn't determine source IP address\n" % (dstip,))
            return
        sender = socket.socket(sock.family, socket.SOCK_DGRAM)
        sender.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        try:
            sender.setsockopt(socket.SOL_IP, IP_TRANSPARENT, 1)
        except PermissionError as e:
            self.setsockopt_error(e)
        sender.bind(srcip)
        sender.sendto(data, dstip)
        sender.close()

may be I can fix it. with a pr

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions