基础设施:数据中心中的服务器,OS-Debian Squeeze,Web服务器-Apache 2.2.16
情况:
我们的客户每天都在使用实时服务器,因此无法测试调整和改进。因此,我们想将实时服务器上的入站HTTP通信实时复制到一个或多个远程服务器。流量必须传递到本地Web服务器(在本例中为Apache)和远程服务器。因此,我们可以调整配置,并在远程服务器上使用不同/更新的代码进行基准测试,并与当前的实时服务器进行比较。目前,网络服务器正在监听大约。由于客户端结构,除了80和443之外,还增加了60个端口。
问题:如何实现与一台或多台远程服务器的重复?
我们已经尝试过:
- agnoster复制器-这将要求每个端口一个开放会话,这是不适用的。(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),我们在其他地方找不到它。
- 我们添加了第二个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)会在没有任何通知或日志的情况下被客户端中断。Keepalive并没有改变这种情况。TCP程序包未传输到远程系统。
- 其他尝试用socat不同的选项(Howto:如何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或路由可以实现我们的目标吗?
您是否知道为此目的测试过并且可以在这些特定情况下使用的其他工具?
tee-proxy是否有其他来源(完全适合我们的要求,AFIAK)?
提前感谢您的回复。
----------
编辑: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:目标服务器的远程端口
并返回设置