วิธีรันเซิร์ฟเวอร์บนพอร์ต 80 ในฐานะผู้ใช้ปกติบน Linux?


311

ฉันใช้ Googled เกี่ยวกับวิธีแก้ปัญหามาระยะหนึ่งแล้ว แต่ไม่พบคำตอบ

ฉันใช้ Ubuntu Linux และต้องการใช้งานเซิร์ฟเวอร์ที่พอร์ต 80 แต่เนื่องจากกลไกความปลอดภัยของ Ubuntu ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

java.net.BindException: การอนุญาตถูกปฏิเสธ: 80

ฉันคิดว่ามันควรจะง่ายพอที่จะปิดการใช้งานกลไกความปลอดภัยนี้เพื่อให้พอร์ต 80 พร้อมใช้งานสำหรับผู้ใช้ทั้งหมดหรือเพื่อกำหนดสิทธิ์ที่จำเป็นให้กับผู้ใช้ปัจจุบันเพื่อเข้าถึงพอร์ต 80


3
ปัญหาในการใช้งานเซิร์ฟเวอร์บนพอร์ตอื่นที่ไม่มีสิทธิพิเศษคืออะไร คุณกำลังคิดเกี่ยวกับบางสิ่งที่รุนแรงพอ ๆ กับการปิดใช้งานกลไกการรักษาความปลอดภัยโดยที่ไม่ได้ให้เหตุผลที่ร้ายแรงมากสำหรับการเรียกใช้เซิร์ฟเวอร์บนพอร์ตนั้น เซิร์ฟเวอร์ hardcoded เชื่อมโยงกับพอร์ต 80 หรือไม่ ถ้าเป็นเช่นนั้นทิ้งมันไป
ไม่ประสงค์ออกนาม


4
คุณทำไม่ได้ พอร์ตที่ต่ำกว่า 1024 มีสิทธิ์พิเศษและเฉพาะรูทเท่านั้นที่สามารถเปิดซ็อกเก็ตการฟังได้ สิ่งที่เหมาะสมที่จะทำคือการปล่อยสิทธิ์หลังจากเปิดมัน
Falcon Momot

2
"Anonymous" - ผู้ใช้ทั่วโลกได้รับการฝึกอบรมเพื่อค้นหาบริการบางอย่างที่พอร์ตบางแห่ง ในบางกรณีมันได้รับมาตรฐาน ตัวอย่างเช่น HTTP บนพอร์ต 80 และ HTTPS บนพอร์ต 443 ชนิดของมันยากที่จะเปลี่ยนผู้ใช้และมาตรฐานของโลก

1
@FalconMomot หากพอร์ตที่ต่ำกว่า 1024 ได้รับสิทธิพิเศษทำไมเซิร์ฟเวอร์ Apache ไม่ต้องการให้ป้อนรหัสผ่านเพื่อรับสิทธิ์รูทบนพอร์ต 80 และพวกเขาจะทำเช่นนั้นได้อย่างไร ฉันคิดว่าผู้ถามต้องการทราบวิธีการทำสิ่งต่าง ๆ ในแบบที่เป็นอยู่ (ไม่ว่าจะเป็นการใช้ในทางเทคนิคเป็นรูทหรือไม่ก็ตาม) รู้สึกอิสระที่จะบอกฉันถ้าฉันผิด Deepak Mittal
Shule

คำตอบ:


355

คำตอบสั้น ๆ : คุณทำไม่ได้ พอร์ตที่ต่ำกว่า 1024 สามารถเปิดได้โดยรูทเท่านั้น ตามความคิดเห็น - คุณสามารถใช้CAP_NET_BIND_SERVICEแต่วิธีการที่นำไปใช้กับ java bin จะทำให้โปรแกรม java ใด ๆ ที่จะทำงานด้วยการตั้งค่านี้ซึ่งไม่พึงประสงค์หากไม่เสี่ยงต่อความปลอดภัย

คำตอบที่ยาว: คุณสามารถเปลี่ยนเส้นทางการเชื่อมต่อบนพอร์ต 80 ไปยังพอร์ตอื่นที่คุณสามารถเปิดได้เหมือนผู้ใช้ปกติ

เรียกใช้เป็นราก:

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

เนื่องจากอุปกรณ์ลูปแบ็ค (เช่น localhost) อย่าใช้กฎการกำหนดล่วงหน้าหากคุณต้องการใช้ localhost ฯลฯ ให้เพิ่มกฎนี้ด้วย ( ขอบคุณ @Francesco ):

# 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

กฎที่คุณสนใจคือ nr 2 เพื่อลบ:

# iptables -t nat -D PREROUTING 2

13
@Sunny: upvotes ไม่ใช่ปืนที่เร็วที่สุดในฝั่งตะวันตก แต่เป็นคำตอบที่ดีที่สุด ของคุณดีที่สุดจนถึงตอนนี้ (ฉันพูดถึง iptables เท่านั้นคุณให้คำสั่งเต็มบรรทัด) สิ่งเดียวที่ฉันมีไม่ใช่ของคุณคือข้อแม้เกี่ยวกับผู้ใช้รายอื่น ๆ ที่สามารถผูกเข้ากับพอร์ต 8080 ได้ด้วย
CesarB

3
โปรดทราบว่านี่ใช้ไม่ได้กับ IPv6
Emmanuel Bourg

3
ใครช่วยอธิบายว่าฉันสามารถลบกฎนี้ได้ในภายหลังเมื่อฉันต้องการ? หลังจากทำงานมันทำงาน แต่ก็เห็นได้ชัดว่าไม่ได้เป็น "กฎ" sudo iptables --listเพราะมันไม่ได้ปรากฏขึ้นเมื่อฉันทำ ฉันรู้ว่า iptables คืออะไรและทำอะไร แต่ฉันไม่เคยใช้มันมาก่อน
Encoderer

4
ขอบคุณสำหรับคำตอบของคุณ ... เมื่อใดก็ตามที่ฉันรีบูต Ubuntu กฎนี้จะหายไปและฉันต้องเรียกใช้อีกครั้ง มีวิธีที่จะช่วยมันไว้ตลอดไปไหม?
Coderji

4
@Coderji: ตรวจสอบส่วน "บันทึก" ในเอกสารชุมชน: help.ubuntu.com/community/IptablesHowTo
Sunny

79

ใช้การตรวจสอบอัตโนมัติ

สามารถใช้งานได้กับ Java หากคุณเปิดใช้งานสแต็ก IPv4 เท่านั้นของ Java ฉันใช้:

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

4
หากเซิร์ฟเวอร์เป็น Tomcat คุณสามารถใช้การตรวจสอบอัตโนมัติโดยการตั้งค่าAUTHBIND=yesใน / etc / default / tomcat6
Emmanuel Bourg

ฉันไม่สามารถรับนี้ในการทำงานบนเซิร์ฟเวอร์อูบุนตูกับแพคเกจ Java เริ่มต้น ...
แอชลีย์

ไม่มีใครรู้วิธีแก้ปัญหา?
ทำเครื่องหมาย

10
โปรดทราบว่าคุณต้องกำหนดค่าauthbindให้อนุญาตสิ่งนี้เกิดขึ้นจริง จาก man page: "/ etc / authbind / byport / port ได้รับการทดสอบหากไฟล์นี้สามารถเข้าถึงได้สำหรับการดำเนินการกับผู้ใช้ที่เรียกใช้ตามการเข้าถึง (2) จากนั้นจะเชื่อมโยงกับพอร์ตที่ได้รับอนุญาต" เช่นสำหรับพอร์ต sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/8080 โดยทั่วไปการติดตั้งครั้งแรกauthbindไม่มีการอนุญาตที่กำหนดค่าไว้ล่วงหน้า
Jason C

4
โอ้ nonononononono ไม่เคย chmod 777 อะไรเลย!
โยฮันเนส

57

หากระบบของคุณรองรับคุณอาจใช้ความสามารถ ดูความสามารถของมนุษย์สิ่งที่คุณต้องการคือ CAP_NET_BIND_SERVICE

ใน Debian / Ubuntu รุ่นใหม่กว่าคุณสามารถเรียกใช้:

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

สิ่งนี้ใช้ได้กับ nodejs: setcap 'cap_net_bind_service = + ep' / usr / bin / nodejs
JasonS

5
นี้. ฉันสงสัยว่าทำไมคำตอบนี้ไม่ได้เพิ่มขึ้นมาก ง่ายกว่าตัวเลือก iptables imho
Dominik R

5
นี่คือคำตอบที่ถูกต้องและมีประสิทธิภาพมากที่สุดคำตอบอื่น ๆ ทั้งหมดเป็นสาเหตุให้เกิดผลการทำงานหรือไม่แน่นอน / ไม่ปลอดภัย
OneOfOne

41

วิธีแก้ปัญหาอื่นคือทำให้แอปของคุณตั้งค่าเพื่อให้สามารถผูกกับพอร์ต 80 ได้ในฐานะที่เป็นรูทให้ทำดังต่อไปนี้

chown root ./myapp
chmod +S ./myapp

โปรดทราบว่าการทำเช่นนี้จะไม่ส่งผลต่อช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้นเพราะแอปของคุณจะพูดคุยกับเครือข่ายและจะทำงานด้วยสิทธิ์พิเศษเต็มรูปแบบ หากคุณใช้วิธีนี้คุณควรดูซอร์สโค้ดสำหรับ Apache หรือ Lighttpd หรือสิ่งที่คล้ายกันโดยที่พวกเขาใช้สิทธิ์รูทเพื่อเปิดพอร์ต แต่จากนั้นก็เลิกใช้ Privs เหล่านั้นทันทีและ "กลายเป็น" ผู้ใช้ที่มีสิทธิ์ต่ำกว่า นักจี้ที่ไม่สามารถควบคุมคอมพิวเตอร์ของคุณได้ทั้งหมด

อัปเดต: ตามที่เห็นในคำถามนี้ปรากฏว่าเคอร์เนล Linux ตั้งแต่ 2.6.24 มีความสามารถใหม่ที่อนุญาตให้คุณทำเครื่องหมายความสามารถในการเรียกใช้งาน (แต่ไม่ใช่สคริปต์แน่นอน) ว่ามีCAP_NET_BIND_SERVICEความสามารถ "" หากคุณติดตั้งแพคเกจเดเบียน "libcap2-bin" คุณสามารถทำได้โดยการออกคำสั่ง

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

6
นั่นเป็นเหมือนกับการทำงานเป็นรูทเว้นแต่แอพจะรู้วิธีการลบสิทธิพิเศษ
CesarB

14
สิ่งนี้เป็นอันตราย ซึ่งหมายความว่าคำขอใด ๆ จะทำงานในฐานะรูท มันเป็นเหตุผลที่แม้แต่ apache ก็เริ่มจากรูทเพื่อผูกแล้วปล่อยสิทธิพิเศษให้ผู้ใช้รายอื่น
ซันนี่

9
Paul: iptables ไม่ได้อันตรายมากเพราะแม้ว่าแอพจะถูกบุกรุกมันจะไม่เปิดเผยระบบในการโจมตีอย่างน้อยก็ไม่มีสิทธิ์รูท การเรียกใช้แอปในฐานะรูทเป็นอีกเรื่องหนึ่ง
ซันนี่

1
อันตรายสำหรับ iptables ก็ต่อเมื่อนี่เป็นระบบที่มีผู้ใช้หลายคนตามที่ CesarB กล่าวขณะที่ทุกคนสามารถผูกกับ 8080 และสกัดกั้นการรับส่งข้อมูล
ซันนี่

1
lol รักวิธีคำตอบที่ยอมรับมี -15
Evan Teran

40

ฉันใช้ Nginx ด้านหน้าเท่านั้น มันสามารถทำงานบน localhost ได้เช่นกัน

  • apt-get install nginx

.. หรือ ..

  • pkg_add -r nginx

.. หรือสิ่งที่เหมาะสมกับระบบปฏิบัติการของคุณ

สิ่งที่คุณต้องการใน nginx.conf หากทำงานบน localhost คือ:

เซิร์ฟเวอร์ {
        ฟัง 80;
        server_name some.domain.org;
        ตำแหน่ง / {
            proxy_set_header โฮสต์ $ host;
            proxy_set_header X-Real-IP $ remote_addr;
            proxy_set_header X-Forwarded- สำหรับ $ proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8081;
        }
}

ฉันชอบวิธีนี้มาก
thomasfedb

1
นี่คือ (หนึ่ง) การแก้ปัญหาข้อเสนอแนะจาก JFrog ตัวเอง: jfrog.com/confluence/display/RTF/nginx
stolsvik

36

แนวทางที่เสนอโดย Sunny และ CesarB:

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

ทำงานได้ดี แต่มีข้อเสียเปรียบเล็กน้อย - ไม่ได้ป้องกันผู้ใช้จากการเชื่อมต่อโดยตรงกับพอร์ต 8080 แทน 80

พิจารณาสถานการณ์สมมติต่อไปนี้เมื่ออาจเป็นปัญหา

สมมติว่าเรามีเซิร์ฟเวอร์ที่ยอมรับการเชื่อมต่อ HTTP บนพอร์ต 8080 และการเชื่อมต่อ HTTPS บนพอร์ต 8181

เราใช้ 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

รวมกับกฎ REJECT เริ่มต้นบนเชน INPUT วิธีนี้จะป้องกันผู้ใช้จากการเชื่อมต่อโดยตรงกับพอร์ต 8080, 8181


1
นี่เป็นสิ่งที่ดี แต่ทำไมไม่ผูก daemon กับ localhost: 8080 แทนที่จะเป็น 0.0.0.0:8080 ฉันต้องการทำสิ่งนั้น แต่ฉันต้องการ iptables สำหรับสิ่งนั้น
Amala

มันใช้งานได้ดีจริง ๆ
xtian

29

ตามธรรมเนียมบน Unix เฉพาะ root เท่านั้นที่สามารถเชื่อมโยงกับพอร์ตต่ำ (<1024)

วิธีที่ง่ายที่สุดในการหลีกเลี่ยงปัญหานี้คือการเรียกใช้เซิร์ฟเวอร์ของคุณบนพอร์ตสูง (เช่น 8080) และใช้กฎ iptables ง่าย ๆ เพื่อส่งต่อการเชื่อมต่อจากพอร์ต 80 ไปยังพอร์ต 8080 โปรดทราบว่าสิ่งนี้ทำให้คุณสูญเสียการป้องกันเพิ่มเติมจาก พอร์ตต่ำ ผู้ใช้ใด ๆ บนเครื่องของคุณสามารถผูกกับพอร์ต 8080


23

หากระบบของคุณรองรับคุณอาจใช้ความสามารถ ดูหนึ่งที่คุณต้องการจะเป็นman capabilities CAP_NET_BIND_SERVICEไม่ฉันไม่เคยใช้ด้วยตนเองและฉันก็ไม่รู้ว่าทำงานได้จริง :-)


1
พวกเขาใช้งานได้ฉันใช้ CAP_NET_RAW เพื่อเรียกใช้เครื่องมือเช่น tcpdump ในฐานะผู้ใช้ปกติ
จัสติน

12

ใช้ reverse proxy (nginx, apache + mod_proxy) หรือ reverse proxy แคช (Squid, Varnish) ต่อหน้าเซิร์ฟเวอร์แอพพลิเคชันของคุณ!

ด้วยพร็อกซีย้อนกลับคุณสามารถบรรลุสิ่งที่น่าสนใจมากมายเช่น:

  • โหลดสมดุล
  • รีสตาร์ทเซิร์ฟเวอร์แอปพลิเคชันของคุณด้วยผู้ใช้ที่ได้รับหน้าข้อผิดพลาดแฟนซี
  • เร่งความเร็วสิ่งของด้วยแคช
  • การตั้งค่าแบบละเอียดที่ปกติแล้วคุณทำกับ reverse-proxy และไม่ใช่กับเซิร์ฟเวอร์แอปพลิเคชัน


4

ใช้ sudo

กำหนดค่า sudo เพื่อให้ผู้ใช้ทั่วไปสามารถเรียกใช้คำสั่งที่เหมาะสม:

/etc/init.d/httpd start

หรือ

apachectl stop

หรือ

/usr/local/apache2/apachectl restart

หรือ

/myapp/myappbin start

(หรือคำสั่ง / สคริปต์ใด ๆ ก็ตามที่คุณใช้เพื่อเริ่ม / หยุดคุณเว็บเซิร์ฟเวอร์ / แอปเฉพาะ)


8
ปัญหานี้มีปัญหาเดียวกัน - การเรียกใช้บริการเนื่องจากรูทเป็นวิธีปฏิบัติที่ไม่ดี
Kevin Panko

4

คำตอบของ sunny ถูกต้อง แต่คุณอาจประสบปัญหาเพิ่มเติมเนื่องจากส่วนต่อประสานย้อนกลับไม่ได้ใช้ตาราง 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

ด้วย Linux คุณมีสองตัวเลือกอื่น ๆ :

ส่วนขยายทั้งสองไปยังเคอร์เนล Linux อนุญาตให้สิทธิ์การเข้าถึงในระดับที่ละเอียดมาก สิ่งนี้จะช่วยให้คุณสามารถอนุญาตให้กระบวนการนี้เปิดพอร์ต 80 แต่จะไม่สืบทอดสิทธิ์รูทอื่น ๆ

จากสิ่งที่ฉันเคยได้ยินความปลอดภัย grs ง่ายต่อการใช้งานมากขึ้น แต่ SELinux มีความปลอดภัยมากขึ้น


2

ทางออกหนึ่งคือการใช้ iptables เพื่อดำเนินการ PAT บนแพ็คเก็ตสำหรับพอร์ต 80 คุณสามารถใช้สิ่งนี้เพื่อกำหนดเส้นทางแพ็คเก็ตไปยังพอร์ตท้องถิ่น 8080 ตัวอย่างเช่น ตรวจสอบและปรับแพ็กเก็ตขาออกกลับไปที่พอร์ต 80

จากประสบการณ์ของฉันฟีเจอร์การอนุญาตที่ละเอียดของลีนุกซ์ไม่ได้ถูกรวบรวมไว้ในเมล็ดมาตรฐานเนื่องจากปัญหาด้านความปลอดภัย


2

หากคุณพยายามทำเช่นนี้เพื่อให้คำสั่งที่ผู้ใช้เรียกใช้สามารถใช้พอร์ต 80 ได้โซลูชันเดียวของคุณคือเทคนิค iptables หรือตั้งค่าไฟล์ปฏิบัติการ setuid-to-root

วิธีที่บางอย่างเช่น Apache ทำเช่นนี้ (ผูกกับพอร์ต 80 แต่ทำงานเหมือนคนอื่นที่ไม่ใช่รูท) คือการทำงานเป็นรูทผูกเข้ากับพอร์ตจากนั้นเปลี่ยนความเป็นเจ้าของของกระบวนการให้กับผู้ใช้ที่ไม่มีสิทธิ์หลังจากพอร์ต ถูกตั้งค่าแล้ว หากแอปที่คุณกำลังเขียนสามารถเรียกใช้โดยรูทคุณสามารถเปลี่ยนให้เจ้าของเป็นผู้ใช้ที่ไม่ใช่ผู้ใช้ส่วนตัวหลังจากตั้งค่าพอร์ตแล้ว แต่ถ้านี่เป็นเพียงเพื่อให้ผู้ใช้โดยเฉลี่ยเรียกใช้จากบรรทัดคำสั่งแล้วคุณจะต้องใช้หนึ่งในโซลูชั่นอื่น ๆ


2

เมื่อฉันมีแอปพลิเคชั่นการให้บริการเว็บต่างๆ (สคริปต์หลาม, เครื่องยนต์ทอมแคท, ... ) ที่ฉันไม่ต้องการเรียกใช้ในฐานะรูทฉันมักจะกำหนดค่าเว็บเซิร์ฟเวอร์ Apache ไว้ข้างหน้าพวกเขา Apache ฟังพอร์ต 80 และ tomcat รับฟัง 8080

ใน apache: s config:

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

ดูเอกสารประกอบ mod-proxy สำหรับข้อมูลเพิ่มเติม: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html


1
ข้อเสียของโซลูชันนี้คือการสูญเสีย IP ขาเข้าในบันทึก Tomcat
Emmanuel Bourg

2

ฉันคิดว่าทางออกที่ดีที่สุดคือ sgid แอปของคุณและทันทีที่พอร์ตของมันถูกผูกไว้ก็ควรจะลดระดับสิทธิ์โดยการสลับไปใช้ผู้ใช้รายอื่น


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
โดยทั่วไปจะเทียบเท่ากับการวาง reverse proxy ไว้ด้านหน้าเซิร์ฟเวอร์ แต่มันค่อนข้างไม่มีประสิทธิภาพเมื่อเทียบกับโซลูชันเฉพาะเช่น HAproxy, Pound หรือ Varnish ที่เข้าใจโปรโตคอล HTTP และสามารถเพิ่มส่วนหัวที่มีประโยชน์อย่าง X-Forwarded-For
Emmanuel Bourg

-1

ในฐานะที่เป็นกัน FreeBSD และ Solaris (ใครจำได้ว่าเป็น?) ช่วยให้คุณทำเช่นนี้ (ผูกกับพอร์ตต่ำ) โดยไม่มีการเพิ่มสิทธิพิเศษ (เช่นการใช้โปรแกรมเพื่อเปลี่ยนเป็นรูท) เมื่อคุณระบุลีนุกซ์ฉันเพิ่งโพสต์สิ่งนี้เป็นประกาศให้ผู้อื่นที่อาจพบคำถามนี้


-1

Necromancing

ง่าย ด้วยเคอร์เนลปกติหรือเก่าคุณทำไม่ได้
ตามที่คนอื่น ๆ ชี้ให้เห็น iptables สามารถส่งต่อพอร์ต
ตามที่คนอื่น ๆ ชี้ให้เห็น CAP_NET_BIND_SERVICE ก็สามารถทำงานได้เช่นกัน
แน่นอนว่า CAP_NET_BIND_SERVICE จะล้มเหลวถ้าคุณเปิดโปรแกรมจากสคริปต์เว้นแต่ว่าคุณตั้งค่า cap บนตัวแปลเชลล์ซึ่งไม่มีจุดหมายคุณสามารถเรียกใช้บริการของคุณในฐานะ root ...
เช่นสำหรับ Java คุณต้องใช้มัน ถึง JAVA JVM

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

เห็นได้ชัดว่านั่นหมายความว่าโปรแกรม Java ใด ๆ สามารถผูกพอร์ตระบบได้
Dito สำหรับโมโน /. 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_SOCK 24

โดยทั่วไปฉันจะใช้การตั้งค่าต่ำสุดที่คุณต้องการเช่น 79 สำหรับ http หรือ 24 เมื่อใช้ SMTP บนพอร์ต 25

นั่นคือทั้งหมด
รวบรวมเคอร์เนลและติดตั้ง
Reboot
เสร็จสิ้น - ข้อ จำกัด ที่โง่คือ 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 ถ้าคุณต้องการรักษาความปลอดภัยรวบรวมเคอร์เนลถ้าคุณต้องการให้แน่ใจว่าข้อ จำกัด นี้ไม่รบกวนคุณอีก


มีคนช่วยอธิบาย downvote บ้างไหม การรวบรวมเคอร์เนลไม่ทำงาน? หรือเป็นเพียงเพราะหลังจากนั้นคุณไม่สามารถอัพเกรดเคอร์เนลจากที่เก็บปกติอีกต่อไปได้?
แน่ใจ

ฉันลองวิธีนี้ ( 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ถ้า java มีชุดหมวก ดูส่วนแรกของunix.stackexchange.com/a/16670/55508
Daniel Alder

1
แก้ไขข้อผิดพลาดที่ผ่านมาโดยการเพิ่ม<javahome>/lib/amd64/jli/การld.so.confทำงานsudo ldconfig
แดเนียล Alder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.