SocksLib
Sockslib is a library designed to make the usage of socks proxies as easy as possible.
This library can connect to proxies, authenticate, and then have the use of a normal python socket.
Features
- Socks5 support
- Socks4 support
- IPv4 Support
- IPv6 Support (Socks5)
- Domain Support
- User/Pass authentication (Socks5)
- Easily customizable authentication (Socks5)
- UDP Support (Socks5)
- Full socket api
Documentation
Index
- Intro
- Creating a socket
- Setting the proxy
- Set the default proxy
- URLLib proxied
- IPv6
- SOCKS5
- TCP
- UDP
- Using Other Authentication Methods
- Implementing Your Own Authentication Methods
- SOCKS4
- No Authentication
- Identity Authentication
Intro
Creating a new socket
socket = sockslib.SocksSocket()
Setting a proxy
socket.set_proxy (
('127.0.0.1', 0),
sockslib.Socks.SOCKS5,
authentication
)
Set a default proxy
Default proxies can be useful for situations when other libraries use sockets to communicate and you want to force that library to use a proxy instead of a direct connection
sockslib.set_default_proxy(
('127.0.0.1', 0),
sockslib.Socks.SOCKS5,
socket.AF_INET,
authentication
)
URLLib Proxied
import urllib.request
import sockslib
import socket
sockslib.set_default_proxy(('127.0.0.1', 9050))
socket.socket = sockslib.SocksSocket
html = urllib.request.urlopen('https://myexternalip.com/raw').read()
print(html)
IPv6
To connect to a proxy server via ipv6, you must explicitly specify the protocol by passing the ip_protocol
parameter to the SocksSocket constructor, OR by using the 3rd option of set_default_proxy.
Here is an example of connecting to a remote IPv6 proxy:
import sockslib
import socket
with sockslib.SocksSocket(ip_protocol=socket.AF_INET6) as sock:
sock.set_proxy(('::1', 9050))
sock.connect(('myexternalip.com', 80))
sock.sendall(b"GET /raw HTTP/1.1\r\nHost: myexternalip.com\r\n\r\n")
print(sock.recv(1024))
Examples
SOCKS5
Socks5 TCP
This is an example usage that connects to a Socks5 proxy at 127.0.0.1:9050
and then requests the page http://myexternalip.com/raw
import sockslib
with sockslib.SocksSocket() as sock:
sock.set_proxy(('127.0.0.1', 9050))
sock.connect(('myexternalip.com', 80))
sock.sendall(b"GET /raw HTTP/1.1\r\nHost: myexternalip.com\r\n\r\n")
print(sock.recv(1024))
Socks5 UDP
This is an example usage that connects to a Socks5 proxy at 127.0.0.1:9050
and then sends a UDP packet.
import sockslib
with sockslib.SocksSocket(udp=True) as sock:
sock.set_proxy(('127.0.0.1', 9050))
sock.initudp()
sock.sendto(b"Hello, World", ("0.0.0.0", 12000))
Due to the nature of UDP in the SOCKS5 protocol, it is reccomended to use the context manager, as the remote proxy server will not drop the UDP associate request until the socket is closed.
Using other authentication methods
To use more authentication methods like User/Pass auth, you pass an array of authentication methods to the third parameter of set_proxy
(Don't neglect to set the second parameter to the proxy type!)
import sockslib
with sockslib.SocksSocket() as sock:
auth_methods = [
sockslib.NoAuth(),
sockslib.UserPassAuth('username', 'password'),
]
sock.set_proxy(('127.0.0.1', 9050), sockslib.Socks.SOCKS5, auth_methods)
sock.connect(('myexternalip.com', 80))
sock.sendall(b"GET /raw HTTP/1.1\r\nHost: myexternalip.com\r\n\r\n")
print(sock.recv(1024))
Implementing your own authentication methods
To implement your own socks5 authentication method, you must make a class that implements sockslib.AuthenticationMethod
it requires that you implement a getId()
function, an authenticate(socket)
function, and a forP
function. Note: the authenticate function must return a boolean, True if authentication succeeded and False if it failed.
from sockslib.socks import AuthenticationMethod
from sockslib.socks import Socks
import struct
class UserPassAuth(AuthenticationMethod):
def __init__(self, username, password):
self.username = username
self.password = password
def getId(self):
return 0x02
def forP(self):
return Socks.SOCKS5
def authenticate(self, socket):
socket.sendall(b"\x01" + struct.pack("B", len(self.username)) + self.username.encode() + struct.pack("B", len(self.password)) + self.password.encode())
ver, status = socket.recv(2)
return status == 0x00
Socks4
This is an example usage that connects to a Socks4 proxy at 127.0.0.1:9050
and then requests the page http://myexternalip.com/raw
import sockslib
with sockslib.SocksSocket() as sock:
sock.set_proxy(('127.0.0.1', 9050), sockslib.Socks.SOCKS4)
sock.connect(('myexternalip.com', 80))
sock.sendall(b"GET /raw HTTP/1.1\r\nHost: myexternalip.com\r\n\r\n")
print(sock.recv(1024))
Socks4 with identity authentication
import sockslib
with sockslib.SocksSocket() as sock:
auth_methods = [
sockslib.Socks4Ident("ident")
]
sock.set_proxy(('127.0.0.1', 9050), sockslib.Socks.SOCKS4, auth_methods)
sock.connect(('myexternalip.com', 80))
sock.sendall(b"GET /raw HTTP/1.1\r\nHost: myexternalip.com\r\n\r\n")
print(sock.recv(1024))
Installation
pip3 install sockslib
Issues
If you have any issues with this project please feel free to open a new issue on github
https://github.com/woo200/sockslib/issues