পরিকাঠামো: ডেটাসেন্টার, ওএস-এ সার্ভারস - ডেবিয়ান স্কিজ, ওয়েবসার্ভার - অ্যাপাচি ২.২.১6
অবস্থা:
লাইভ সার্ভারটি প্রতিদিন আমাদের কসোথার্স দ্বারা ব্যবহৃত হয়, যা সামঞ্জস্য এবং উন্নতিগুলি পরীক্ষা করা অসম্ভব করে তোলে। তাই আমরা লাইভ সার্ভারের ইনবাউন্ড এইচটিটিপি ট্র্যাফিকটিকে রিয়েলটাইমের এক বা একাধিক রিমোট সার্ভারে নকল করতে চাই। ট্র্যাফিক স্থানীয় ওয়েবসারভারে (এই ক্ষেত্রে অ্যাপাচি) এবং দূরবর্তী সার্ভারগুলিতে যেতে হবে। এর মাধ্যমে আমরা কনফিগারেশনগুলি সামঞ্জস্য করতে পারি এবং বর্তমান লাইভ-সার্ভারের সাথে বেঞ্চমার্কিং এবং তুলনার জন্য দূরবর্তী সার্ভারে বিভিন্ন / আপডেট হওয়া কোড ব্যবহার করতে পারি। বর্তমানে ওয়েবসারভার প্রায় শুনছে। ক্লায়েন্ট স্ট্রাকচারের কারণে 80 এবং 443 এর পাশাপাশি 60 টি অতিরিক্ত পোর্ট।
প্রশ্ন: এক বা একাধিক রিমোট সার্ভারের এই সদৃশটি কীভাবে কার্যকর করা যেতে পারে?
আমরা ইতিমধ্যে চেষ্টা করেছি:
- অগ্নোস্টার ডুপ্লিকেটর - এর জন্য প্রতি বন্দর প্রতি একটি উন্মুক্ত অধিবেশন প্রয়োজন যা প্রযোজ্য নয়। ( https://github.com/agnoster/ ডুপ্লিকেটর )
- kklis প্রক্সি - কেবল দূরবর্তী সার্ভারে ট্র্যাফিক ফরোয়ার্ড করে, তবে এটি Lcoal ওয়েবসার্ভারে দেয় না। ( https://github.com/kklis/proxy )
- আইপেটেবলস - ডিএনএটি কেবল ট্র্যাফিককে ফরোয়ার্ড করে তবে এটি স্থানীয় ওয়েব সার্ভারে দেয় না
- iptables - TEE কেবলমাত্র স্থানীয় নেটওয়ার্কে সার্ভারগুলিতে নকল করে -> ডেটাসেন্টারের কাঠামোর কারণে সার্ভারগুলি একই নেটওয়ার্কে অবস্থিত না
- স্ট্যাকওভারফ্লোতে "প্রক্সি সহ ডুপ্লিকেট টিসিপি ট্র্যাফিক" প্রশ্নের জন্য প্রদত্ত প্রস্তাবিত বিকল্পগুলি ( /programming/7247668/dictate-tcp-traffic-with-a-proxy ) ব্যর্থ ছিল। উল্লিখিত হিসাবে, TEE স্থানীয় নেটওয়ার্কের বাইরে দূরবর্তী সার্ভারগুলির সাথে কাজ করে না। teeproxy আর উপলভ্য নয় ( https://github.com/chrislusf/tee-proxy ) এবং আমরা এটি অন্য কোথাও খুঁজে পাইনি।
- আমরা একটি দ্বিতীয় আইপি ঠিকানা যুক্ত করেছি (যা একই নেটওয়ার্কে রয়েছে) এবং এটিকে0: 0 এ নির্ধারিত করা হয়েছে (প্রাথমিক আইপি ঠিকানাটি ইথ0-তে নির্ধারিত হয়)। এই নতুন আইপি বা ভার্চুয়াল ইন্টারফেস ইথ0: 0 এর সাথে আইপটিবল টিআইই ফাংশন বা রুটের সংমিশ্রণে কোনও সাফল্য নেই
- "ডেবিয়ান স্কিজে ডুপ্লিকেট ইনকামিং টিসিপি ট্র্যাফিক " (দেবিয়ান স্কুইজে ডুপ্লিকেট ইনকামিং টিসিপি ট্র্যাফিক ) প্রদানের জন্য প্রস্তাবিত বিকল্পগুলি ব্যর্থ হয়েছিল। বিড়াল | এনসি সেশনস (বিড়াল / টিএমপি / প্রোডাইপ | এনসি 127.0.0.1 12345 এবং বিড়াল / টিএমপি / টেস্টপাইপ | এনসি 127.0.0.1 23456) কোনও অনুরোধের পরে বা কোনও বিজ্ঞপ্তি বা লগ ছাড়াই কোনও ক্লায়েন্টের সাথে সংযুক্ত হওয়ার পরে বাধাগ্রস্ত হয়। কিপালাইভ এই পরিস্থিতিতে পরিবর্তন করেনি। টিসিপি প্যাকেজগুলি রিমোট সিস্টেমে স্থানান্তরিত হয়নি।
- স্যাকটের বিভিন্ন বিকল্পের সাথে অতিরিক্ত চেষ্টা (HowTo: http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , /programming/9024227/ নকল- ইনপুট- ইউনিক্স-স্ট্রিমি-টু-মাল্টিপল-টিসিপি-ক্লায়েন্টস-সজ্যাট ) এবং অনুরূপ সরঞ্জামগুলি ব্যর্থ হয়েছিল, কারণ প্রদত্ত টিআইই ফাংশনটি কেবল এফএস-এ লিখবে।
- অবশ্যই, এই "সমস্যা" বা সেটআপটি গুগল করা এবং অনুসন্ধান করাও ব্যর্থ হয়েছিল।
আমরা এখানে বিকল্পগুলির বাইরে চলেছি।
আইপিটিবেলস ব্যবহার করার সময় টিআইই ফাংশনের "স্থানীয় নেটওয়ার্কে সার্ভার" প্রয়োগের অক্ষম করার কোনও পদ্ধতি আছে কি?
আইপিটিবেলস বা রুটগুলির বিভিন্ন ব্যবহার দ্বারা আমাদের লক্ষ্য অর্জন করা যেতে পারে?
আপনি কি এই উদ্দেশ্যে একটি আলাদা সরঞ্জাম জানেন যা পরীক্ষা করা হয়েছে এবং এই নির্দিষ্ট পরিস্থিতিতে কাজ করে?
টি-প্রক্সি (যা আমাদের প্রয়োজনীয়তা পুরোপুরি ফিট করে, আফাইক) এর জন্য আলাদা উত্স আছে কি?
আপনার উত্তরের জন্য অগ্রিম ধন্যবাদ.
----------
সম্পাদনা: 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: গন্তব্য সার্ভারের রিমোট পোর্ট
এবং রিটার্ন সেটিংস