Debian

如何將 TCP 流量複製到一台或多台遠端伺服器以進行基準測試?

  • January 25, 2019

基礎設施:數據中心的伺服器,作業系統 - Debian Squeeze,網路伺服器 - Apache 2.2.16


情況:

我們的客戶每天都在使用實時伺服器,因此無法測試調整和改進。因此,我們希望將實時伺服器上的入站 HTTP 流量實時復製到一個或多個遠端伺服器。流量必須傳遞到本地 Web 伺服器(在本例中為 Apache)和遠端伺服器。因此,我們可以調整配置並在遠端伺服器上使用不同/更新的程式碼進行基準測試並與目前的實時伺服器進行比較。目前,網路伺服器正在收聽大約。由於客戶端結構,除了 80 和 443 之外,還有 60 個額外的埠。


問題:如何實現對一台或多台遠端伺服器的複制?

我們已經嘗試過:

我們這裡的選擇已經不多了。

使用 IPTABLES 時,是否有一種方法可以禁用 TEE 功能的“本地網路中的伺服器”的強制執行?

我們的目標可以通過 IPTABLES 或 Routes 的不同用法來實現嗎?

您是否知道用於此目的的不同工具已經過測試並適用於這些特定情況?

tee-proxy 是否有不同的來源(AFAIK 完全符合我們的要求)?


提前感謝您的回复。



編輯:05.02.2014

這是 python 腳本,它將按照我們需要的方式執行:

import socket  
import SimpleHTTPServer  
import SocketServer  
import sys, thread, time  

def main(config, errorlog):
   sys.stderr = file(errorlog, 'a')

   for settings in parse(config):
       thread.start_new_thread(server, settings)

   while True:
       time.sleep(60)

def parse(configline):
   settings = list()
   for line in file(configline):
       parts = line.split()
       settings.append((int(parts[0]), int(parts[1]), parts[2], int(parts[3])))
   return settings

def server(*settings):
   try:
       dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

       dock_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

       dock_socket.bind(('', settings[0]))

       dock_socket.listen(5)

       while True:
           client_socket = dock_socket.accept()[0]

           client_data = client_socket.recv(1024)
           sys.stderr.write("[OK] Data received:\n %s \n" % client_data)

           print "Forward data to local port: %s" % (settings[1])
           local_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
           local_socket.connect(('', settings[1]))
           local_socket.sendall(client_data)

           print "Get response from local socket"
           client_response = local_socket.recv(1024)
           local_socket.close()

           print "Send response to client"
           client_socket.sendall(client_response)
           print "Close client socket"
           client_socket.close()

           print "Forward data to remote server: %s:%s" % (settings[2],settings[3])
           remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
           remote_socket.connect((settings[2], settings[3]))
           remote_socket.sendall(client_data)       

           print "Close remote sockets"
           remote_socket.close()
   except:
       print "[ERROR]: ",
       print sys.exc_info()
       raise

if __name__ == '__main__':
   main('multiforwarder.config', 'error.log')

使用此腳本的註釋:

此腳本將多個已配置的本地埠轉發到另一個本地和遠端套接字伺服器。

配置:

在配置文件中添加port-forward.config行,內容如下:

錯誤消息儲存在文件“error.log”中。

腳本拆分配置文件的參數:

用空格拆分每個配置行

0:本地埠偵聽

1:本地埠轉發到

2:目標伺服器的遠端 ip 地址

3:目標伺服器的遠端埠

並返回設置

是不可能的。TCP 是有狀態的協議。使用者端電腦參與連接的每一步,它永遠不會響應試圖與之通信的兩個單獨的伺服器。您所能做的就是收集網路伺服器或某些代理上的所有 http 請求並重播它們。但這不會給出實時伺服器的準確並發或流量條件。

根據您的描述,GOR 似乎符合您的需求。 https://github.com/buger/gor/ “HTTP 流量實時回放。回放從生產到登台和開發環境的流量。” ?

引用自:https://serverfault.com/questions/570761