Infrastruktur: Server di Datacenter, OS - Debian Squeeze, Webserver - Apache 2.2.16
Situasi:
Server langsung sedang digunakan oleh cusotmers kami setiap hari, yang membuatnya tidak mungkin untuk menguji penyesuaian dan peningkatan. Karenanya kami ingin menduplikasi lalu lintas HTTP masuk pada server langsung ke satu atau beberapa server jarak jauh secara realtime. Lalu lintas harus diteruskan ke server Web lokal (dalam hal ini Apache) DAN ke server jarak jauh. Dengan demikian kita dapat menyesuaikan konfigurasi dan menggunakan kode yang berbeda / diperbarui pada server jarak jauh untuk pembandingan dan perbandingan dengan server-hidup saat ini. Saat ini server web sedang mendengarkan sekitar. 60 port tambahan selain 80 dan 443, karena struktur klien.
Pertanyaan: Bagaimana duplikasi ini ke satu atau beberapa server jarak jauh diimplementasikan?
Kami sudah mencoba:
- agnoster duplikator - ini akan membutuhkan satu sesi terbuka per port yang tidak berlaku. ( https://github.com/agnoster/duplicator )
- kklis proxy - tidak hanya meneruskan lalu lintas ke server jauh, tetapi tidak meneruskannya ke server web lcoal. ( https://github.com/kklis/proxy )
- iptables - DNAT hanya meneruskan lalu lintas, tetapi tidak meneruskannya ke server web lokal
- iptables - TEE tidak hanya menggandakan ke server di jaringan lokal -> server tidak berada di jaringan yang sama karena struktur pusat data
- alternatif yang disarankan disediakan untuk pertanyaan "duplikat tcp traffic dengan proksi" di stackoverflow ( https://stackoverflow.com/questions/7247668/duplicate-tcp-traffic-with-a-proxy ) tidak berhasil. Seperti yang disebutkan, TEE tidak bekerja dengan server jauh di luar jaringan lokal. teeproxy tidak lagi tersedia ( https://github.com/chrislusf/tee-proxy ) dan kami tidak dapat menemukannya di tempat lain.
- Kami telah menambahkan alamat IP kedua (yang berada di jaringan yang sama) dan menetapkannya ke eth0: 0 (alamat IP primer ditugaskan ke eth0). Tidak berhasil menggabungkan IP baru ini atau antarmuka virtual eth0: 0 dengan fungsi atau rute iptables TEE.
- alternatif yang disarankan disediakan untuk pertanyaan "duplikat lalu lintas tcp masuk pada debian squeeze" ( Gandakan lalu lintas TCP masuk pada Debian Squeeze ) tidak berhasil. Sesi kucing | nc (cat / tmp / prodpipe | nc 127.0.0.1 12345 dan cat / tmp / testpipe | nc 127.0.0.1 23456) terputus setelah setiap permintaan / terhubung oleh klien tanpa pemberitahuan atau log. Keepalive tidak mengubah situasi ini. Paket TCP tidak diangkut ke sistem jarak jauh.
- Mencoba tambahan dengan opsi socat yang berbeda (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 ) dan alat-alat serupa tidak berhasil, karena fungsi TEE yang disediakan hanya akan menulis ke FS saja.
- Tentu saja, googling dan mencari "masalah" atau penyiapan ini juga tidak berhasil.
Kami kehabisan opsi di sini.
Apakah ada metode untuk menonaktifkan penegakan "server di jaringan lokal" dari fungsi TEE saat menggunakan IPTABLES?
Bisakah tujuan kita dicapai dengan penggunaan IPTABLES atau Rute yang berbeda?
Apakah Anda tahu alat yang berbeda untuk tujuan ini yang telah diuji dan berfungsi untuk keadaan khusus ini?
Apakah ada sumber berbeda untuk tee-proxy (yang sesuai dengan kebutuhan kami, AFAIK)?
Terima kasih sebelumnya atas balasan Anda.
----------
sunting: 05.02.2014
di sini adalah skrip python, yang akan berfungsi seperti yang kita butuhkan:
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')
Komentar untuk menggunakan skrip ini: Skrip
ini meneruskan sejumlah port lokal yang dikonfigurasikan ke server socket lokal dan remote lainnya.
Konfigurasi:
Tambahkan ke file config port-forward.config baris dengan konten sebagai berikut:
Pesan kesalahan disimpan dalam file 'error.log'.
Script membagi parameter file config:
Pisahkan setiap config-line dengan spasi
0: port lokal untuk mendengarkan
1: port lokal untuk meneruskan ke
2: alamat ip jarak jauh dari server tujuan
3: port jarak jauh dari server tujuan
dan mengembalikan pengaturan