इन्फ्रास्ट्रक्चर: सर्वर इन डाटासेंटर, ओएस - डेबियन स्क्वीज़, वेबसर्वर - अपाचे 2.2.16
परिस्थिति:
लाइव सर्वर हर दिन हमारे क्यूसेमर्स द्वारा उपयोग में है, जो समायोजन और सुधार का परीक्षण करना असंभव बनाता है। इसलिए हम लाइव सर्वर पर इनबाउंड HTTP ट्रैफ़िक को वास्तविक समय में एक या कई रिमोट सर्वर पर डुप्लिकेट करना चाहते हैं। ट्रैफ़िक को स्थानीय वेबसर्वर (इस मामले में अपाचे) और दूरस्थ सर्वर (ओं) को पास करना होगा। जिससे हम कॉन्फ़िगरेशन को समायोजित कर सकते हैं और बेंचमार्किंग के लिए दूरस्थ सर्वर (एस) पर विभिन्न / अपडेटेड कोड का उपयोग कर सकते हैं और वर्तमान लाइव सर्वर के साथ तुलना कर सकते हैं। वर्तमान में वेबसर्वर लगभग सुन रहा है। क्लाइंट संरचना की वजह से 60 और 443 के अलावा 60 अतिरिक्त पोर्ट।
प्रश्न: एक या कई दूरस्थ सर्वरों के लिए यह दोहराव कैसे लागू किया जा सकता है?
हमने पहले ही प्रयास किया है:
- agnoster अनुलिपित्र - इसके लिए प्रति पोर्ट एक खुले सत्र की आवश्यकता होगी जो लागू नहीं है। ( https://github.com/agnoster/duplicator )
- kklis प्रॉक्सी - केवल दूरस्थ सर्वर के लिए ट्रैफ़िक को अग्रेषित करता है, लेकिन इसे lcoal वेबसर्वर के पास नहीं भेजता है। ( https://github.com/kklis/proxy )
- iptables - DNAT केवल ट्रैफ़िक को अग्रेषित करता है, लेकिन इसे स्थानीय वेबसर्वर के पास नहीं भेजता है
- iptables - TEE केवल स्थानीय नेटवर्क में सर्वरों की नक़ल करता है -> डेटाटेंटर की संरचना के कारण सर्वर एक ही नेटवर्क में स्थित नहीं हैं
- स्टैकओवरफ़्लो ( /programming/7247668/duplicate-tcp-traffic-with-a-proxy ) पर प्रश्न "डुप्लीकेट टीसीपी ट्रैफ़िक विद अ प्रॉक्सी" के लिए दिए गए विकल्पों का सुझाव असफल रहा। जैसा कि उल्लेख किया गया है, टीईई स्थानीय नेटवर्क के बाहर दूरस्थ सर्वर के साथ काम नहीं करता है। टेप्रॉक्सी अब उपलब्ध नहीं है ( https://github.com/chrislusf/tee-proxy ) और हम इसे कहीं और नहीं ढूंढ सकते।
- हमने एक दूसरा आईपी पता (जो उसी नेटवर्क में है) को जोड़ा है और इसे eth0: 0 (प्राथमिक आईपी एड्रेस को eth0 को दिया है) को सौंपा है। इस नए आईपी या वर्चुअल इंटरफ़ेस eth0: 0 को iptables TEE फ़ंक्शन या मार्गों के साथ संयोजित करने में कोई सफलता नहीं।
- "डेबियन निचोड़ पर डुप्लिकेट इनकमिंग टीसीपी ट्रैफ़िक" (डेबियन स्क्वीज़ पर डुप्लिकेट इनकमिंग टीसीपी ट्रैफ़िक ) प्रश्न के लिए प्रदान किए गए विकल्प असफल थे। बिल्ली | एनसी सत्र (बिल्ली / tmp / prodpipe | nc 127.0.0.1 12345 और cat / tmp / testpipe | nc 127.0.0.1 23456) प्रत्येक अनुरोध के बाद बाधित होते हैं / बिना किसी नोटिस या लॉग के किसी ग्राहक से जुड़ते हैं। रखवाले ने इस स्थिति को नहीं बदला। टीसीपी संकुल को दूरस्थ प्रणाली में नहीं पहुंचाया गया था।
- Socat के विभिन्न विकल्पों के साथ साथ अतिरिक्त कोशिश करता (HowTo: http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , /programming/9024227/duplicate-input- यूनिक्स-स्ट्रीम-टू-मल्टिपल-टीसीपी-क्लाइंट्स-यूजिंग-सोसाइटी ) और इसी तरह के उपकरण असफल थे, क्योंकि प्रदान किए गए टीईई फ़ंक्शन केवल एफएस को लिखेंगे।
- बेशक, गुगली करना और इस "समस्या" या सेटअप की खोज करना असफल रहा।
हम यहां विकल्पों से भाग रहे हैं।
क्या IPTABLES का उपयोग करते समय TEE फ़ंक्शन के "स्थानीय नेटवर्क में सर्वर" के प्रवर्तन को अक्षम करने की कोई विधि है?
क्या IPTABLES या रूट के विभिन्न उपयोग से हमारा लक्ष्य प्राप्त किया जा सकता है?
क्या आप इस उद्देश्य के लिए एक अलग उपकरण जानते हैं जो इन विशिष्ट परिस्थितियों के लिए परीक्षण और काम करता है?
क्या टी-प्रॉक्सी के लिए एक अलग स्रोत है (जो हमारी आवश्यकताओं को पूरी तरह से फिट करेगा, एएफएआईके)?
आपके उत्तरों के लिए अग्रिम धन्यवाद।
----------
संपादित करें: 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')
इस स्क्रिप्ट का उपयोग करने के लिए टिप्पणियां:
यह स्क्रिप्ट किसी अन्य स्थानीय और दूरस्थ सॉकेट सर्वर पर कॉन्फ़िगर किए गए स्थानीय पोर्ट की एक संख्या को अग्रेषित करती है।
कॉन्फ़िगरेशन:
कॉन्फ़िगरेशन फ़ाइल पोर्ट-फारवर्ड में जोड़ें। इस प्रकार की सामग्री के साथ लाइनों को कॉन्फ़िगर करें:
त्रुटि संदेश फ़ाइल में जमा हो जाते हैं 'error.log'।
स्क्रिप्ट कॉन्फ़िगर फ़ाइल के मापदंडों को
विभाजित करती है : प्रत्येक कॉन्फ़िग-लाइन को स्पेस के साथ विभाजित करें
0: स्थानीय पोर्ट को
1 सुनने के लिए : स्थानीय पोर्ट
2 पर फॉरवर्ड करने के लिए : रिमोट आईपी डेस्टिनेशन ऑफ़ सर्वर
3: डेस्टिनेशन पोर्ट ऑफ़ डेस्टिनेशन सर्वर
और रिटर्न सेटिंग्स