-
-
Save luftreich/b4ed3fa3029bf26b80c7bf1498299cfc to your computer and use it in GitHub Desktop.
Only used for https://sorz.org/sms2email/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import socket | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
s.bind(('0.0.0.0', 6000)) | |
while True: | |
data, addr = s.recvfrom(1024) | |
s.sendto(str(addr[1]), addr) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import random | |
import logging | |
import subprocess | |
import time | |
import socket | |
import requests | |
NAT_REQUEST_URL = 'https://vpn.sorz.org/ovpn/connect?port=%s' | |
SNAT_SERVER = ('vpn.sorz.org', 6000) | |
def get_default_param(): | |
return ['bin\openvpn.exe', | |
'--client', | |
'--bind', | |
'--local', '0.0.0.0', | |
'--proto', 'udp', | |
'--dev', 'tun', | |
'--resolv-retry', 'infinite', | |
'--persist-key', | |
'--persist-tun', | |
'--ca', 'ca.crt', | |
'--cert', 'testclient.crt', | |
'--key', 'testclient.key', | |
'--ns-cert-type', 'server', | |
'--keepalive', '20', '60', | |
'--comp-lzo', | |
'--verb', '3', | |
'--mute', '20', | |
'--script-security', '2', 'system' | |
] | |
def main(): | |
logging.basicConfig(level=logging.DEBUG, | |
format='%(asctime)s %(levelname)-8s %(message)s', | |
datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') | |
logging.info('Version 0.2a1') | |
port = random.randint(8192, 65535) | |
logging.info('Use random port %s.' % port) | |
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
sock.bind(('0.0.0.0', port)) | |
sock.settimeout(3) | |
nat_port = None | |
for i in range(5): | |
try: | |
sock.sendto('orz', SNAT_SERVER) | |
nat_port = int(str(sock.recv(256))) | |
except socket.timeout: | |
logging.warn('Timeout, retry getting NAT port.') | |
continue | |
except ValueError: | |
logging.warn('Illegal value, retry getting NAT port.') | |
continue | |
sock.shutdown(socket.SHUT_RDWR) | |
sock.close() | |
if nat_port is None: | |
logging.error("Can't get NAT port. Using local bind port.") | |
nat_port = port | |
logging.info('NAT Port is %s.' % nat_port) | |
r = requests.get(NAT_REQUEST_URL % nat_port) | |
if r.status_code == 404: | |
logging.error('Server is offline.') | |
return | |
server = r.text.strip() | |
logging.info('Server address is %s.' % server) | |
logging.info('Waiting 2 seconds...') | |
time.sleep(2) | |
openvpn = get_default_param() | |
openvpn.extend(['--remote'] + server.split(':')) | |
openvpn.extend(('--lport', str(port))) | |
logging.info('Calling openvpn') | |
subprocess.call(openvpn) | |
if __name__ == '__main__': | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import socket | |
import sendudp | |
SNAT_BIND_PORT = 6001 | |
SNAT_SERVER = ('sorz.org', 6002) | |
OPENVPN_BIND_PORT = 1194 | |
def main(): | |
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
sock.bind(('', SNAT_BIND_PORT)) | |
sock.settimeout(20) | |
while True: | |
sock.sendto('\x00', SNAT_SERVER) | |
try: | |
sock.recv(1024) # Ignore ping response | |
data = sock.recv(1024) # Receiving users' connection request. | |
except socket.timeout: | |
continue | |
if data[0] != '\x03': | |
continue | |
print('a new connection from ' + data[1:]) | |
client = data[1:].split(':') | |
sendudp.sendto(OPENVPN_BIND_PORT, (client[0], int(client[1]))) | |
if __name__ == '__main__': | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# (...) | |
SNAT_SERVER_PORT = 6002 | |
@app.route('/ovpn/connect') | |
def movpn_openvpn(): | |
server = get_memcache().get('movpn.openvpn.server') | |
if not server: | |
return 'Server is not running.', 404 | |
addr = request.remote_addr | |
if addr.startswith('::ffff:'): | |
addr = addr[7:] | |
port = request.args.get('port', 1194) | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
s.sendto('\x02%s:%s' % (addr, port), ('localhost', SNAT_SERVER_PORT)) | |
return server | |
# (...) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import memcache | |
SNAT_SERVER_PORT = 6002 # local listening | |
OPENVPN_BIND_PORT = 1194 | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
s.bind(('0.0.0.0', SNAT_SERVER_PORT)) | |
mc = memcache.Client(['127.0.0.1:11211']) | |
server = mc.get('movpn.openvpn.server') | |
if server: | |
server = (server.split(':')[0], OPENVPN_BIND_PORT) | |
while True: | |
data, addr = s.recvfrom(1024) | |
if data[0] == '\x00': # From openvpn server | |
if addr != server: | |
server = addr | |
mc.set('movpn.openvpn.server', '%s:%s' % (server[0], OPENVPN_BIND_PORT)) | |
s.sendto('\x01', addr) | |
elif data[0] == '\x02': # From local web server (user's conn request) | |
if addr[0] != '127.0.0.1': | |
print('\x02 != localhost') | |
continue | |
print('new connect from ' + data[1:]) | |
s.sendto('\x03%s' % data[1:], server) | |
else: | |
print('unknown') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment