আমি কীভাবে আমার অ্যাপ্লিকেশনটির জন্য পোর্ট সংরক্ষণ করব?


29

আমি আমার কাস্টম অ্যাপ্লিকেশনগুলির জন্য পোর্টগুলির একটি তালিকা কীভাবে সংরক্ষণ করব?

সুনির্দিষ্টভাবে বলতে গেলে, আমি যে পণ্যটি তৈরি করছি তাতে প্রচুর প্রক্রিয়া এবং তাদের মধ্যে প্রচুর আন্তঃযোগাযোগ রয়েছে।

আমার যে সমস্যা হচ্ছে তা হ'ল - প্রতিবার একবারে - ওএস আমার পোর্টগুলি চুরি করে। এটি বিরল, তবে এটি ঘটে।

এটি হতে পারে কারণ কোনও ভিন্ন অ্যাপ্লিকেশন কোনও পোর্ট নির্দিষ্ট না করে ":: বাইন্ড" ব্যবহার করেছে।

বা কখনও কখনও আমার নিজের অ্যাপ্লিকেশনগুলি আনবাউন্ড সকেটের সাথে ":: সংযুক্ত" বললে পোর্টটি চুরি করে। ম্যান পৃষ্ঠা থেকে যেমনটি দেখা গেছে:

যদি সকেটটি ইতিমধ্যে কোনও স্থানীয় ঠিকানার সাথে আবদ্ধ না হয়ে থাকে তবে সংযোগ () এটিকে এমন কোনও ঠিকানার সাথে আবদ্ধ করবে যা সকেটের ঠিকানা পরিবার AF_UNIX না হলে অব্যবহৃত স্থানীয় ঠিকানা।

সুতরাং আমার প্রশ্নটি হল, ওএসগুলি সেগুলি ব্যবহার না করে আমি যে পোর্টগুলি আমার প্রয়োজন তা সংরক্ষণ করতে পারি? এগুলি কি / ইত্যাদি / পরিষেবা দিয়ে সম্পাদন করা যায়? নাকি আলাদা উপায় আছে?


1
আপনি কি এর পরিবর্তে AF_UNIX সকেট ব্যবহার করতে পারেন?
অ্যালেক্স

2
আপনার নিজের অ্যাপ্লিকেশনটি 'বন্দর চুরি' কেন করছে তা আরও চিন্তিত?
এইটবিটটনি

আমি যদি আমার সফ্টওয়্যার দিয়ে যেতে এবং প্রতিটি সংযোগের ক্লায়েন্টের দিকটি একটি নির্দিষ্ট বন্দরে আবদ্ধ করতে চাই তবে আমি বিতর্ক করছি। আমার অ্যাপ্লিকেশনগুলিতে প্রচুর সংযোগের পথ রয়েছে বলে এটি আপডেট করা আমার পক্ষে বেশ কাজ । আমি এটি করার সময় না পাওয়া পর্যন্ত ওএসে পোর্ট সংরক্ষণ করা ভাল স্টপ ফাঁক সমাধান হতে পারত।
মাইকেল বেকার

আমি নিশ্চিত নই যে SELinuxএনফোর্সিং মোডে আপনার প্রয়োজনীয়তা মেটাতে পারে কিনা , আমি এখনও এটি শিখছি। সুতরাং কেবল অনুমান, আপনার নিজের বন্দরগুলি সংরক্ষণSELinux করার জন্য আপনি নিজের নীতিটি সংজ্ঞায়িত করতে পারেন । যদি আপনার অ্যাপ্লিকেশনটি সর্বত্র চালিত হয় (সার্ভার অ্যাপ্লিকেশন নয়) তবে আমি আশঙ্কা করছি আপনি চালু বা বন্ধ আছে তা নিয়ন্ত্রণ করতে পারবেন না । my_server_port_t tcp 1111, 2222, 3333, 4444-4600SELinux
লিউইয়ান 研

"চুরি" করার মাধ্যমে আমি ধরে নিচ্ছি যে আপনি আবেদন করার সুযোগ পাওয়ার আগেই তৃতীয় পক্ষের অ্যাপটি আপনার নির্বাচিত বন্দর নম্বরটিতে আবশ্যক, কারণ তৃতীয় পক্ষের অ্যাপ্লিকেশনটি 0 এ বাঁধার জন্য অনুরোধ করেছে এবং ওএস এলোমেলোভাবে আপনার নির্বাচিত পোর্ট নম্বরটি নির্ধারিত করেছে তৃতীয় পক্ষের অ্যাপ্লিকেশন। যদি তা হয় তবে unix.stackexchange.com/a/38724/27865 দেখুন
Lak Lakata

উত্তর:


14

প্রযুক্তিগতভাবে, "সংরক্ষিত বন্দর" বলে কোনও জিনিস নেই।

টিসিপি / ইউডিপি-তে, কোনও বন্দরকে "রিজার্ভ" করার একমাত্র উপায় আসলে bind()এটির জন্য একটি সকেট। একটি আবদ্ধ বন্দর অন্যান্য অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হবে না; একটি অব্যবহৃত পোর্টটি ভাল, অব্যবহৃত তাই অন্যান্য অ্যাপ্লিকেশনগুলি এটি ব্যবহারের জন্য নিখরচায়।

আপনি যদি সার্ভার সফটওয়্যারটি লিখছেন, তবে আপনি অ্যাপ্লিকেশন কোডটিতে যত তাড়াতাড়ি চান আপনার সকেটগুলিকে নির্দিষ্ট পোর্টে আবদ্ধ করতে পারেন। পোর্ট সংখ্যাগুলি কনফিগারযোগ্য করুন, বা ডকুমেন্টেশনে কমপক্ষে স্পষ্টভাবে জানিয়ে দিন, যাতে কোনও সিস্টেম প্রশাসক দ্রুত সংঘর্ষ সনাক্ত করতে পারে এবং বিরোধী অ্যাপ্লিকেশনগুলিকে পৃথক সার্ভারে স্থানান্তর করতে পারে।


1
এছাড়াও, যদি সম্ভব হয় তবে সুপরিচিত / সংরক্ষিত বন্দরগুলি ব্যবহার করা এড়িয়ে চলুন।
এইটবিটটনি

কখনও কখনও সংরক্ষিত বন্দর আছে। এটি ভাল সাধারণ পরামর্শ তবে লিনাক্সের সঠিক উত্তর নয়।
জেসন নিউটন

18

কার্নেলটি আপনার ক্লায়েন্টগুলিকে লিনাক্সে আপনার সার্ভারের জন্য ব্যবহার করতে ইচ্ছুক হিসাবে 49000 এবং 49001 দেবে না তা নিশ্চিত করার জন্য।

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

এটি ফেলে দিন /etc/sysctl.conf, এবং তারপর চালান sysctl -p

মনে রাখবেন এটি নিরীক্ষিত।

তথ্যসূত্র


আমি এটি চেষ্টা করেছিলাম, তবে এটি আমার নিজস্ব বন্দরগুলি বন্দর ব্যবহার করতে বাধা দেয়! নামগুলির সাথে পোর্ট নম্বর নির্ধারণ সম্পর্কে কী /etc/services?

@ ব্যবহারকারী 134197 আপনি যদি আপনার বাইন্ড অনুরোধে স্পষ্টভাবে একটি শূন্য পোর্ট নম্বর ব্যবহার করেন তবে আপনার নিজের অ্যাপ্লিকেশনটি সেই বন্দরগুলি ব্যবহার করা থেকে বিরত রাখা উচিত নয়। এটা আমার জন্য কাজ করে.
Lakata

15

আসলে, উপরের উত্তরটি সম্পূর্ণ সঠিক নয় accurate নেট সিস্টেম নেট.নেট.আইপ.পরেঞ্জ.এফস্ট এবং নেট.inet.ip.portrange.last ওএস র্যান্ডম পোর্টগুলির জন্য বরাদ্দ করতে পারে এমন পোর্টগুলির পরিসীমা নির্দিষ্ট করে। আপনি নিশ্চিত করতে চাইবেন যে আপনার আবেদনের জন্য সংরক্ষিত বন্দরগুলির পরিসীমা এই পরিবর্তনশীলগুলির মধ্যে না পড়ে fall

ফ্রিবিএসডি হ্যান্ডবুক, বিভাগ: 12.14 এ একবার দেখুন। কার্নেলের সীমাবদ্ধতাগুলি টিউন করছে । তবে একই বেসিক ভিত্তিটি লিনাক্সের ক্ষেত্রেও প্রয়োগ করা উচিত।


: এছাড়াও, এই লিঙ্কটি সহায়তা হতে পারে stackoverflow.com/questions/913501/...
MattK

3
আমার মনে হয় লিনাক্সে এটি বলা হয়net.ipv4.ip_local_port_range
ব্রায়ান গর্ডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.