import select import socket from http.server import BaseHTTPRequestHandler, HTTPServer from socketserver import ThreadingMixIn from urllib.parse import urlparse
classRequestHandler(BaseHTTPRequestHandler):
def_recv_data_from_remote(self, sock): data = b'' whileTrue: recv_data = sock.recv(4096) ifnot recv_data: break data += recv_data sock.close() return data
defsend_data(self, sock, data): # print(data) bytes_sent = 0 whileTrue: r = sock.send(data[bytes_sent:]) if r < 0: return r bytes_sent += r if bytes_sent == len(data): return bytes_sent
defhandle_tcp(self, sock, remote): # 处理 client socket 和 remote socket 的数据流 try: fdset = [sock, remote] whileTrue: # 用 IO 多路复用 select 监听套接字是否有数据流 r, w, e = select.select(fdset, [], []) if sock in r: try: data = sock.recv(4096) iflen(data) <= 0: break result = self.send_data(remote, data) if result < len(data): raise Exception('failed to send all data') except: pass
if remote in r: try: data = remote.recv(4096) iflen(data) <= 0: break result = self.send_data(sock, data) if result < len(data): raise Exception('failed to send all data') except: pass except Exception as e: raise (e) finally: sock.close() remote.close()
# error break # set -e # line-number for debug # set -x init() { # route rules ip rule add fwmark 1 table 100 ip route add local 0.0.0.0/0 dev lo table 100
# not global addresses ipset create localhash:net ipset add local 0.0.0.0/8 ipset add local 10.0.0.0/8 ipset add local 100.64.0.0/10 ipset add local 127.0.0.0/8 ipset add local 169.254.0.0/16 ipset add local 172.16.0.0/12 ipset add local 192.168.0.0/16 ipset add local 224.0.0.0/4 ipset add local 240.0.0.0/4
# apply rules if [ $udp_enable -eq 1 ]; then if [ $nat_enable -eq 1 ]; then iptables -t mangle -A PREROUTING -s 192.168.1.128/25 -j ACCEPT fi iptables -t mangle -A PREROUTING -m set --match-set local dst -j ACCEPT iptables -t mangle -A PREROUTING -p udp -j PROXY_UDP fi
# apply rules if [ $nat_enable -eq 1 ]; then iptables -t nat -A PREROUTING -s 192.168.1.128/25 -j ACCEPT fi iptables -t nat -A PREROUTING -p udp --dport 53 -j PROXY_DNS iptables -t nat -A PREROUTING -m set --match-set local dst -j ACCEPT iptables -t nat -A PREROUTING -p tcp -j PROXY_TCP }
setSelf() { iptables -t nat -A OUTPUT -m mark --mark 6666 -j ACCEPT iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports ${dns_port} iptables -t nat -A OUTPUT -m set --match-set local dst -j ACCEPT iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports ${redir_port} }