玩轉網路-TCP代理-3
阿新 • • 發佈:2018-12-22
TCP代理
什麼是代理
瞭解一下什麼是Proxy?
當我們有三臺機器,1號和2號沒法互相通訊,可能由於各種各樣的網路原因沒法通訊,可能是內網機器被隔絕,也有可能是防火牆一些其他原因,而3號又能跟2號通訊,也能跟1號通訊,所以我們在2號上面執行TCP代理,把我們流量進行中轉
設計代理
我們要先想一下,一個socket能同時與幾個端進行通訊呢?答案:2個
因為我一個send資料,一個recv資料,send與recv兩個過程其實就是兩個端在做
如果要實現3個主機進行通訊,所以要用新的socket進行轉發到的機子上
這就是一個代理的過程
實現代理
首先我們就不用真實壞境,就寫一個客戶端和服務端
服務端TestServer
#coding:utf-8
from socket import *
s=socket(AF_INET,SOCK_STREAM)
s.bind(('',6666))
s.listen(1)
while True:
sock,addr = s.accept #接收一下請求連結
print 'Connected by',addr
data = sock.recv(1024)
print data
sock.send('Yes')
客戶端TestServer
啟動我們的客戶端需要
python TestServer.py 6666
coding:utf-8 from socket import * import sys #匯入一個標準庫 HOST = '127.0.0.1' #argv是一個列表,0位裝的是本身檔案的路徑 #1位裝的是cmd>test.py abcd cdef,就是abcd這一塊 #2位裝的就是cdef #如果是[1:]就是['abcd','cdef'] PORT = sys.argv[1] c = socket(AF_INET,SOCK_STREAM) c.connect(('127.0.0.1',int(PORT))) #因為arge取出來的都是字元型,所有用int進行轉意 print 'Connect sucess.' c.send('YES or NO?') data = c.recv(1024) print data c.close()
coding:utf-8 from socket import * from sys import * #匯入模組 def Usage(): #定義一個幫助文件的函式 print '[Usage]TCPProxy.py [TargetHost] [TargetPort]' try: THOST = argv[2] #一旦沒有讀取到則執行Usage()函式 int(TPORT) =`int(argv[3]) except: print 'Please input pram.' MainSocket = socket(AF_INET,SOCK_STREAM) #定義主體的socket,全域性變數 RemoteSocket = socket(AF_INET,SOCK_STREAM) #定義遠端socket def SetSocket(PORT): #定義函式,這個函式的作用就是繫結本機埠 MainSocket.bind(('',PORT)) #繫結本機和埠 MainSocket.listen(1) #定義最大連結 def ForwardData(Data) #定義一個轉發的函式 RemoteSocket.connect((THOST,TPORT)) RemoteSocket.send(Data) #傳送轉發的內容 Rdata = RemoteSocket.recv(1024) #接收要轉發的內容 RemoteSocket.close() #關閉socket return Rdata #返回轉發內容 def MainHandle(): #這個是程式主要的函式,處理客戶端與另一個主機通訊的中間代理 MainSocket,MainAddr = MainSocket.accept() #接收一下請求連結 print 'Connected by',MainAddr While True: Ldata = MainSock.recv(1024) #接收客戶端要轉發的內容 Rdata = ForwardData(Ldata) #將轉發內容賦值給Rdata MainSock.send(Rdata) #傳送轉發內容 if__name__=='__main__': try: LPORT= int(argv[1]) #讓使用者填寫本機連結埠 SetSocket(LPORT) #呼叫我們自己設定的函式繫結LPORT埠 MainHandle() except: Usage() ``