Altyapı: Veri Merkezindeki Sunucular, İşletim Sistemi - Debian Squeeze, Webserver - Apache 2.2.16
Durum:
Canlı sunucu müşterilerimiz tarafından her gün kullanılıyor, bu da ayarlamalar ve iyileştirmelerin test edilmesini olanaksız kılıyor. Bu nedenle, canlı sunucudaki gelen HTTP trafiğini gerçek zamanlı olarak bir veya daha fazla uzak sunucuya kopyalamak istiyoruz. Trafik yerel Web sunucusuna (bu durumda Apache) VE uzak sunuculara iletilmelidir. Böylece konfigürasyonları ayarlayabilir ve mevcut canlı sunucu ile kıyaslama ve karşılaştırma yapmak için uzak sunucularda farklı / güncellenmiş kodlar kullanabiliriz. Şu anda web sunucusu yaklaşık olarak dinliyor. Müşteri yapısı nedeniyle 80 ve 443'ün yanı sıra 60 ilave port.
Soru: Bir veya daha fazla uzak sunucuya yapılan bu çoğaltma nasıl gerçekleştirilebilir?
Biz zaten denedik:
- agnoster duplicator - bu port için geçerli olmayan bir açık oturum gerektirir. ( https://github.com/agnoster/duplicator )
- kklis proxy - trafiği yalnızca uzak sunucuya iletir, ancak bunu kömür web sunucusuna iletmez. ( https://github.com/kklis/proxy )
- iptables - DNAT yalnızca trafiği iletir, ancak yerel web sunucusuna iletmez
- iptables - TEE sadece yerel ağdaki sunuculara çoğaltılıyor -> veri merkezinin yapısı nedeniyle sunucular aynı ağda bulunmuyor
- stackoverflow'ta "proxy ile yinelenen tcp trafiği" sorusu için önerilen alternatifler ( https://stackoverflow.com/questions/7247668/duplicate-tcp-traffic-with-a-proxy ) başarısız oldu. Belirtildiği gibi, TEE yerel ağın dışındaki uzak sunucularla çalışmaz. teeproxy artık mevcut değil ( https://github.com/chrislusf/tee-proxy ) ve başka bir yerde bulamadık.
- İkinci bir IP adresi ekledik (aynı ağda olan) ve onu eth0: 0 olarak atadık (birincil IP adresi eth0'a atanmış). Bu yeni IP veya sanal arabirim eth0: 0 ile iptables TEE işlevini veya rotalarını birleştirmede başarı yok.
- "Debian sıkıştırmasında gelen tcp trafiğini çoğalt " ( Debian Sıkışmasında gelen TCP trafiğini çoğalt) sorusu için önerilen alternatifler başarısız oldu. Cat | nc oturumları (cat / tmp / prodpipe | nc 127.0.0.1 12345 ve cat / tmp / testpipe | nc 127.0.0.1 23456) herhangi bir bildirimde bulunmadan veya oturum açmadan bir müşteri tarafından bağlanıldığında / kesildiğinde kesilir. Keepalive bu durumu değiştirmedi. TCP Paketleri uzaktaki sisteme aktarılmadı.
- Farklı socat seçenekleriyle ek denemeler (HowTo: http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , https://stackoverflow.com/questions/9024227/duplicate-input- unix-stream-to-multip-tcp-müşterilerine-socat kullanma ) ve benzeri araçlar başarısız oldu, çünkü sağlanan TEE işlevi yalnızca FS'ye yazacak.
- Tabii ki, googling ve bu "sorun" veya kurulum için arama da başarısız oldu.
Buradaki seçeneklerimiz tükeniyor.
IPTABLES kullanırken TEE işlevinin "yerel ağdaki sunucunun" uygulanmasını devre dışı bırakmak için bir yöntem var mı?
Hedefimiz, IPTABLES veya Routes'un farklı kullanımıyla başarılabilir mi?
Bu amaç için test edilmiş ve bu özel durumlar için çalışan farklı bir araç biliyor musunuz?
Tee-proxy için farklı bir kaynak var mı (bunlar bizim gereksinimlerimize mükemmel şekilde uyuyordu, AFAIK)?
Cevaplarınız için şimdiden teşekkür ederiz.
----------
düzenleme: 05.02.2014
işte ihtiyaç duyduğumuz şekilde çalışacak python betiği
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')
Bu betiği kullanacak yorumlar:
Bu betiği, bir dizi yapılandırılmış yerel bağlantı noktasını başka bir yerel ve uzak soket sunucusuna iletir.
Yapılandırma:
Aşağıdaki gibi içerikleri içeren port-forward.config satırları config dosyasına ekleyin:
Hata mesajları 'error.log' dosyasında saklanır.
Betik, config dosyasının parametrelerini böler:
Her config-line'i
0: lokal portu
1: yerel port
2'ye iletmek için : spacer uzak ip adresi
: 3: hedef sunucunun uzak portu
ve dönüş ayarları