ฉันใหม่กับ docker ปัจจุบันต้องการตั้งค่า docker บน vps โดยทำตามบทช่วยสอนนี้ [https://www.howtoforge.com/how-to-install-and-use-nginx-proxy-manager/ ](https://www.howtoforge.com/how-to-install-and-use-nginx-proxy-manager/) ดังนั้นแผนการตั้งค่าของฉันจะเป็นดังนี้: vps ubuntu 22.04, wireguard สำหรับ vpn, ufw สำหรับไฟร์วอลล์ : nginx proxy manager (NPM) เพื่อจัดการ http, https, ssl certificate (เปิดเผยพอร์ต 81) porttainer สำหรับการจัดการนักเทียบท่า (เปิดเผยพอร์ต 9443) ghost คอนเทนเนอร์อื่นของฉันจะใช้เครือข่ายนักเทียบท่าและพูดคุยโดยตรงกับตัวจัดการพร็อกซี nginx เช่นบทช่วยสอนและการแมปกับโดเมนย่อยตามลำดับ ฉันไม่ต้องการเปิดเผยพอร์ต 81, 9443 ต่อสาธารณะ ดังนั้นฉันจึงสร้างกฎ ufw และอนุญาตเฉพาะ vpn ip ในเครื่องเท่านั้นที่สามารถเชื่อมต่อกับพอร์ตนั้นได้ ปัญหาของฉันคือคอนเทนเนอร์นักเทียบท่าดูเหมือนจะเพิกเฉยต่อกฎ ufw และทำให้พอร์ตยังคงสามารถเข้าถึงได้ด้วย ip สาธารณะ ฉันลอง [https://github.com/chaifeng/ufw-docker](https://github.com/chaifeng/ufw-docker) แล้ว และมันแก้ไขปัญหา portainer และ NPM .. แต่ ghost และคอนเทนเนอร์อื่นของฉันล้มเหลว เพื่อเชื่อมต่อกับตัวจัดการพร็อกซี nginx หากกล่องรีสตาร์ทหรือรีสตาร์ทคอนเทนเนอร์ การแก้ไขของฉันตอนนี้คือการเปิดเผย ghost คอนเทนเนอร์อื่นไปยังพอร์ตโฮสต์แล้วแมปกับ NPM ด้วยที่อยู่ ip ใช้งานได้ แต่รู้สึกผิดเพราะเมื่อจำนวนคอนเทนเนอร์เพิ่มขึ้นความต้องการพอร์ตก็จะเพิ่มขึ้นเช่นกัน ทางออกที่สะอาดสำหรับสิ่งนี้คืออะไร? ขอบใจ นักเทียบท่าแทรกกฎข้อแรกค่อนข้างเร็วใน iptables ที่ nat PREROUTING คุณสามารถดูกฎด้วย: iptables -t แนท -S ufw มักจะวางกฎไว้ใน INPUT ซึ่งอยู่หลังทั้ง PREROUTING และ FORWARD! มีสองแห่งใน PREROUTING ที่อยู่ก่อน nat อย่างไรก็ตาม! ดิบและแหลกเหลว Mangle สามารถทำสิ่งส่วนใหญ่ที่ INPUT สามารถทำได้ ดังนั้นคุณจึงสามารถป้องกันไม่ให้แพ็กเก็ตที่เข้ามาในอินเทอร์เฟซสาธารณะเข้าถึงเครือข่ายของนักเทียบท่าโดยสร้างกฎสำหรับอินเทอร์เฟซผับ เช่น: iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 9443 -j ยอมรับ iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 81 -j ยอมรับ # ดังนั้นคุณจึงไม่ปิดกั้นตัวเองจาก ssh: iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 22 -j ยอมรับ จากนั้นปล่อย tcp ที่เหลือหลังจากที่คุณยอมรับในอินเทอร์เฟซผับ (อย่าลืม udp): iptables -t mangle -A PREROUTING -i eth0 -p tcp -j DROP สำหรับการอ้างอิงเช่นเดียวกับคำแนะนำกฎที่เทียบเท่าสำหรับ INPUT จะมีลักษณะดังนี้: iptables -A INPUT -i eth0 -p tcp --dport 22 -j ยอมรับ สมมติว่าชื่ออินเทอร์เฟซสาธารณะของคุณคือ eth0 แน่นอน เปลี่ยนกฎหากต้องการ :) ทางเลือกคือสิ่งที่ hypgn0sis แนะนำโดยใช้ห่วงโซ่ DOCKER-USER อย่างไรก็ตามนั่นจะมีประสิทธิภาพน้อยลงและแพ็กเก็ตยังคงเข้าถึงเครือข่ายได้ (รวมถึงการยอมรับ FORWARD) นอกจากนี้ ufw และ firewalld จะรบกวนกฎ iptables ของคุณ เว้นแต่คุณจะปิดใช้งานหรือถอนการติดตั้ง