インフラストラクチャ:データセンターのサーバー、OS-Debian Squeeze、ウェブサーバー-Apache 2.2.16
状況:
ライブサーバーは毎日お客様によって使用されているため、調整や改善をテストすることはできません。そのため、ライブサーバー上のインバウンドHTTPトラフィックをリアルタイムで1つまたは複数のリモートサーバーに複製したいと考えています。トラフィックは、ローカルWebサーバー(この場合はApache)およびリモートサーバーに渡す必要があります。これにより、構成を調整し、現在のライブサーバーとのベンチマークと比較のためにリモートサーバーで異なる/更新されたコードを使用できます。現在、ウェブサーバーは約をリッスンしています。クライアント構造のため、80および443以外に60個の追加ポート。
質問:1つまたは複数のリモートサーバーへのこの複製をどのように実装できますか?
私たちはすでに試しました:
- agnoster duplicator-これには、ポートごとに1つのオープンセッションが必要ですが、これは適用されません。(https://github.com/agnoster/duplicator)
- kklisプロキシ-トラフィックをリモートサーバーに転送するだけで、lcoal Webサーバーには渡しません。(https://github.com/kklis/proxy)
- iptables-DNATはトラフィックを転送するだけで、ローカルWebサーバーには渡しません
- iptables-TEEはローカルネットワーク内のサーバーにのみ複製します->データセンターの構造上、サーバーは同じネットワークに配置されていません
- stackoverflow(https://stackoverflow.com/questions/7247668/duplicate-tcp-traffic-with-a-proxy)の「プロキシでtcpトラフィックを複製する」という質問に対して提供された代替案は失敗しました。前述のように、TEEはローカルネットワーク外のリモートサーバーでは機能しません。teeproxyは使用できなくなり(https://github.com/chrislusf/tee-proxy)、他の場所で見つけることができませんでした。
- 2番目のIPアドレス(同じネットワーク内にある)を追加し、それをeth0:0に割り当てました(プライマリIPアドレスがeth0に割り当てられています)。この新しいIPまたは仮想インターフェイスeth0:0をiptables TEE機能またはルートと組み合わせても成功しません。
- 「debian squeezeで着信TCPトラフィックを複製する」(Debian Squeezeで着信TCPトラフィックを複製する)の質問に対して提供された代替案は失敗しました。cat | ncセッション(cat / tmp / prodpipe | nc 127.0.0.1 12345およびcat / tmp / testpipe | nc 127.0.0.1 23456)は、クライアントによるすべての要求/接続後に、通知またはログなしで中断されます。キープアライブはこの状況を変えませんでした。TCPパッケージはリモートシステムに転送されませんでした。
- socatに関するの異なるオプションで追加の試行(手引き:http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/、https://stackoverflow.com/questions/9024227/duplicate-input- unix-stream-to-multiple-tcp-clients-using-socat)および同様のツールは、提供されたTEE機能がFSのみに書き込むため、失敗しました。
- もちろん、この「問題」またはセットアップのグーグル検索は失敗しました。
ここでオプションが不足しています。
IPTABLESを使用する場合、TEE機能の「ローカルネットワークのサーバー」の実施を無効にする方法はありますか?
IPTABLESまたはRoutesをさまざまに使用することで目標を達成できますか?
これらの特定の状況でテストされ、機能するこの目的のための別のツールを知っていますか?
tee-proxyの別のソースはありますか(要件に完全に適合すると思いますが)。
返信ありがとうございます。
----------
編集: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:宛先サーバーのリモートポート
および設定を返す