লিনাক্সে একজন সাধারণ ব্যবহারকারী হিসাবে 80 পোর্টে একটি সার্ভার কীভাবে চালানো যায়?


310

আমি বেশ কিছুদিন ধরে সমাধান সম্পর্কে গুগল করেছি, কিন্তু কোনও উত্তর খুঁজে পাইনি।

আমি উবুন্টু লিনাক্সে আছি এবং ৮০ বন্দর পোর্টে একটি সার্ভার চালাতে চাই, তবে উবুন্টুর সুরক্ষা ব্যবস্থার কারণে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

java.net.BindException: অনুমতি অস্বীকার করা হয়েছে: 80

আমি মনে করি হয় এই সুরক্ষা ব্যবস্থাটি অক্ষম করার পক্ষে যথেষ্ট সহজ হওয়া উচিত যাতে 80 ব্যবহারকারীদের জন্য পোর্ট 80 উপলব্ধ থাকে বা 80 ব্যবহারকারীকে পোর্ট 80 অ্যাক্সেসের জন্য প্রয়োজনীয় সুযোগগুলি সরবরাহ করতে পারে।


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


4
আপনি পারবেন না। 1024 এর নীচের পোর্টগুলি সুবিধাপ্রাপ্ত এবং কেবলমাত্র রুট তাদের উপর শ্রবণ সকেট খুলতে পারে। করার উপযুক্ত জিনিস হ'ল অনুমতিগুলি খোলার পরে বাদ দেওয়া।
ফ্যালকন মোমোট

2
"অজ্ঞাতনামা" - বিশ্বের ব্যবহারকারীরা নির্দিষ্ট বন্দরগুলিতে নির্দিষ্ট পরিষেবাগুলির সন্ধানের জন্য প্রশিক্ষণ পেয়েছেন। কিছু ক্ষেত্রে, এটি মানসম্মত হয়েছে। উদাহরণস্বরূপ, 80 পোর্টে HTTP এবং 443 পোর্টে HTTPS Its বিশ্বের ব্যবহারকারী এবং মানকে পরিবর্তন করা তার ধরণের শক্ত।

1
@ ফ্যালকনমোট যদি 1024 এর নীচের বন্দরগুলি সুবিধাযুক্ত হয় তবে কেন 80,000 বন্দরটিতে রুট সুবিধার্থে অ্যাপাচি সার্ভারের পাসওয়ার্ড প্রবেশের প্রয়োজন হয় না এবং তারা কীভাবে এটি করে? আমি মনে করি প্রশ্নকর্তা কীভাবে জিনিসগুলি (কীভাবে এটি প্রযুক্তিগতভাবে রুট হিসাবে ব্যবহৃত হচ্ছে কিনা) তা জানতে চায় do আমি ভুল হলে নির্দ্বিধায় বলুন, দীপক মিত্তাল।
শুলে

উত্তর:


354

সংক্ষিপ্ত উত্তর: আপনি পারবেন না। 1024 নীচের পোর্টগুলি কেবল রুট দ্বারা খোলা যেতে পারে। মতামত অনুসারে - ভাল, আপনি CAP_NET_BIND_SERVICE ব্যবহার করতে পারেন তবে জাভা বিনে প্রয়োগ করা এই পদ্ধতির কোনও সুরক্ষা ঝুঁকি না থাকলে এই সেটিংটি দিয়ে কোনও জাভা প্রোগ্রাম চালানো হবে, এটি অনাকাঙ্ক্ষিত।

দীর্ঘ উত্তর: আপনি 80 বন্দরটিতে সংযোগগুলি অন্য কোনও বন্দরে পুনর্নির্দেশ করতে পারেন আপনি সাধারণ ব্যবহারকারী হিসাবে খুলতে পারেন।

রুট হিসাবে চালান:

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

লুপব্যাক ডিভাইসগুলি (লোকালহোস্টের মতো) প্রিলআউটিং বিধিগুলি ব্যবহার করে না, যদি আপনার লোকালহোস্ট ইত্যাদি ব্যবহারের প্রয়োজন হয় তবে এই নিয়মটিও যুক্ত করুন ( ধন্যবাদ @ ফ্রেঞ্চকো ):

# iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

দ্রষ্টব্য: উপরের সমাধানটি মাল্টি-ব্যবহারকারী সিস্টেমগুলির জন্য উপযুক্ত নয় , কারণ কোনও ব্যবহারকারী 8080 পোর্ট খুলতে পারে (বা অন্য কোনও উচ্চ বন্দর আপনি ব্যবহারের সিদ্ধান্ত নেন), এভাবে ট্র্যাফিককে বাধা দেয়। (ক্রেডিটস সিজারব ))

সম্পাদনা: মতামত প্রশ্ন অনুযায়ী - উপরের নিয়মটি মুছতে:

# iptables -t nat --line-numbers -n -L

এটি এমন কিছু আউটপুট দেবে:

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 redir ports 8088
2    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8080

আপনি যে নিয়মটিতে আগ্রহী তা হ'ল এনআর। 2, তাই এটি মুছতে:

# iptables -t nat -D PREROUTING 2

13
@ সানি: upvotes পশ্চিমে দ্রুততম বন্দুক জন্য নয়, সেরা প্রতিক্রিয়া জন্য। ইতিমধ্যে আপনার সেরা (আমি কেবল iptables উল্লেখ করেছি; আপনি আসলে সম্পূর্ণ কমান্ড লাইন সরবরাহ করেছেন)। আমার কাছে কেবল যে জিনিসটি নেই তা হ'ল অন্যান্য ব্যবহারকারীরাও 8080 বন্দরটি বাঁধতে সক্ষম হবেন
সিজারবি

3
মনে রাখবেন এটি আইপিভি 6 এর সাথে কাজ করে না।
এমমানুয়েল বার্গ

3
আমি চাইলে কীভাবে এই বিধিটি পরে মুছে ফেলতে পারি তা কি কেউ ব্যাখ্যা করতে পারেন? এটি চালানোর পরে, এটি কাজ করে, তবে এটি দৃশ্যত কোনও "বিধি" নয় কারণ এটি করার সময় এটি প্রদর্শিত হয় না sudo iptables --list। আমি জানি যে iptables কি এবং কী, তবে আমি এর আগে কখনও এটি ব্যবহার করে নি।
এনকোডারার

4
আপনার উত্তরের জন্য ধন্যবাদ ... আমি যখনই উবুন্টুকে রিবুট করি তখন এই নিয়মটি অদৃশ্য হয়ে যায় এবং আমাকে আবার এটি চালাতে হয়। চিরকালের জন্য এটি সংরক্ষণ করার কোনও উপায় আছে?
কোডারজি

4
@ কোডারজি: সম্প্রদায়ে ডকুমেন্টেশনের "সংরক্ষণ করুন" বিভাগটি দেখুন: help.ubuntu.com/commune/IptablesHowTo
সানি

79

অ্যাথবাইন্ড ব্যবহার করুন ।

এমনকি আপনি জাভার আইপিভি 4-কেবল স্ট্যাক সক্ষম করলে এটি জাভাতেও কাজ করে। আমি ব্যবহার করি:

authbind --deep $JAVA_HOME/bin/java -Djava.net.preferIPv4Stack=true …

4
সার্ভারটি যদি টমক্যাট হয় তবে আপনি AUTHBIND=yes/ ইত্যাদি / ডিফল্ট / টোমক্যাট
এমমানুয়েল

আমি এটি ডিফল্ট জাভা প্যাকেজ সহ উবুন্টু সার্ভারে কাজ করতে পারি না ...
অ্যাশলে

আমি না, কোন পরিচিত সমাধান?
চিহ্নিত করুন

10
মনে রাখবেন যে authbindএটি ঘটতে দেওয়ার জন্য আপনাকে অবশ্যই কনফিগার করতে হবে । ম্যান পৃষ্ঠা থেকে: "/ etc / authbind / বাইপোর্ট / পোর্টটি পরীক্ষা করা হয় access উদাহরণস্বরূপ, পোর্ট 80 এর জন্য sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/80। প্রাথমিক ইনস্টলটিতে authbindসাধারণত কোনও পূর্ব-কনফিগার করা অনুমোদন থাকে না।
জেসন সি

4
ওহ নননোনোনোনো, কখনও কখনও mod 777 কিছু chmod করবেন না!
জোহানেস

57

যদি আপনার সিস্টেম এটি সমর্থন করে তবে আপনি সম্ভবত ক্ষমতা ব্যবহার করতে পারেন। মানুষের দক্ষতাগুলি দেখুন, আপনার যা প্রয়োজন তা হ'ল CAP_NET_BIND_SERVICE।

আরও নতুন ডেবিয়ান / উবুন্টুতে আপনি চালাতে পারেন:

sudo apt-get install libcap2-bin 
sudo setcap 'cap_net_bind_service=+ep' /path/to/program

এটি নোডেজের জন্য কাজ করে: সেটক্যাপ 'ক্যাপ_নেট_বাইন্ড_সার্ভিস = + এপি' / ইউএসআর / বিন / নোডেজ
জেসনস

5
এই. আমি উত্তর দিচ্ছি কেন এই উত্তরটির আরও উত্সাহ নেই। আইপটিবল অপশন ইমোয়ের চেয়ে অনেক বেশি সহজ।
ডোমিনিক আর

5
এটি সঠিক এবং সর্বাধিক দক্ষ উত্তর, অন্য সমস্ত উত্তরগুলির কারণে পারফরম্যান্স হিট বা কেবল iffy / असुरक्षित হয়।
OneOfOne

41

আরেকটি সমাধান হ'ল আপনার অ্যাপটিকে সেটআপ করা যাতে এটি 80 বন্দরটি বাঁধতে পারে root রুট হিসাবে, নিম্নলিখিতটি করুন

chown root ./myapp
chmod +S ./myapp

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

আপডেট: এই প্রশ্নে যেমন দেখা গেছে, দেখা যাচ্ছে যে লিনাক্স কার্নেলগুলির ২.6.২৪ থেকে নতুন ক্ষমতা রয়েছে যা আপনাকে এক্সিকিউটেবল (অবশ্যই স্ক্রিপ্ট নয়) হিসাবে চিহ্নিত করার ক্ষমতা দেয় " CAP_NET_BIND_SERVICE"। আপনি যদি ডিবিয়ান প্যাকেজ "libcap2-bin" ইনস্টল করেন, আপনি কমান্ড জারি করে এটি করতে পারেন

setcap 'cap_net_bind_service=+ep' /path/to/program

6
এটি রুট হিসাবে চলমান একই, যদি না অ্যাপ্লিকেশন কীভাবে প্রাইভেলিজগুলি বাদ দিতে পারে।
সিজারবি

14
এটা বিপজ্জনক. এর অর্থ হ'ল যে কোনও অনুরোধ রুট হিসাবে চলবে। এটি এমন এক কারণে যা এমনকি অ্যাপাচি বাঁধার জন্য মূল হিসাবে শুরু হয় এবং তারপরে অন্য ব্যবহারকারীর কাছে সুবিধাগুলি ফেলে দেয়।
সানি

9
পল: iptables এত বিপজ্জনক নয়, কারণ অ্যাপটি আপোস করা হলেও, এটি আক্রমণে সিস্টেমকে কমপক্ষে প্রকাশ করবে না, অন্তত রুট সুবিধাগুলি দিয়ে নয়। অ্যাপটিকে মূল হিসাবে চালানো অন্য গল্প।
সানি

1
ইপিটবেবলগুলির জন্য বিপদ কেবল তখনই যদি এটি একটি বহু-ব্যবহারকারী সিস্টেম হয়, যেমন সিজারবি বলেছে যে কেউ যেহেতু ৮০৮০ বেঁধে রাখতে পারে এবং ট্র্যাফিককে আটকাতে পারে।
সানি

1
হ্যাঁ, কীভাবে গৃহীত উত্তরের উত্তর রয়েছে -15
ইভান তেরান

40

আমি কেবল সামনে Nginx ব্যবহার। এটি লোকালহোস্টেও চালাতে পারে।

  • apt-get install nginx

.. বা ..

  • pkg_add -r nginx

.. বা যা কখনও আপনার ওএসে স্যুট করে।

Nginx.conf- এ আপনার যা দরকার তা হ'ল লোকালহোস্টে চলমান, হ'ল:

সার্ভার
        80 শুনুন;
        server_name some.domain.org;
        অবস্থান /
            প্রক্সি_সেট_হেডার হোস্ট $ হোস্ট;
            প্রক্সি_সেট_হেডার এক্স-রিয়েল-আইপি $ রিমোট_এডিডিআর;
            প্রক্সি_সেট_হেডার এক্স-ফরওয়ার্ড-ফর $ প্রক্সি_অ্যাড_এক্স_ফরওয়ার্ড_এর জন্য;
            প্রক্সি_পাস http://127.0.0.1:8081;
        }
}

আমি এই সমাধানটি সত্যিই পছন্দ করি।
thomasfedb

1
এই (এক) JFrog নিজেদের থেকে প্রস্তাবিত সমাধান jfrog.com/confluence/display/RTF/nginx
stolsvik

36

সানি এবং সিজারবি দ্বারা প্রস্তাবিত পদ্ধতির:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

সূক্ষ্মভাবে কাজ করে তবে এতে একটি ছোট্ট অসুবিধা রয়েছে - এটি ব্যবহারকারীকে 80 এর পরিবর্তে 8080 বন্দরটিতে সরাসরি সংযোগ করতে বাধা দেয় না।

নিম্নলিখিত পরিস্থিতি বিবেচনা করুন যখন এটি কোনও সমস্যা হতে পারে।

ধরা যাক আমাদের এমন একটি সার্ভার রয়েছে যা ৮০৮০ বন্দরে HTTP সংযোগ এবং 8181 বন্দরে HTTPS সংযোগ গ্রহণ করে।

নিম্নোক্ত পুনর্নির্দেশগুলি প্রতিষ্ঠার জন্য আমরা আইপটিবলগুলি ব্যবহার করি:

80  ---> 8080
443 ---> 8181

এখন, ধরা যাক আমাদের সার্ভার কোনও HTTP পৃষ্ঠা থেকে এইচটিটিপিএস পৃষ্ঠায় ব্যবহারকারীকে পুনঃনির্দেশ করার সিদ্ধান্ত নিয়েছে। আমরা যদি সাবধানতার সাথে প্রতিক্রিয়াটি আবারও না লিখি তবে তা পুনঃনির্দেশিত হবে https://host:8181/। এই মুহুর্তে, আমরা খারাপ হই:

  • কিছু ব্যবহারকারী https://host:8181/ইউআরএল বুকমার্ক করবে এবং তাদের বুকমার্কগুলি এড়াতে এড়াতে আমাদের এই URL টি বজায় রাখা দরকার।
  • অন্যান্য ব্যবহারকারী সংযোগ করতে সক্ষম হবেন না কারণ তাদের প্রক্সি সার্ভারগুলি অ-মানক এসএসএল পোর্টগুলিকে সমর্থন করে না।

আমি নিম্নলিখিত পদ্ধতির ব্যবহার:

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8181
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -m mark --mark 1 -j ACCEPT
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8181 -m mark --mark 1 -j ACCEPT

ইনপুট চেইনে ডিফল্ট REJECT নিয়মের সাথে একত্রিত হয়ে এই পদ্ধতি ব্যবহারকারীদের সরাসরি বন্দরগুলিতে 8080, 8181 এর সাথে সংযোগ স্থাপন থেকে বিরত রাখে


1
এটি ভাল, তবে কেন লোকালহোস্টের কাছে কেবল ডেমনকে বেঁধে রাখবেন না: 0.0.0.0:8080 এর পরিবর্তে 8080? আমি এটি করতে চাই, তবে তার জন্য আমার iptables দরকার।
আমালা

এটা সত্যিই দুর্দান্ত।
xtian

29

Ixতিহ্যগতভাবে ইউনিক্সে, কেবলমাত্র মূল কম বন্দরগুলিতে আবদ্ধ হতে পারে (<1024)।

এর চারপাশে কাজ করার সহজতম উপায় হ'ল আপনার সার্ভারটি একটি উচ্চ বন্দরটিতে (উদাহরণস্বরূপ, 8080) চালানো এবং 80 from বন্দর থেকে 8080 বন্দরগুলিতে সংযোগগুলি ফরোয়ার্ড করার জন্য একটি সাধারণ iptables নিয়ম ব্যবহার করুন Note নোট করুন যে এর সাথে আপনি অতিরিক্ত সুরক্ষা হারাতে পারেন নিম্ন বন্দর; আপনার মেশিনের যে কোনও ব্যবহারকারীর 8080 পোর্টে বাঁধতে পারে।


23

যদি আপনার সিস্টেম এটি সমর্থন করে তবে আপনি সম্ভবত ক্ষমতা ব্যবহার করতে পারেন। দেখুন man capabilities, আপনার যা প্রয়োজন তা হ'ল CAP_NET_BIND_SERVICE। না, আমি সেগুলি নিজেই ব্যবহার করি নি এবং তারা সত্যই কাজ করে কিনা আমি জানি না :-)


1
তারা কাজ করে, আমি সাধারণ ব্যবহারকারী হিসাবে টিসিপিডাম্পের মতো সরঞ্জাম চালাতে CAP_NET_RAW ব্যবহার করি।
জাস্টিন

12

আপনার অ্যাপ্লিকেশন সার্ভারের সামনে একটি বিপরীত প্রক্সি (এনগিনেক্স, অ্যাপাচি + মোড_প্রক্সি) বা একটি ক্যাচিং রিভার্স প্রক্সি (স্কুইড, বার্নিশ) ব্যবহার করুন!

বিপরীত প্রক্সি দিয়ে আপনি অনেক আকর্ষণীয় জিনিস যেমন অর্জন করতে পারেন:

  • লোড-ব্যালেন্সিং
  • অভিনব ত্রুটি পৃষ্ঠা প্রাপ্ত ব্যবহারকারীদের সাথে আপনার অ্যাপ্লিকেশন সার্ভারগুলি পুনরায় চালু করা হচ্ছে
  • ক্যাশে দিয়ে জিনিসগুলি গতি বাড়ান
  • সূক্ষ্ম দানযুক্ত সেটিংস যা আপনি সাধারণত কোনও বিপরীত প্রক্সি দিয়ে করেন এবং কোনও অ্যাপ্লিকেশন সার্ভারের সাথে নয়

6

আপনি redir প্রোগ্রাম ব্যবহার করতে পারেন:

sudo redir --lport=80 --laddr=192.168.0.101 --cport 9990 --caddr=127.0.0.1

4

Sudo ব্যবহার করুন।

সুডো কনফিগার করুন যাতে নিয়মিত ব্যবহারকারী উপযুক্ত কমান্ডগুলি চালাতে পারেন:

/etc/init.d/httpd start

অথবা

apachectl stop

অথবা

/usr/local/apache2/apachectl restart

অথবা

/myapp/myappbin start

(অথবা আপনাকে নির্দিষ্ট ওয়েবসার্ভার / অ্যাপ্লিকেশন শুরু / বন্ধ করতে আপনি যে কোনও কমান্ড / স্ক্রিপ্ট ব্যবহার করেন)


8
এর একই সমস্যা রয়েছে - রুট হিসাবে পরিষেবা চালানো একটি খারাপ অভ্যাস।
কেভিন পানকো

4

রৌদ্রের উত্তর সঠিক, তবে লুপব্যাক ইন্টারফেসটি PREROUTING টেবিলটি ব্যবহার না করায় আপনি অতিরিক্ত সমস্যার মুখোমুখি হতে পারেন,

সুতরাং যোগ করার জন্য iptables নিয়ম দুটি:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

3

লিনাক্স সহ আপনার আরও দুটি বিকল্প রয়েছে:

লিনাক্স কার্নেলের উভয় বর্ধনই খুব সূক্ষ্ম দানাদার স্তরে অ্যাক্সেসের অধিকার মঞ্জুরি দেয়। এটি আপনাকে এই প্রক্রিয়াটি 80 পোর্ট খোলার মঞ্জুরি দেয় তবে এটি অন্য কোনও মূল অধিকারের অধিকারী হবে না।

আমি যা শুনেছি তার থেকে, গ্র্যাসিকিউরিটি ব্যবহার করা আরও সহজ তবে সেলইনাক্স আরও সুরক্ষিত।


2

একটি সমাধান হ'ল পোর্ট ৮০ এর প্যাকেটে পিএটি সম্পাদনের জন্য আইপটিবলগুলি ব্যবহার করা। আপনি প্যাকেটগুলি স্থানীয় পোর্ট ৮০৮০ তে রুট করার জন্য এটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ। নিশ্চিত হন এবং বহির্গামী প্যাকেটগুলি 80 পোর্টে সামঞ্জস্য করুন।

আমার অভিজ্ঞতায় লিনাক্সের সূক্ষ্ম অনুমতিযুক্ত বৈশিষ্ট্যগুলি সুরক্ষা সমস্যার কারণে মানক কার্নেলগুলিতে সংকলিত হয়নি।


2

আপনি যদি এটি করার চেষ্টা করছেন যাতে কোনও ব্যবহারকারী-চালিত কমান্ড পোর্ট 80 ব্যবহার করতে পারে, তবে আপনার একমাত্র সমাধানগুলি হ'ল আইপটিবল ট্রিকস বা এক্সিকিউটেবল সেটুইড-টু-রুট সেট করা।

অ্যাপাচি-র মতো কোনও কিছু এটি করে (এটি ৮০ বন্দরকে আবদ্ধ করে, তবে এটি রুট ব্যতীত অন্য কেউ হিসাবে চলছে) হ'ল রুট হিসাবে চালানো, বন্দরের সাথে আবদ্ধ হওয়া, তারপরে বন্দরের পরে অন-অধিকারযুক্ত ব্যবহারকারীর প্রক্রিয়াটির মালিকানা পরিবর্তন করা সেট আপ করা হয়। আপনি যে অ্যাপটিটি লিখছেন সেটি যদি রুট দিয়ে চালানো যায় তবে পোর্টস সেট আপ হওয়ার পরে আপনি এটিকে মালিকানা বেসরকারী ব্যবহারকারীর কাছে পরিবর্তন করতে পারেন। তবে যদি এটি কেবলমাত্র কোনও গড় ব্যবহারকারীর কমান্ড লাইন থেকে চালিত হয় তবে আপনাকে অন্য সমাধানগুলির মধ্যে একটি ব্যবহার করতে হবে।


2

যখন আমার কাছে বিভিন্ন ওয়েব পরিবেশন অ্যাপ্লিকেশন থাকে (পাইথন স্ক্রিপ্টস, টমক্যাট ইঞ্জিন, ...) যে আমি রুট হিসাবে চালাতে চাই না আমি সাধারণত তাদের সামনে একটি অ্যাপাচি ওয়েব সার্ভার কনফিগার করি। অ্যাপাচি 80 পোর্ট শোনায়, এবং টমক্যাট 8080 শুনবে।

অ্যাপাচি: এস কনফিগারেশনে:

ProxyPass /webapp http://localhost:8080/webapp
ProxyPassReverse /webapp http://localhost:8080/webapp

আরও তথ্যের জন্য মোড-প্রক্সি ডকুমেন্টেশন দেখুন: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html


1
এই সমাধানটির অপূর্ণতা হ'ল টমক্যাট লগগুলিতে আগত আইপি-র ক্ষতি।
এমমানুয়েল বার্গ

2

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


1

কিছু হোস্ট সিস্টেমগুলি NAT মডিউলটি ব্যবহার করার অনুমতি দিচ্ছে না, 'iptables' এই ক্ষেত্রে সমস্যার সমাধান করে না।

কীভাবে জিনেটেড?

আমার ক্ষেত্রে (উবুন্টু 10.04)

# apt-get install xinetd
# touch /etc/xinetd.d/my_redirect
# vim /etc/xinetd.d/my_redirect

কনফিগারেশনটি আটকে দিন:

service my_redirector_80
{
 disable = no
 socket_type = stream
 protocol = tcp
 user = root
 wait = no
 port = 80
 redirect = localhost 8080
 type = UNLISTED
}

তারপর:

# service xinetd restart

http://docs.codehaus.org/display/JETTY/port80 আরও ভাল ব্যাখ্যা করে।


1
এটি মূলত সার্ভারের সামনে একটি বিপরীত প্রক্সি স্থাপনের সমতুল্য, তবে এটি HAproxy, পাউন্ড বা বার্নিশের মতো উত্সর্গীকৃত সমাধানগুলির তুলনায় অকার্যকর যা এইচটিটিপি প্রোটোকল বোঝে এবং এক্স-ফরওয়ার্ড-ফর পছন্দ মতো দরকারী শিরোনাম যুক্ত করতে পারে।
এমমানুয়েল বার্গ

-1

একটি সরাইয়া হিসাবে, FreeBSD 'র এবং সোলারিস (যে কেউ মনে রাখবেন যে এক?) আপনি এই বিশেষাধিকার উদ্দীপন ছাড়া (কম পোর্টে বেঁধে) (অর্থাত, প্রোগ্রাম ব্যবহার রুট পাল্টাতে) করতে। যেহেতু আপনি লিনাক্স নির্দিষ্ট করেছেন, আমি অন্যকে এই বিজ্ঞপ্তি হিসাবে পোস্ট করছি যা এই প্রশ্নটি খুঁজে পেতে পারে।


-1

Necromancing।

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

sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/lib/jvm/java-8-openjdk/jre/bin/java

স্পষ্টতই, এর অর্থ কোনও জাভা প্রোগ্রাম সিস্টেম বন্দরগুলিকে আবদ্ধ করতে পারে।
মনো / .NET এর জন্য ডিটো।

আমি আরও নিশ্চিত যে xinetd ধারণা সেরা নয়।
তবে যেহেতু উভয় পদ্ধতিই হ্যাক, কেবলমাত্র সীমাবদ্ধতা তুলে নিয়ে সীমাটি তোলেন না কেন?
কেউ বলেনি আপনাকে একটি সাধারণ কার্নেল চালাতে হবে, সুতরাং আপনি কেবল নিজের চালাতে পারবেন।

আপনি সর্বাধিক সর্বশেষ কার্নেলের জন্য উত্সটি ডাউনলোড করুন (বা আপনার কাছে বর্তমানে রয়েছে)। এরপরে, আপনি এখানে যান:

/usr/src/linux-<version_number>/include/net/sock.h:

আপনি এই লাইন জন্য সন্ধান করুন

/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK       1024

এবং এটিকে পরিবর্তন করুন

#define PROT_SOCK 0

যদি আপনি কোনও সুরক্ষিত ssh পরিস্থিতি না পেতে চান তবে আপনি এটিতে এটি পরিবর্তন করুন: # নির্দিষ্ট করুন PROT_SOCK 24

সাধারণত, আমি আপনার প্রয়োজন সবচেয়ে কম সেটিংটি ব্যবহার করতাম, যেমন HTTP- র জন্য 79, বা 25 পোর্টে এসএমটিপি ব্যবহার করার সময় 24।

ইতিমধ্যে সব।
কার্নেলটি কম্পাইল করে ইনস্টল করুন।
পুনরায় বুট করুন।
সমাপ্ত - যে নির্বোধ সীমা GONE, এবং এটি স্ক্রিপ্টগুলির জন্যও কাজ করে।

আপনি কীভাবে কার্নেলটি সংকলন করছেন তা এখানে:

https://help.ubuntu.com/community/Kernel/Compile

# You can get the kernel-source via package linux-source, no manual download required
apt-get install linux-source fakeroot

mkdir ~/src
cd ~/src
tar xjvf /usr/src/linux-source-<version>.tar.bz2
cd linux-source-<version>

# Apply the changes to PROT_SOCK define in /include/net/sock.h

# Copy the kernel config file you are currently using
cp -vi /boot/config-`uname -r` .config

# Install ncurses libary, if you want to run menuconfig
apt-get install libncurses5 libncurses5-dev

# Run menuconfig (optional)
make menuconfig

# Define the number of threads you wanna use when compiling (should be <number CPU cores> - 1), e.g. for quad-core
export CONCURRENCY_LEVEL=3
# Now compile the custom kernel
fakeroot make-kpkg --initrd --append-to-version=custom kernel-image kernel-headers

# And wait a long long time

cd ..

সংক্ষেপে, আপনি সুরক্ষিত থাকতে চাইলে iptables ব্যবহার করুন, আপনি যদি নিশ্চিত হন যে এই বিধিনিষেধ আপনাকে আর বিরক্ত করবে না তখন কার্নেলটি সঙ্কলন করুন।


অনুগ্রহ করে কেউ কি দয়া করে নিম্নোক্তদের ব্যাখ্যা করবেন? কার্নেল-সংকলন কাজ করছে না? বা এটি কেবল কারণ, আপনি আর সাধারণ সংগ্রহস্থলগুলি থেকে কার্নেল-আপগ্রেড করতে পারবেন না?
চৌম্বকীয়

আমি এই সমাধানটি চেষ্টা করেছিলাম ( sudo setcap cap_net_bind_service=+ep /path-to-java/java) তবে java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directoryজাভাতে ক্যাপস সেট থাকলে আমি সর্বদা পাই । এছাড়াও unix.stackexchange.com/a/16670/55508
ড্যানিয়েল অ্যাল্ডার

1
পূর্ববর্তী ত্রুটিটি যুক্ত <javahome>/lib/amd64/jli/করে ld.so.confচালিয়ে সমাধান করাsudo ldconfig
ড্যানিয়েল অ্যাল্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.