인프라 : 데이터 센터 서버, OS-데비안 스퀴즈, 웹 서버-Apache 2.2.16
상태:
라이브 서버는 고객이 매일 사용하므로 조정 및 개선 사항을 테스트 할 수 없습니다. 따라서 라이브 서버의 인바운드 HTTP 트래픽을 하나 이상의 원격 서버에 실시간으로 복제하려고합니다. 트래픽은 로컬 웹 서버 (이 경우 Apache) 및 원격 서버로 전달되어야합니다. 이를 통해 현재 라이브 서버와 벤치마킹 및 비교를 위해 원격 서버에서 구성을 조정하고 다른 / 업데이트 된 코드를 사용할 수 있습니다. 현재 웹 서버는 약을 듣고 있습니다. 클라이언트 구조로 인해 80 및 443 이외의 추가 포트 60 개.
질문 : 하나 또는 여러 원격 서버에 대한 이러한 복제를 어떻게 구현할 수 있습니까?
우리는 이미 시도했습니다 :
- agnoster duplicator-포트 당 하나의 열린 세션이 필요하며 적용 할 수 없습니다. ( https://github.com/agnoster/duplicator )
- kklis 프록시-트래픽을 원격 서버로만 전달하지만 lcoal 웹 서버로 전달하지는 않습니다. ( https://github.com/kklis/proxy )
- iptables-DNAT는 트래픽을 전달 만하지만 로컬 웹 서버로 전달하지는 않습니다.
- 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에 할당했습니다 (1 차 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의 다른 옵션으로 추가 시도 (방법 : http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , https://stackoverflow.com/questions/9024227/duplicate-input- 제공된 TEE 기능이 FS에만 쓰기 때문에 unix-stream-to-multiple-tcp-clients-using-socat ) 및 유사한 도구가 실패했습니다.
- 물론이 "문제"또는 설정에 대한 인터넷 검색 및 검색도 실패했습니다.
옵션이 부족합니다.
IPTABLES를 사용할 때 TEE 기능의 "로컬 네트워크의 서버"시행을 비활성화하는 방법이 있습니까?
IPTABLES 또는 경로를 다르게 사용하여 목표를 달성 할 수 있습니까?
테스트를 거쳐 이러한 특정 상황에서 작동하는 다른 용도의 도구를 알고 있습니까?
티 프록시에 대한 다른 소스가 있습니까 (AFAIK의 요구 사항에 완벽하게 부합 함)?
답장을 보내 주셔서 감사합니다.
----------
편집 : 05.02.2014
다음은 파이썬 스크립트이며, 필요한 방식으로 작동합니다.
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 : 대상 서버의 원격 포트
및 리턴 설정