Skip to content

Instantly share code, notes, and snippets.

@riaqn
Created February 25, 2021 16:06
Show Gist options
  • Save riaqn/4fb16661c07a753f38e28767f9d602d5 to your computer and use it in GitHub Desktop.
Save riaqn/4fb16661c07a753f38e28767f9d602d5 to your computer and use it in GitHub Desktop.
A async python transparent proxy server (based on iptables TPROXY, asyncio, aiosock)
import asyncio
from asyncio.streams import start_server
import socket
import aiosocks
import logging
logging.basicConfig(level = logging.WARNING)
log = logging.getLogger(__name__)
async def forward(reader, writer):
while True:
d = await reader.read(1024)
if len(d) == 0:
break
writer.write(d)
writer.close()
await writer.wait_closed()
async def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_TRANSPARENT, 1)
sock.bind(('127.0.0.1', 10080))
async def worker(reader, writer):
sockname = writer.get_extra_info('sockname') # original destination
log.warning('got connection, intended for %s', sockname)
socks5_addr = aiosocks.Socks5Addr('127.0.0.1', 1337)
preader,pwriter = await aiosocks.open_connection(proxy=socks5_addr, proxy_auth=None, dst=sockname)
asyncio.create_task(forward(reader, pwriter))
asyncio.create_task(forward(preader, writer))
server = await asyncio.start_server(worker, sock = sock)
await server.serve_forever()
if __name__ == '__main__':
asyncio.run(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment