लिनक्स पर एक सामान्य उपयोगकर्ता के रूप में पोर्ट 80 पर एक सर्वर कैसे चलाएं?


310

मैं कुछ समय के लिए एक समाधान के बारे में गुगली कर चुका हूं, लेकिन कोई जवाब नहीं मिला।

मैं उबंटू लिनक्स पर हूं और पोर्ट 80 पर एक सर्वर चलाना चाहता हूं, लेकिन उबंटू के सुरक्षा तंत्र के कारण, मुझे निम्न त्रुटि मिलती है:

java.net.BindException: अनुमति अस्वीकृत: 80

मुझे लगता है कि इस सुरक्षा तंत्र को निष्क्रिय करने के लिए यह पर्याप्त सरल होना चाहिए ताकि पोर्ट 80 सभी उपयोगकर्ताओं के लिए उपलब्ध हो या पोर्ट 80 तक पहुंचने के लिए वर्तमान उपयोगकर्ता को आवश्यक विशेषाधिकार प्रदान कर सके।


3
सर्वर को किसी अन्य पोर्ट पर चलाने के लिए समस्या क्या है जो अनपेक्षित है? आप उस पोर्ट पर सर्वर चलाने के लिए कम से कम बहुत गंभीर कारण प्रदान किए बिना सुरक्षा तंत्र को अक्षम करने के लिए कठोर के रूप में कुछ के बारे में सोच रहे हैं। क्या सर्वर को पोर्ट 80 पर बाँधने के लिए हार्डकोड किया गया है? यदि हां, तो इसे फेंक दें।
बेनामी


4
आप नहीं कर सकते। 1024 से नीचे के हिस्से विशेषाधिकार प्राप्त हैं और केवल रूट ही उन पर श्रवण कुर्सियां ​​खोल सकते हैं। उपयुक्त बात यह है कि इसे खोलने के बाद अनुमतियाँ छोड़ दें।
फाल्कन मोमोट

2
"अनाम" - दुनिया में उपयोगकर्ताओं को कुछ बंदरगाहों पर कुछ सेवाओं को देखने के लिए प्रशिक्षित किया गया है। कुछ उदाहरणों में, इसका मानकीकरण किया गया। उदाहरण के लिए, पोर्ट 80 पर एचटीटीपी और पोर्ट 443 पर एचटीटीपीएस। दुनिया के उपयोगकर्ताओं और मानकों को बदलने के लिए अपनी तरह का कठिन है।

1
@FalconMomot यदि 1024 से नीचे के पोर्ट विशेषाधिकार प्राप्त हैं, तो अपाचे सर्वर को पोर्ट 80 पर रूट विशेषाधिकार प्राप्त करने के लिए पासवर्ड दर्ज करने की आवश्यकता क्यों नहीं है, और वे इसे इस तरह से कैसे करते हैं? मुझे लगता है कि प्रश्नकर्ता यह जानना चाहता है कि इस तरह से चीजों को कैसे करना है (चाहे वह तकनीकी रूप से रूट के रूप में उपयोग किया जा रहा है या नहीं)। बेझिझक मुझे बताएं कि क्या मैं गलत हूं, दीपक मित्तल।
शुल

जवाबों:


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

जिस नियम में आप रुचि रखते हैं वह nr है। 2, इसलिए इसे हटाने के लिए:

# iptables -t nat -D PREROUTING 2

13
@ सुन्नी: अपवोट्स पश्चिम में सबसे तेज़ बंदूक के लिए नहीं, बल्कि बेहतरीन प्रतिक्रियाओं के लिए हैं। तुम्हारा अब तक का सबसे अच्छा है (मैंने केवल iptables का उल्लेख किया है; आपने वास्तव में पूरी कमांड लाइन प्रदान की है)। केवल एक चीज जो मेरे पास है वह यह नहीं है कि अन्य उपयोगकर्ताओं के बारे में चेतावनी भी 8080 को पोर्ट करने में सक्षम है।
सीजरबी

3
ध्यान दें कि यह IPv6 के साथ काम नहीं करता है।
इमैनुएल बॉर्ग

3
क्या कोई समझा सकता है कि जब मैं चाहूं तो बाद में इस नियम को कैसे हटा सकता हूं? इसे चलाने के बाद, यह काम करता है, लेकिन यह स्पष्ट रूप से एक "नियम" नहीं है क्योंकि जब मैं करता हूं तो यह दिखाई नहीं देता है sudo iptables --list। मुझे पता है कि iptables क्या है और क्या करता है, लेकिन मैंने इससे पहले कभी भी इसका इस्तेमाल नहीं किया है।
एनकोडर

4
आपके उत्तर के लिए धन्यवाद ... जब भी मैं उबंटू को रिबूट करता हूं, यह नियम गायब हो जाता है और मुझे इसे फिर से चलाना पड़ता है। क्या इसे हमेशा के लिए बचाने का कोई तरीका है?
कोडरजी

4
@ कोडरजी: सामुदायिक प्रलेखन में "सेव" सेक्शन की जाँच करें: help.ubuntu.com/community/IptablesHowTo
Sunny

79

ऑर्किड का उपयोग करें ।

यदि आप जावा के IPv4-केवल स्टैक को सक्षम करते हैं तो भी यह जावा के साथ काम करता है। मैं उपयोग करता हूं:

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

4
यदि सर्वर टॉमकैट है, तो आप स्वचालित रूप से AUTHBIND=yes/ etc / default / tomcat6 में सेटिंग द्वारा ऑर्बंडाइंड का उपयोग कर सकते हैं
Emmanuel Bourg

मैं डिफ़ॉल्ट जावा पैकेज के साथ उबंटू सर्वर पर काम करने के लिए इसे प्राप्त नहीं कर सका ...
एशले

मुझे न तो कोई ज्ञात समाधान?
मार्क

10
ध्यान दें कि आपको authbindवास्तव में ऐसा करने की अनुमति देने के लिए कॉन्फ़िगर करना होगा। मैन पेज से: "/ etc / ऑर्बिटबाइंड / बायपोर्ट / पोर्ट का परीक्षण किया जाता है। यदि यह फ़ाइल कॉलिंग उपयोगकर्ता के लिए एक्सेस के लिए सुलभ है, तो एक्सेस (2) के अनुसार, फिर पोर्ट से बाइंडिंग अधिकृत है।" , पोर्ट 80 के लिए sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/80,। authbindआम तौर पर प्रारंभिक इंस्टाल्ड में कोई पूर्व-कॉन्फ़िगर प्राधिकरण नहीं होता है।
जेसन सी

4
ओह नॉनोनोनोनोनो, कभी भी 777 को कुछ भी नहीं बताएं!
जोहान्स

57

यदि आपका सिस्टम इसका समर्थन करता है तो आप क्षमताओं का उपयोग कर सकते हैं। मनुष्य की क्षमताओं को देखें, जिसकी आपको आवश्यकता है वह CAP_NET_BIND_SERVICE होगी।

नए डेबियन / उबंटू पर आप चला सकते हैं:

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

यह नोडज के लिए काम करता है: सेट 'cap_net_bind_service = + ep' / usr / bin / नोडज
जेसन

5
इस। मुझे आश्चर्य है कि यह उत्तर अधिक उत्थान क्यों नहीं करता है। Iptables विकल्प imho की तुलना में बहुत आसान है।
डोमिनिक आर

5
यह सही और सबसे कुशल उत्तर है, अन्य सभी उत्तर प्रदर्शन हिट या सिर्फ iffy / असुरक्षित का कारण बनते हैं।
वनऑफने

41

एक अन्य उपाय यह है कि आप अपने ऐप को सेतु बना लें ताकि यह पोर्ट 80 के साथ बाँध सके। जड़ के रूप में, निम्न कार्य करें

chown root ./myapp
chmod +S ./myapp

ध्यान रखें कि ऐसा करना, जब तक कि यह पूरी तरह से सही न हो जाए, आपको संभावित सुरक्षा छेदों के लिए उजागर कर देगा, क्योंकि आपका ऐप नेटवर्क से बात कर रहा होगा, और पूरे रूट निजीकृत के साथ चल रहा होगा। यदि आप इस समाधान को लेते हैं, तो आपको अपाचे या लाइटटैप या कुछ इसी तरह के स्रोत कोड को देखना चाहिए, जहां वे पोर्ट को खोलने के लिए रूट विशेषाधिकारों का उपयोग करते हैं, लेकिन फिर तुरंत उन निजी और "एक कम विशेषाधिकार प्राप्त उपयोगकर्ता" बन जाते हैं ताकि अपहर्ता आपके पूरे कंप्यूटर पर कब्जा नहीं कर सकता।

अद्यतन: जैसा कि इस प्रश्न में देखा गया है , यह प्रतीत होता है कि 2.6.24 के बाद से लिनक्स कर्नेल में एक नई क्षमता है जो आपको एक निष्पादन योग्य (लेकिन स्क्रिप्ट नहीं, निश्चित रूप से) " CAP_NET_BIND_SERVICE" क्षमता के रूप में चिह्नित करने की अनुमति देती है। यदि आप डेबियन पैकेज "libcap2-bin" स्थापित करते हैं, तो आप कमांड जारी करके ऐसा कर सकते हैं

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

6
यह रूट के रूप में चलने के समान है, जब तक कि ऐप निजीकरण को छोड़ना नहीं जानता।
CesarB

14
यह खतरनाक है। इसका मतलब है कि कोई भी अनुरोध रूट के रूप में चलेगा। यह इस कारण से है कि अपाचे भी बांधने के लिए मूल के रूप में शुरू होता है, और फिर किसी अन्य उपयोगकर्ता के विशेषाधिकार छोड़ देता है।
सनी

9
पॉल: iptables इतना खतरनाक नहीं है, क्योंकि अगर ऐप से छेड़छाड़ की जाती है, तो भी यह हमलों पर सिस्टम को उजागर नहीं करेगा, कम से कम रूट विशेषाधिकारों के साथ नहीं। ऐप को रूट के रूप में चलाना एक और कहानी है।
सनी

1
IPtables के लिए खतरा केवल यह है कि यह एक बहु-उपयोगकर्ता प्रणाली है, जैसा कि CesarB ने कहा, क्योंकि कोई भी 8080 से बाँध सकता है, और यातायात को बाधित कर सकता है।
सनी

1
lol, प्यार कैसे स्वीकार किए गए जवाब का -15 है
इवान टेरान

40

मैं बस सामने Nginx का उपयोग करें। यह लोकलहोस्ट पर भी चल सकता है।

  • apt-get install nginx

.. या ।।

  • pkg_add -r nginx

.. या क्या कभी आपके ओएस के अनुरूप है।

यदि आप लोकलहोस्ट पर चल रहे हैं, तो आपको nginx.conf में इसकी आवश्यकता है:

सर्वर {
        80 सुनो;
        server_name some.domain.org;
        स्थान / {
            xy_set_header होस्ट $ होस्ट;
            प्रॉक्सी_सेट_हेडर एक्स-रियल-आईपी $ रिमोट_ड्रेड;
            प्रॉक्सी_सेट_हाइडर एक्स-फॉरवर्डेड-फॉर $ प्रॉक्सी_एड_एक्स_फोवर्डवर्ड_फोर्स;
            प्रॉक्सी_पास http://127.0.0.1:8081;
        }
}

मुझे वास्तव में यह समाधान पसंद है।
थोमसफेडब

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 से सीधे पोर्ट से कनेक्ट करने से नहीं रोकता है।

निम्नलिखित परिदृश्य पर विचार करें जब यह एक समस्या हो सकती है।

मान लीजिए कि हमारे पास एक सर्वर है जो पोर्ट 8080 पर HTTP कनेक्शन और पोर्ट 8181 पर HTTPS कनेक्शन स्वीकार करता है।

हम निम्नलिखित पुनर्निर्देशन स्थापित करने के लिए iptables का उपयोग करते हैं:

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

अब, मान लीजिए कि हमारा सर्वर HTTP पृष्ठ से HTTPS पृष्ठ पर उपयोगकर्ता को पुनर्निर्देशित करने का निर्णय लेता है। जब तक हम सावधानीपूर्वक प्रतिक्रिया को फिर से नहीं लिखेंगे, यह अनुप्रेषित करेगा https://host:8181/। इस बिंदु पर, हम खराब हैं:

  • कुछ उपयोगकर्ता https://host:8181/URL को बुकमार्क कर देंगे और हमें उनके बुकमार्क तोड़ने से बचने के लिए इस URL को बनाए रखना होगा।
  • अन्य उपयोगकर्ता कनेक्ट नहीं कर पाएंगे क्योंकि उनके प्रॉक्सी सर्वर गैर-मानक SSL पोर्ट का समर्थन नहीं करते हैं।

मैं निम्नलिखित दृष्टिकोण का उपयोग करता हूं:

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

INPUT श्रृंखला पर डिफ़ॉल्ट REJECT नियम के साथ संयुक्त यह दृष्टिकोण उपयोगकर्ताओं को सीधे 8080, 8181 पोर्ट से कनेक्ट करने से रोकता है


1
यह अच्छा है, लेकिन क्यों न सिर्फ डेमॉन को लोकलहोस्ट: 80.0 के बजाय 0.0.0.0:8080 पर बांधा जाए? मैं ऐसा करना चाहता हूं, लेकिन मुझे इसके लिए iptables की जरूरत है।
अमला

यह काम करता है, वास्तव में अच्छा है।
xtian ian

29

परंपरागत रूप से यूनिक्स पर, केवल रूट कम बंदरगाहों (<1024) से जुड़ सकता है।

इसके चारों ओर काम करने का सबसे सरल तरीका यह है कि आप अपने सर्वर को एक उच्च पोर्ट (उदाहरण के लिए, 8080) पर चलाएं और पोर्ट 80 से पोर्ट 8080 तक के कनेक्शनों को आगे बढ़ाने के लिए एक साधारण आईपीटेबल्स नियम का उपयोग करें। ध्यान दें कि इसके साथ आप अतिरिक्त सुरक्षा खो देते हैं। कम बंदरगाहों; आपकी मशीन का कोई भी उपयोगकर्ता 8080 को पोर्ट कर सकता है।


23

यदि आपका सिस्टम इसका समर्थन करता है तो आप क्षमताओं का उपयोग कर सकते हैं। देखिए man capabilities, आपको जो चाहिए होगा CAP_NET_BIND_SERVICE। नहीं, मैंने कभी भी उनका उपयोग स्वयं नहीं किया है और मुझे नहीं पता कि क्या वे वास्तव में काम करते हैं :-)


1
वे काम करते हैं, मैं एक सामान्य उपयोगकर्ता के रूप में tcpdump जैसे उपकरण चलाने के लिए CAP_NET_RAW का उपयोग करता हूं।
जस्टिन

12

अपने एप्लिकेशन सर्वरों के सामने एक रिवर्स प्रॉक्सी (nginx, Apache + mod_proxy) या कैशिंग रिवर्स प्रॉक्सी (स्क्विड, वार्निश) का उपयोग करें!

रिवर्स प्रॉक्सी के साथ आप बहुत सी रोचक चीजें प्राप्त कर सकते हैं जैसे:

  • भार संतुलन
  • फैंसी त्रुटि पृष्ठ प्राप्त करने वाले उपयोगकर्ताओं के साथ अपने एप्लिकेशन सर्वर को पुनरारंभ करना
  • कैश के साथ चीजों को गति दें
  • बारीक-बारीक सेटिंग्स जो आप सामान्य रूप से रिवर्स-प्रॉक्सी के साथ करते हैं न कि एप्लिकेशन सर्वर के साथ

6

आप रीडिर प्रोग्राम का उपयोग कर सकते हैं:

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

4

सुडो का उपयोग करें।

सुडो को कॉन्फ़िगर करें ताकि नियमित उपयोगकर्ता उपयुक्त कमांड चला सके:

/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 खोलने के लिए इस प्रक्रिया को देने की अनुमति देगा लेकिन यह किसी भी अन्य मूल अधिकारों को प्राप्त नहीं करेगा।

मैंने जो सुना है, उसमें से ग्रामसुरक्षा का उपयोग करना अधिक सरल है, लेकिन SELinux अधिक सुरक्षित है।


2

एक उपाय यह है कि iptables का उपयोग पोर्ट 80 के लिए पैकेटों पर PAT करने के लिए करें। आप इसका उपयोग पैकेटों को स्थानीय पोर्ट 8080 पर उदाहरण के लिए कर सकते हैं। सुनिश्चित करें और आउटगोइंग पैकेट को वापस पोर्ट 80 पर समायोजित करें।

मेरे अनुभव में लिनक्स की बारीक-बारीक अनुमतियाँ सुरक्षा मुद्दों के कारण मानक गुठली में संकलित नहीं हैं।


2

यदि आप ऐसा करने की कोशिश कर रहे हैं ताकि एक उपयोगकर्ता द्वारा संचालित कमांड पोर्ट 80 का उपयोग कर सके, तो आपके एकमात्र समाधान iptables ट्रिक्स हैं या निष्पादन योग्य सेट्युइड-टू-रूट सेट कर रहे हैं।

जिस तरह से अपाचे कुछ ऐसा करता है (यह 80 को पोर्ट करता है, लेकिन रूट के अलावा किसी और के रूप में चल रहा है) रूट के रूप में चलना है, पोर्ट से बांधना है, फिर पोर्ट के बाद गैर-विशेषाधिकार प्राप्त उपयोगकर्ता को प्रक्रिया का स्वामित्व बदलना स्थापना की है। यदि आप जो ऐप लिख रहे हैं , उसे रूट द्वारा चलाया जा सकता है , तो पोर्ट के सेट होने के बाद आप इसे गैर-निजी उपयोगकर्ता में बदल सकते हैं। लेकिन अगर यह केवल एक औसत उपयोगकर्ता को कमांड लाइन से चलने के लिए है, तो आपको अन्य समाधानों में से एक का उपयोग करना होगा।


2

जब मेरे पास विभिन्न वेब सर्विंग एप्लिकेशन (अजगर स्क्रिप्ट, टॉमकैट इंजन, ...) है कि मैं रूट के रूप में नहीं चलाना चाहता हूं तो मैं आमतौर पर उनके सामने एक अपाचे वेब सर्वर को कॉन्फ़िगर करता हूं। अपाचे 80 पोर्ट को सुनता है, और टॉमकैट 8080 को सुनता है।

अपाचे में: s विन्यास:

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' इस मामले में समस्या को हल नहीं करता है।

कैसे के बारे में xinetd?

मेरे मामले में (ubuntu 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, पाउंड या वार्निश जैसे समर्पित समाधानों की तुलना में अक्षम है जो HTTP प्रोटोकॉल को समझते हैं और एक्स-फॉरवर्ड-फॉर पसंद करने वाले उपयोगी हेडर जोड़ सकते हैं।
इमैनुएल बॉर्ग

-1

एक तरफ के रूप में, FreeBSD और Solaris (किसी को याद है कि एक?) आप ऐसा करते हैं (कम बंदरगाहों के लिए बाध्य) विशेषाधिकार वृद्धि के बिना (यानी, कार्यक्रमों को रूट पर स्विच करने के लिए)। चूंकि आपने लिनक्स निर्दिष्ट किया है, इसलिए मैं इसे दूसरों को एक नोटिस के रूप में पोस्ट कर रहा हूं जो इस प्रश्न को पा सकता है।


-1

Necromancing।

सरल। एक सामान्य या पुराने कर्नेल के साथ, आप नहीं।
जैसा कि दूसरों द्वारा बताया गया है, iptables एक पोर्ट को अग्रेषित कर सकता है।
जैसा कि दूसरों द्वारा बताया गया है, CAP_NET_BIND_SERVICE भी काम कर सकती है।
बेशक CAP_NET_BIND_SERVICE विफल हो जाएगी यदि आप अपने प्रोग्राम को स्क्रिप्ट से लॉन्च करते हैं, जब तक आप शेल दुभाषिया पर टोपी सेट नहीं करते हैं, जो कि व्यर्थ है, आप बस अपनी सेवा को रूट के रूप में चला सकते हैं ...
जैसे जावा के लिए, आपको इसे लागू करना होगा। JAVA JVM को

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 स्थिति नहीं चाहते हैं, तो आप इसे इस पर बदल दें: #define PROT_S100 24

आमतौर पर, मैं सबसे कम सेटिंग का उपयोग करता हूं, जिसकी आपको आवश्यकता है, जैसे http के लिए 79, या 24 जब एसएमटीपी का उपयोग पोर्ट 25 पर किया जाता है।

यह सब पहले से ही है।
कर्नेल संकलित करें, और इसे स्थापित करें।
रीबूट।
समाप्त - वह मूर्खतापूर्ण सीमा है, और यह स्क्रिप्ट के लिए भी काम करता है।

यहां बताया गया है कि आप कर्नेल कैसे संकलित करते हैं:

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 का उपयोग करें यदि आप सुरक्षित रहना चाहते हैं, तो कर्नेल को संकलित करें यदि आप सुनिश्चित करना चाहते हैं कि यह प्रतिबंध आपको फिर से परेशान नहीं करता है।


किसी को कृपया नीचे की व्याख्या करेंगे? कर्नेल-संकलन काम नहीं कर रहा है? या यह सिर्फ इसलिए है क्योंकि बाद में, आप अब सामान्य रिपॉजिटरी से कर्नेल-अपग्रेड नहीं कर सकते हैं?
Quandary

मैंने इस समाधान की कोशिश की ( 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
डैनियल एल्डर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.