Python實現(xiàn)端口流量轉(zhuǎn)發(fā)的示例代碼
如下這段代碼實現(xiàn)了一個基本的TCP端口映射,將本地指定端口的流量轉(zhuǎn)發(fā)到指定的遠(yuǎn)程IP和端口。實現(xiàn)方式是在接收到本地客戶端連接請求后,創(chuàng)建一個線程,將本地連接和遠(yuǎn)程連接之間的數(shù)據(jù)傳輸通過線程分別實現(xiàn),這樣就實現(xiàn)了數(shù)據(jù)在本地和遠(yuǎn)程之間的單向流動,從而實現(xiàn)了TCP端口映射。
具體實現(xiàn)方式如下:
1.定義tcp_mapping_worker()函數(shù),接收本地客戶端連接和遠(yuǎn)程服務(wù)器連接作為參數(shù),通過while循環(huán)監(jiān)聽本地連接,當(dāng)接收到本地連接的數(shù)據(jù)時,將數(shù)據(jù)發(fā)送到遠(yuǎn)程服務(wù)器連接,實現(xiàn)本地到遠(yuǎn)程的單向流動。當(dāng)本地連接關(guān)閉時,結(jié)束該線程。
2.定義tcp_mapping_request()函數(shù),接收本地客戶端連接、遠(yuǎn)程服務(wù)器IP和端口作為參數(shù),創(chuàng)建遠(yuǎn)程連接,然后使用兩個線程分別將本地連接和遠(yuǎn)程連接之間的數(shù)據(jù)傳輸進(jìn)行處理,從而實現(xiàn)本地與遠(yuǎn)程之間的單向流動。當(dāng)本地連接關(guān)閉時,結(jié)束該函數(shù)。
3.在主函數(shù)中,首先指定遠(yuǎn)程服務(wù)器的IP和端口,然后使用socket創(chuàng)建一個本地服務(wù)器監(jiān)聽指定端口,當(dāng)接收到本地客戶端的連接請求時,將其傳遞給tcp_mapping_request()函數(shù),創(chuàng)建線程進(jìn)行數(shù)據(jù)傳輸。
import socket,threading
# 單向流數(shù)據(jù)傳遞
def tcp_mapping_worker(conn_receiver, conn_sender):
while True:
try:
# 接收數(shù)據(jù)緩存大小
data = conn_receiver.recv(2048)
except Exception:
print("[-] 關(guān)閉: 映射請求已關(guān)閉.")
break
if not data:
break
try:
conn_sender.sendall(data)
except Exception:
print("[-] 錯誤: 發(fā)送數(shù)據(jù)時出錯.")
break
print("[+] 映射請求: {} ---> 傳輸?shù)? {} ---> {} bytes"
.format(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()
print("[x] 錯誤: 無法連接到 {}:{} 遠(yuǎn)程服務(wù)器".format(remote_ip,remote_port))
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
if __name__ == "__main__":
remote_ip = "8.141.58.64" # 對端地址
remote_port = 3389 # 對端端口
local_ip = "0.0.0.0" # 本機(jī)地址
local_port = 10050 # 本機(jī)端口
local_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
local_server.bind((local_ip, local_port))
local_server.listen(5)
print("[*] 本地端口監(jiān)聽 {}:{}".format(local_ip,local_port))
while True:
try:
(local_conn, local_addr) = local_server.accept()
except Exception:
local_server.close()
break
threading.Thread(target=tcp_mapping_request, args=(local_conn, remote_ip, remote_port)).start()
讀者可自行運(yùn)行上述代碼片段,則當(dāng)用戶訪問本機(jī)地址127.0.0.1:10050則會將數(shù)據(jù)包自動轉(zhuǎn)發(fā)到8.141.58.64:3389端口上,此時如果用戶使用遠(yuǎn)程鏈接等工具,則可以實現(xiàn)遠(yuǎn)程桌面鏈接功能,如下圖所示;

以上就是Python實現(xiàn)端口流量轉(zhuǎn)發(fā)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python端口流量轉(zhuǎn)發(fā)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)字典相關(guān)計算問題示例
這篇文章主要介紹了Python字典相關(guān)計算問題,結(jié)合實例形式總結(jié)分析了Python字典相關(guān)的最小值、最大值、排序等操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-02-02
Python教程通過公共鍵對不同字典進(jìn)行排序示例詳解
本篇文章是Python教程基礎(chǔ)篇,通過一些示例為大家講解Python通過公共鍵對不同字典進(jìn)行排序的方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
Python中pycharm編輯器界面風(fēng)格修改方法
這篇文章主要介紹了Python中pycharm編輯器界面風(fēng)格修改方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03

