国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現TCP協議下的端口映射功能的腳本程序示例

2019-11-25 16:43:46
字體:
來源:轉載
供稿:網友

1 端口映射

舉個例子來說明一下端口映射的作用。

有A、B、C三臺計算機,A、B互通,B、C互通,但是A、C不通,這個時候在C上開了一個Web服務,如何讓A訪問C的Web服務?

最簡單有效的辦法就是在B上開一個端口映射服務,然后讓A訪問B的某個端口,B將這個端口上的所有流量全部轉發到C的Web服務端口上,同時將C上Web服務返回的流量也全部轉發給A。這樣對A來說,以B為跳板,實現了間接訪問C上Web服務的目的。

2 實現流程

端口映射的原理并不復雜,本文以TCP為例介紹一下實現過程,簡單畫了個時序圖(如下),這里就不再用文字贅述了。

2016614171010464.png (471×754)

需要注意的是,由于端口映射只是單純的流量轉發,對應用層數據不進行處理,所以對于多通道協議是無法支持的(如FTP協議)。

3 代碼示例

按照上面的流程,Python實現如下(建議從后向前看):

# -*- coding: utf-8 -*-# tcp mapping created by hutaow(hutaow.com) at 2014-08-31import socketimport threading# 端口映射配置信息CFG_REMOTE_IP = '192.168.0.10'CFG_REMOTE_PORT = 22CFG_LOCAL_IP = '0.0.0.0'CFG_LOCAL_PORT = 10022# 接收數據緩存大小PKT_BUFF_SIZE = 2048# 調試日志封裝def send_log(content):  print content  return# 單向流數據傳遞def tcp_mapping_worker(conn_receiver, conn_sender):  while True:    try:      data = conn_receiver.recv(PKT_BUFF_SIZE)    except Exception:      send_log('Event: Connection closed.')      break    if not data:      send_log('Info: No more data is received.')      break    try:      conn_sender.sendall(data)    except Exception:      send_log('Error: Failed sending data.')      break    # send_log('Info: Mapping data > %s ' % repr(data))    send_log('Info: Mapping > %s -> %s > %d bytes.' % (conn_receiver.getpeername(), conn_sender.getpeername(), len(data)))  conn_receiver.close()  conn_sender.close()  return# 端口映射請求處理def tcp_mapping_request(local_conn, remote_ip, remote_port):  remote_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  try:    remote_conn.connect((remote_ip, remote_port))  except Exception:    local_conn.close()    send_log('Error: Unable to connect to the remote server.')    return  threading.Thread(target=tcp_mapping_worker, args=(local_conn, remote_conn)).start()  threading.Thread(target=tcp_mapping_worker, args=(remote_conn, local_conn)).start()  return# 端口映射函數def tcp_mapping(remote_ip, remote_port, local_ip, local_port):  local_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  local_server.bind((local_ip, local_port))  local_server.listen(5)  send_log('Event: Starting mapping service on ' + local_ip + ':' + str(local_port) + ' ...')  while True:    try:      (local_conn, local_addr) = local_server.accept()    except KeyboardInterrupt, Exception:      local_server.close()      send_log('Event: Stop mapping service.')      break    threading.Thread(target=tcp_mapping_request, args=(local_conn, remote_ip, remote_port)).start()    send_log('Event: Receive mapping request from %s:%d.' % local_addr)  return# 主函數if __name__ == '__main__':  tcp_mapping(CFG_REMOTE_IP, CFG_REMOTE_PORT, CFG_LOCAL_IP, CFG_LOCAL_PORT)

4 運行

運行效果如下,192.168.0.20通過連接映射服務器的10022端口,成功訪問192.168.0.10的SSH服務(22端口):

2016614171059596.png (640×436)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 保靖县| 景东| 运城市| 江口县| 昆山市| 浮山县| 突泉县| 新营市| 綦江县| 郓城县| 达孜县| 田阳县| 南川市| 广昌县| 弥勒县| 鸡泽县| 马龙县| 石棉县| 斗六市| 张北县| 凭祥市| 东港市| 黔南| 吉隆县| 桐乡市| 台州市| 乌拉特后旗| 宜丰县| 德安县| 休宁县| 周口市| 怀来县| 浦城县| 洛宁县| 西林县| 秀山| 静乐县| 井陉县| 刚察县| 炉霍县| 蒙城县|