python实现tcp/ip协议下的端口转发及重定向示例

首先,我们用webpy写一个简单的网站,监听8080端口,返回“hello, everet.org”的页面。

然后我们使用我们的forwarding.py,在80端口和8080端口中间建立两条通信管道用于双向通信。

此时,我们通过80端口访问我们的服务器。

浏览器得到:

2016614172131520.png (426×190)

然后,我们在forwarding.py的输出结果中可以看到浏览器和webpy之间的通信内容。

2016614172157520.png (675×588)

代码:

#!/usr/bin/env python
import sys, socket, time, threading
loglock = threading.lock()
def log(msg):
loglock.acquire()
try:
print ‘[%s]: \n%s\n’ % (time.ctime(), msg.strip())
sys.stdout.flush()
finally:
loglock.release()
class pipethread(threading.thread):
def __init__(self, source, target):
threading.thread.__init__(self)
self.source = source
self.target = target
def run(self):
while true:
try:
data = self.source.recv(1024)
log(data)
if not data: break
self.target.send(data)
except:
break
log(‘pipethread done’)
class forwarding(threading.thread):
def __init__(self, port, targethost, targetport):
threading.thread.__init__(self)
self.targethost = targethost
self.targetport = targetport
self.sock = socket.socket(socket.af_inet, socket.sock_stream)
self.sock.bind((‘0.0.0.0’, port))
self.sock.listen(10)
def run(self):
while true:
client_fd, client_addr = self.sock.accept()
target_fd = socket.socket(socket.af_inet, socket.sock_stream)
target_fd.connect((self.targethost, self.targetport))
log(‘new connect’)
# two direct pipe
pipethread(target_fd, client_fd).start()
pipethread(client_fd, target_fd).start()
if __name__ == ‘__main__’:
print ‘starting’
import sys
try:
port = int(sys.argv[1])
targethost = sys.argv[2]
try: targetport = int(sys.argv[3])
except indexerror: targetport = port
except (valueerror, indexerror):
print ‘usage: %s port targethost [targetport]’ % sys.argv[0]
sys.exit(1)
#sys.stdout = open(‘forwaring.log’, ‘w’)
forwarding(port, targethost, targetport).start()

Posted in 未分类

发表评论