ฉันมีเซิร์ฟเวอร์ที่โฮสต์โดย hetzner โดยมีที่อยู่ IP สาธารณะเพียงที่อยู่เดียวซึ่งใช้งาน proxmox และ VM บางตัว ที่อยู่ IP นี้ได้รับการกำหนดค่าภายใน /etc/interfaces ดังนี้:

auto enp35s0
iface enp35s0 inet static
    address {{my-public-ip}}/{{subnet}}
    gateway {{hetzner-gateway}}
    up route add -net {{hetzner-ip}} netmask 255.255.255.192 gw {{hetzner-gateway}} dev enp35s0

การกำหนดค่านี้ทำโดย hetzner

เนื่องจากฉันไม่ต้องการรับที่อยู่ IP เพิ่มเติมจาก hetzner ฉันจึงปลอมแปลง IP นั้นสำหรับ VM-Network ภายใน:

auto vmbr0
iface vmbr0 inet static
    address 172.16.0.1/24
    bridge-ports none
    bridge-stp off
    bridge-fd 0

    post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up   iptables -t nat -A POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE

ด้วยเหตุนี้ VM ของฉันจึงสามารถเข้าถึงอินเทอร์เน็ตและสามารถติดต่อกันได้

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

ตอนนี้ฉันมีบริการที่ทำงานอยู่ใน VM ที่มี ip 172.16.0.3 บนพอร์ต 38080 เพื่อเข้าถึงบริการนี้ ฉันได้เพิ่มกฎการส่งต่อพอร์ตในไฟร์วอลล์: port=38080:proto=tcp:toport=38080:toaddr=172.16.0.3. โดยที่ฉันสามารถเข้าถึงบริการนั้นได้จากภายนอกเครื่องเซิร์ฟเวอร์นี้ ปัญหาตอนนี้คือ ถ้าฉันใช้ซอฟต์แวร์เช่น uptime-kuma และเรียกใช้ภายใน VM บนเครื่องเดียวกันด้วย ฉันไม่สามารถเข้าถึงบริการนั้นบนพอร์ต 38080 ได้เนื่องจากการส่งต่อพอร์ตทำได้สำหรับคำขอภายนอกเท่านั้น สิ่งสำคัญในที่นี้คือ ชื่อโฮสต์ที่ uptime-kuma ใช้คือ FQDN ที่ได้รับการแก้ไขเป็นที่อยู่ IP สาธารณะของเครื่องโฮสต์ของฉัน ดังนั้นเพื่อให้เป็นไปได้ ฉันได้เพิ่มกฎการส่งต่อพอร์ตเดียวกันไปยังโซนที่เชื่อถือได้ของ firewalld เนื่องจากอินเทอร์เฟซ vmbr0 ของฉันอยู่ในนั้น และจากอินเทอร์เฟซนั้นก็มีคำขอ ตอนนี้การเชื่อมต่อนี้ใช้งานได้และซอฟต์แวร์ของฉัน (uptime-kuma) สามารถเข้าถึงบริการของฉันได้

ปัญหาใหญ่ในตอนนี้คือ ทุกๆ คำขอจากภายในเครือข่ายเสมือนที่ต้องการใช้พอร์ต 38080 จะถูกเปลี่ยนเส้นทางไปยัง VM นั้น (172.16.0.3) แม้แต่คำขอที่ไปยังเซิร์ฟเวอร์ที่ต่างไปจากเดิมอย่างสิ้นเชิง

ฉันจะบอก firewalld ให้เปลี่ยนเส้นทางการรับส่งข้อมูลนั้นได้อย่างไรหากคำขอนั้นกำหนดเป้าหมายที่เครื่องโฮสต์จริง ๆ

answer

ดังนั้นฉันจึงไม่สามารถหาวิธีแก้ไขพฤติกรรมของไฟร์วอลล์ได้จริงๆ แต่ฉันพบอย่างอื่นที่ทำให้กฎการส่งต่อพอร์ตในโซนที่เชื่อถือได้ไม่จำเป็น โดยการเพิ่ม FQDN ซึ่งจะแก้ไขเป็น IP สาธารณะของโฮสต์ไปยังไฟล์ / etc / hosts ภายใน VM ฉันไม่ต้องการพอร์ตไปข้างหน้าอีกต่อไปเพราะมันเชื่อมต่อกับตัวเองอีกครั้งทันที (ซึ่งเป็นสิ่งที่ฉันต้องการตั้งแต่แรก) ไม่จำเป็นต้องใช้กฎการส่งต่อพอร์ตภายในโซนที่เชื่อถือได้อีกต่อไป และฉันสามารถใช้พอร์ตเหล่านั้นสำหรับคำขอภายนอกได้อีกครั้ง

ผู้ร่วมให้ข้อมูลใหม่
TheAnachronism is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.