Cơ sở hạ tầng: Máy chủ trong Datacenter, OS - Debian Squeeze, Webserver - Apache 2.2.16
Tình hình:
Máy chủ trực tiếp được sử dụng bởi các cusotmer của chúng tôi mỗi ngày, điều này khiến cho không thể kiểm tra các điều chỉnh và cải tiến. Do đó, chúng tôi muốn nhân đôi lưu lượng HTTP gửi đến trên máy chủ trực tiếp sang một hoặc nhiều máy chủ từ xa trong thời gian thực. Lưu lượng phải được chuyển đến Máy chủ web cục bộ (trong trường hợp này là Apache) VÀ đến (các) máy chủ từ xa. Qua đó, chúng ta có thể điều chỉnh cấu hình và sử dụng mã khác nhau / được cập nhật trên (các) máy chủ từ xa để đo điểm chuẩn và so sánh với máy chủ trực tiếp hiện tại. Hiện tại các máy chủ web đang nghe khoảng. 60 cổng bổ sung ngoài 80 và 443, do cấu trúc máy khách.
Câu hỏi: Làm thế nào có thể thực hiện sao chép này với một hoặc nhiều máy chủ từ xa?
Chúng tôi đã thử:
- công cụ sao chép agnoster - điều này sẽ yêu cầu một phiên mở cho mỗi cổng không áp dụng. ( https://github.com/agnoster/d repeatator )
- kklis proxy - chỉ chuyển tiếp lưu lượng truy cập đến máy chủ từ xa, nhưng không chuyển nó đến máy chủ web than. ( https://github.com/kklis/proxy )
- iptables - DNAT chỉ chuyển tiếp lưu lượng, nhưng không chuyển nó đến máy chủ web cục bộ
- iptables - TEE không trùng lặp với các máy chủ trong mạng cục bộ -> các máy chủ không nằm trong cùng một mạng do cấu trúc của trung tâm dữ liệu
- đề xuất thay thế được cung cấp cho câu hỏi "lưu lượng truy cập tcp trùng lặp với proxy" tại stackoverflow ( https://stackoverflow.com/questions/7247668/d repeatate-tcp-training-with-a-proxy ) đã không thành công. Như đã đề cập, TEE không hoạt động với các máy chủ từ xa bên ngoài mạng cục bộ. teeproxy không còn khả dụng ( https://github.com/chrislusf/tee-proxy ) và chúng tôi không thể tìm thấy nó ở nơi nào khác.
- Chúng tôi đã thêm một địa chỉ IP thứ hai (nằm trong cùng một mạng) và gán nó cho eth0: 0 (địa chỉ IP chính được gán cho eth0). Không thành công với việc kết hợp IP mới hoặc giao diện ảo eth0: 0 này với chức năng hoặc tuyến đường TEE của iptables.
- các giải pháp thay thế được đề xuất cung cấp cho câu hỏi "sao chép lưu lượng truy cập tcp đến khi nén debian" ( Sao chép lưu lượng TCP đến trên Debian Squeeze ) không thành công. Các phiên cat | nc (cat / tmp / prodpipe | nc 127.0.0.1 12345 và cat / tmp / testpipe | nc 127.0.0.1 23456) bị gián đoạn sau mỗi yêu cầu / kết nối của khách hàng mà không có bất kỳ thông báo hay nhật ký nào. Keepalive đã không thay đổi tình trạng này. Gói TCP không được vận chuyển đến hệ thống từ xa.
- Các thử bổ sung với các tùy chọn khác nhau của socat (HowTo: http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , https://stackoverflow.com/questions/9024227/d repeatate-input- unix-stream-to-multi-tcp-client-used-socat ) và các công cụ tương tự không thành công, vì hàm TEE được cung cấp sẽ chỉ ghi vào FS.
- Tất nhiên, việc tìm kiếm và tìm kiếm "vấn đề" hoặc thiết lập này cũng không thành công.
Chúng tôi đang chạy ra khỏi các tùy chọn ở đây.
Có phương pháp nào để vô hiệu hóa việc thực thi "máy chủ trong mạng cục bộ" của chức năng TEE khi sử dụng IPTABLES không?
Mục tiêu của chúng tôi có thể đạt được bằng cách sử dụng IPTABLES hoặc Routes khác nhau không?
Bạn có biết một công cụ khác cho mục đích này đã được thử nghiệm và hoạt động cho những trường hợp cụ thể này không?
Có một nguồn khác cho tee-proxy (sẽ phù hợp hoàn hảo với yêu cầu của chúng tôi, AFAIK) không?
Cảm ơn trước cho câu trả lời của bạn.
----------
chỉnh sửa: 05.02.2014
đây là kịch bản python, sẽ hoạt động theo cách chúng ta cần:
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')
Các ý kiến để sử dụng tập lệnh này:
Tập lệnh này chuyển tiếp một số cổng cục bộ được cấu hình sang một máy chủ ổ cắm cục bộ và từ xa khác.
Cấu hình:
Thêm vào tệp cấu hình dòng port-Forward.config với nội dung như sau:
Thông báo lỗi được lưu trữ trong tệp 'error.log'.
Kịch bản phân tách các tham số của tệp cấu hình:
Tách từng dòng cấu hình với khoảng trắng
0: cổng cục bộ để nghe
1: cổng cục bộ để chuyển tiếp đến
2: địa chỉ ip từ xa của máy chủ đích
3: cổng từ xa của máy chủ đích
và trả về cài đặt