ฉันมีเซิร์ฟเวอร์ที่โฮสต์โดย hetzner โดยมีที่อยู่ IP สาธารณะเดียวซึ่งเรียกใช้ proxmox และ VM บางตัว ที่อยู่ IP นี้ได้รับการกำหนดค่าภายใน /etc/interfaces ดังนี้:
อัตโนมัติ enp35s0
iface enp35s0 inet แบบคงที่
ที่อยู่ {{my-public-ip}}/{{subnet}}
เกตเวย์ {{hetzner-gateway}}
เพิ่มเส้นทาง -net {{hetzner-ip}} netmask 255.255.255.192 gw {{hetzner-gateway}} dev enp35s0
การกำหนดค่านี้ทำโดย hetzner
เนื่องจากฉันไม่ต้องการรับที่อยู่ IP เพิ่มเติมจาก hetzner ฉันปลอมแปลง IP นั้นสำหรับ VM-Network ภายใน:
vmbr0 อัตโนมัติ
iface vmbr0 inet แบบคงที่
ที่อยู่ 172.16.0.1/24
บริดจ์พอร์ตไม่มี
ปิดสะพาน
บริดจ์-fd 0
โพสต์อัพ echo 1 > /proc/sys/net/ipv4/ip_forward
โพสต์อัพ iptables -t nat -A POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE
โพสต์ลง iptables -t nat -D POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE
ด้วยวิธีนี้ VMs ของฉันจึงมีการเข้าถึงอินเทอร์เน็ตและสามารถติดต่อกันได้
เนื่องจากการส่งต่อพอร์ต iptables ค่อนข้างซับซ้อนเกินไปสำหรับฉัน ฉันจึงเริ่มใช้ firewalld ในนั้นฉันมีอินเทอร์เฟซ enp35s0 ที่กำหนดให้กับโซนภายนอกและ vmbr0 ให้เชื่อถือได้ ฉันรู้ว่าบางทีฉันควรกำหนดให้เป็นการภายในแทน แต่ปัจจุบันมันไม่ได้สร้างความแตกต่างจริงๆ (หรือฉันคิดอย่างนั้นในกรณีปัญหาของฉัน)
ตอนนี้ฉันมีบริการที่ทำงานภายใน VM ด้วย ip 172.16.0.3 บนพอร์ต 38080 ในการเข้าถึงบริการนี้ ฉันเพิ่มกฎการส่งต่อพอร์ตในไฟร์วอลล์: พอร์ต=38080:proto=tcp:toport=38080:toaddr=172.16.0.3
. ด้วยวิธีนี้ฉันสามารถเข้าถึงบริการนั้นได้จากภายนอกเครื่องเซิร์ฟเวอร์นี้
ปัญหาตอนนี้คือ ถ้าฉันใช้ซอฟต์แวร์อย่าง uptime-kuma และเรียกใช้ภายใน VM บนเครื่องเดียวกันด้วย ฉันไม่สามารถเข้าถึงบริการนั้นบนพอร์ต 38080 ได้เนื่องจากการส่งต่อพอร์ตจะทำเฉพาะคำขอภายนอกเท่านั้น สิ่งสำคัญที่นี่คือชื่อโฮสต์ที่ uptime-kuma ใช้คือ FQDN ที่ได้รับการแก้ไขเป็นที่อยู่ IP สาธารณะของเครื่องโฮสต์ของฉัน
ดังนั้นเพื่อให้เป็นไปได้ ฉันจึงเพิ่มกฎการส่งต่อพอร์ตเดียวกันไปยังโซนที่น่าเชื่อถือของไฟร์วอลล์ เนื่องจากอินเทอร์เฟซ vmbr0 ของฉันอยู่ในนั้น และจากอินเทอร์เฟซนั้นมีคำขอ
ตอนนี้การเชื่อมต่อนี้ใช้งานได้และซอฟต์แวร์ของฉัน (uptime-kuma) สามารถเข้าถึงบริการของฉันได้
ปัญหาใหญ่ในตอนนี้คือทุกคำขอจากภายในเครือข่ายเสมือนที่ต้องการใช้พอร์ต 38080 จะถูกเปลี่ยนเส้นทางไปยัง VM นั้น (172.16.0.3) แม้แต่คำขอที่ไปยังเซิร์ฟเวอร์อื่นโดยสิ้นเชิง
ฉันจะบอก firewalld ให้เปลี่ยนเส้นทางทราฟฟิกนั้นได้อย่างไร หากคำขอนั้นมีเป้าหมายที่เครื่องโฮสต์จริง ๆ