ฉันใหม่กับ 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 ของคุณ เว้นแต่คุณจะปิดใช้งานหรือถอนการติดตั้ง