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


मैंने इसके बारे में काफी समय से गुमराह किया है, लेकिन इसे नहीं मिला।

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

java.net.indException: अनुमति अस्वीकार: 80

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


281
2017-11-10 14:31


मूल


सर्वर को किसी अन्य पोर्ट पर चलाने की समस्या क्या है जो अप्रतिबंधित है? आप उस बंदरगाह पर सर्वर चलाने के लिए कम से कम एक गंभीर कारण प्रदान किए बिना सुरक्षा तंत्र को अक्षम करने के रूप में कठोर के बारे में कुछ सोच रहे हैं। क्या सर्वर पोर्ट 80 से बांधने के लिए हार्डकोड किया गया है? यदि ऐसा है, तो इसे फेंक दो। - Anonymous
या एक पायथन त्रुटि संदेश: socket.error: [Errno 13] Permission denied - Kazark
के संभावित डुप्लिकेट 1024 से नीचे बंदरगाहों का उपयोग कर नियमित उपयोगकर्ता - Roman
आप नहीं कर सकते 1024 से नीचे के बंदरगाहों को विशेषाधिकार प्राप्त किया जाता है और केवल रूट ही उन पर सुनने वाले सॉकेट खोल सकता है। करने के लिए उचित बात यह है कि इसे खोलने के बाद अनुमतियां छोड़ दें। - Falcon Momot
"बेनामी" - दुनिया के उपयोगकर्ताओं को कुछ बंदरगाहों पर कुछ सेवाओं की तलाश करने के लिए प्रशिक्षित किया गया है। कुछ मामलों में, इसे मानकीकृत किया गया है। उदाहरण के लिए, पोर्ट 443 पर पोर्ट 80 और HTTPS पर HTTP। उपयोगकर्ताओं के उपयोगकर्ताओं और मानकों को बदलने के लिए यह कठिन है। - jww


जवाब:


संक्षिप्त उत्तर: आप नहीं कर सकते। 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 (या किसी अन्य उच्च बंदरगाह का उपयोग करने का निर्णय लेता है) खोल सकता है, इस प्रकार यातायात को रोकता है। (आभार से CesarB)।

संपादित करें: टिप्पणी प्रश्न के अनुसार - उपरोक्त नियम को हटाने के लिए:

# 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

330
2017-11-10 14:41



@ सनी: अपवॉट्स पश्चिम में सबसे तेज बंदूक के लिए नहीं हैं, बल्कि सर्वोत्तम प्रतिक्रियाओं के लिए हैं। आपका अब तक का सबसे अच्छा है (मैंने केवल iptables का उल्लेख किया है; आप वास्तव में पूर्ण कमांड लाइन प्रदान करते हैं)। मेरे पास केवल एक चीज है जो अन्य उपयोगकर्ताओं के बारे में चेतावनी नहीं है जो पोर्ट 8080 से जुड़ने में भी सक्षम है। - CesarB
ध्यान दें कि यह आईपीवी 6 के साथ काम नहीं करता है। - Emmanuel Bourg
क्या कोई यह समझा सकता है कि मैं बाद में इस नियम को कैसे हटा सकता हूं? इसे चलाने के बाद, यह काम करता है, लेकिन यह स्पष्ट रूप से "नियम" नहीं है क्योंकि यह तब होता है जब मैं करता हूं sudo iptables --list। मुझे पता है कि iptables क्या है और करता है, लेकिन मैंने इससे पहले कभी इसका उपयोग नहीं किया है। - Encoderer
आपके उत्तर के लिए धन्यवाद ... जब भी मैं उबंटू को रीबूट करता हूं, यह नियम गायब हो जाता है और मुझे इसे फिर से चलाने की ज़रूरत है। क्या इसे हमेशा के लिए बचाने का कोई तरीका है? - Coderji
@ कोडरजी: सामुदायिक दस्तावेज़ीकरण में "सहेजें" अनुभाग देखें: help.ubuntu.com/community/IptablesHowTo - Sunny


उपयोग authbind

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

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

77
2017-11-14 13:12



यदि सर्वर टोमकैट है तो आप सेटिंग द्वारा स्वचालित रूप से ऑथबिंड का उपयोग कर सकते हैं AUTHBIND=yes / etc / default / tomcat6 में - Emmanuel Bourg
मैं इसे डिफ़ॉल्ट जावा पैकेज के साथ उबंटू सर्वर पर काम करने के लिए नहीं मिला ... - Ashley Steel
मैं न तो, कोई ज्ञात समाधान? - mark
ध्यान दें कि आपको कॉन्फ़िगर करना होगा authbind वास्तव में ऐसा होने की अनुमति दें। आदमी पृष्ठ से: "/ etc / authbind / byport / port का परीक्षण किया जाता है। यदि यह फ़ाइल कॉलिंग उपयोगकर्ता को निष्पादन के लिए सुलभ है, तो एक्सेस (2) के अनुसार, पोर्ट को बाध्यकारी अधिकृत है।", उदा। पोर्ट 80 के लिए, sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/80। प्रारंभिक स्थापना authbind आमतौर पर कोई पूर्व-कॉन्फ़िगर प्रमाणीकरण नहीं होता है। - Jason C
ओह nonononononono, कभी भी 777 कुछ भी chmod कभी नहीं! - Johannes


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

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

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

45
2018-05-30 20:32



यह nodejs के लिए काम करता है: setcap 'cap_net_bind_service = + ep' / usr / bin / nodejs - JasonS
इस। मुझे आश्चर्य है कि इस जवाब में अधिक उत्साह क्यों नहीं है। Iptables विकल्प imho से बहुत आसान है। - Dominik R
यह सही और सबसे कुशल उत्तर है, अन्य सभी उत्तरों प्रदर्शन प्रदर्शन हिट या सिर्फ iffy / असुरक्षित कारण बनता है। - OneOfOne


एक और समाधान है कि आप अपने ऐप को सेट करें ताकि यह पोर्ट 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

39
2017-11-10 14:44



यह रूट के रूप में चलने जैसा ही है, जब तक ऐप जानता है कि निजीकृत कैसे छोड़ें। - CesarB
यह खतरनाक है। इसका मतलब है कि कोई भी अनुरोध रूट के रूप में चलाया जाएगा। यह एक कारण के लिए है कि यहां तक ​​कि अपाचे भी बांधने के लिए रूट के रूप में शुरू होता है, और उसके बाद विशेषाधिकारों को दूसरे उपयोगकर्ता को छोड़ देता है। - Sunny
पॉल: iptables इतना खतरनाक नहीं है, क्योंकि यदि ऐप से समझौता किया गया है, तो यह कम से कम रूट विशेषाधिकारों के साथ सिस्टम पर हमलों का खुलासा नहीं करेगा। ऐप को रूट के रूप में चलाना एक और कहानी है। - Sunny
Iptables के लिए खतरा केवल तभी होता है जब यह एक बहु-उपयोगकर्ता प्रणाली है, जैसा कि सीज़रबी ने कहा था, क्योंकि कोई भी 8080 से जुड़ सकता है, और यातायात को रोक सकता है। - Sunny
lol, प्यार कैसे स्वीकार्य जवाब एक -15 है - Evan Teran


सनी और सीज़रबी द्वारा प्रस्तावित दृष्टिकोण:

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

ठीक काम करता है लेकिन इसमें एक छोटी सी कमी है - यह उपयोगकर्ता को 80 के बजाय पोर्ट 8080 पर सीधे कनेक्ट करने से नहीं रोकती है।

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

आइए मान लें कि हमारे पास एक सर्वर है जो बंदरगाह 8080 और HTTP 8181 पर HTTPS कनेक्शन पर HTTP कनेक्शन स्वीकार करता है।

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

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

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

  • कुछ उपयोगकर्ता बुकमार्क करेंगे https://host:8181/ यूआरएल और हमें अपने बुकमार्क को तोड़ने से बचने के लिए इस यूआरएल को बनाए रखना होगा।
  • अन्य उपयोगकर्ता कनेक्ट नहीं कर पाएंगे क्योंकि उनके प्रॉक्सी सर्वर गैर-मानक 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 श्रृंखला पर डिफ़ॉल्ट अस्वीकृति नियम के साथ संयुक्त यह दृष्टिकोण उपयोगकर्ताओं को सीधे पोर्ट्स 8080, 8181 से कनेक्ट करने से रोकता है


35
2018-02-20 16:19



यह अच्छा है, लेकिन क्यों न सिर्फ स्थानीयहोस्ट को डिमन को बांधें: 0.0.0.0:8080 के बजाय 8080? मैं ऐसा करना चाहता हूं, लेकिन इसके लिए मुझे iptables की आवश्यकता है। - Amala
यह वास्तव में अच्छा काम करता है। - xtian


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

  • apt-get install nginx

.. या ..

  • pkg_add -r nginx 

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

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

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

34
2017-11-20 14:30



मुझे वास्तव में यह समाधान पसंद है। - thomasfedb
यह स्वयं (जेएफआरओ) से सुझाए गए समाधान में से एक है: jfrog.com/confluence/display/RTF/nginx - stolsvik


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

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


29
2017-11-10 14:36





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


23
2017-11-10 16:27



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


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

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

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

11
2017-10-18 15:36