ฉันมีเซิร์ฟเวอร์ minecraft ที่ทำงานบน VPS (Debian 10) แต่ VPS นั้นอ่อนแอเกินไปที่จะจัดการมัน ดังนั้นฉันจึงต้องการใช้เซิร์ฟเวอร์ภายในที่แข็งแรงกว่าเพื่อเรียกใช้ (Ubuntu 22.04) VPS กำลังโฮสต์เซิร์ฟเวอร์ OpenVPN และเซิร์ฟเวอร์ภายในเชื่อมต่อเป็นไคลเอนต์เดียว VPS อยู่ที่ 10.8.0.1 และเซิร์ฟเวอร์ภายในอยู่ที่ 10.8.0.6 (192.168.1.185 บนเครือข่ายท้องถิ่น)
ฉันใช้กฎ iptables เพื่อส่งต่อแพ็กเก็ต tun0 VPN ที่ 10.8.0.6:25565 ไปยัง IP ของเซิร์ฟเวอร์ในเครื่อง วิธีนี้ใช้ได้ดี: ฉันสามารถสอบถามเซิร์ฟเวอร์ minecraft จาก VPS จากนั้นฉันก็ตั้งกฎชุดเดียวกัน (แน่นอนว่า IP ที่เกี่ยวข้องถูกสลับ) บน VPS เพื่อส่งต่อการเชื่อมต่อจาก vps_external_ip:25565 ไปยัง 10.8.0.6:25565 กฎนี้กำลังส่งต่อแพ็คเก็ตไปยังเซิร์ฟเวอร์ภายในเครื่อง แต่การเชื่อมต่อจะหมดเวลาเสมอ สิ่งที่แปลกคือไม่มีการเชื่อมต่อที่ใช้งานได้จาก VPS -> เซิร์ฟเวอร์ภายในหรือภายนอก -> VPS -> เซิร์ฟเวอร์ภายในที่เพิ่มตัวนับแพ็กเก็ตของกฎ POSTROUTING MASQUERADE ใดๆ แต่ทำเพื่อกฎ PREROUTING มีการเชื่อมต่อ TCP/UDP หมดเวลาเมื่อกด VPS บน eth0:25565 ไม่มีข้อผิดพลาดปฏิเสธการเชื่อมต่อ
เปิดใช้งานการส่งต่อ IPV4 ทั้งสองเครื่องและฉันได้ลองใช้โดยปิดใช้งาน UFW แล้วไม่มีโชค
ฉันตั้งค่ากฎการบันทึกบน NAT POSTROUTE ของเซิร์ฟเวอร์ทั้งสอง แต่ฉันไม่แน่ใจว่าจะแก้ไขปัญหานี้ได้อย่างไรเนื่องจากไม่พบเลย
เอาต์พุตบันทึก POSTROUTE (iptables -t nat -I POSTROUTING -j LOG --log-prefix "NAT:" --log-level 7)
##### วีพีเอส
23 เม.ย. 20:52:02 น. vpskernel: [1552376.122382] NAT1:IN= OUT=tun0 SRC=<my ip> DST=10.8.0.6 LEN=48 TOS=0x08 PREC=0x20 TTL=114 ID=21284 DF PROTO=TCP SPT =1806 DPT=25565 WINDOW=64240 RES=0x00 SYN URGP=0
#### เซิร์ฟเวอร์ท้องถิ่น
<ไม่พบบันทึกที่เกี่ยวข้อง grepping /var/log/kern.log สำหรับ NAT1 และไม่มีบันทึกสำหรับ tun0 เลย>
ฉันใช้ /etc/ufw/before.rules สำหรับแต่ละเซิร์ฟเวอร์เพื่อตั้งค่ากฎ iptables
VPS /etc/ufw/before.rules:
# เริ่มกฎ OPENVPN
# กฎตาราง NAT
*แนท
: ยอมรับ [0:0]
:หลังยอมรับ [0:0]
# อนุญาตการรับส่งข้อมูลจากไคลเอนต์ OpenVPN ไปยัง eth0
-A โพสต์ -s 10.8.0.0/8 -o eth0 -j MASQUERADE
# สิ้นสุดกฎของ OpenVPN
-A PREROUTING -i eth0 -d <vps external IP> -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A PREROUTING -i eth0 -d <vps external IP> -p udp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A โพสต์ -s 10.0.0.0/8 ! -d 10.0.0.0/8 -j สวมหน้ากาก
ให้สัญญา
โลคัลเซิร์ฟเวอร์ /etc/ufw/before.rules:
*แนท
: ยอมรับ [0:0]
:หลังยอมรับ [0:0]
-A PREROUTING -i tun0 -d 10.8.0.6 -p tcp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
-A PREROUTING -i tun0 -d 10.8.0.6 -p udp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
#กำหนดเส้นทาง
-A Postrouting -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j สวมหน้ากาก
ให้สัญญา
กฎของ PREROUTING กำลังทำงาน แต่ตัวนับกฎของ POSTROUTING จะไม่เพิ่มขึ้น
ฉันรัน tcpdump บน 25565 เพื่อดีบัก ฉันเห็นแพ็กเก็ตเข้ามา แต่ฉันไม่เห็นการส่งคืนอินเทอร์เฟซใดๆ เมื่อเชื่อมต่อภายนอก เมื่อทำการสอบถามโดยตรงจาก VPS ฉันเห็นเซิร์ฟเวอร์ภายในตอบกลับใน tun0 ดูเหมือนว่าปัญหาคือเซิร์ฟเวอร์ภายในเครื่องพยายามตอบกลับโดยตรงไปยัง IP ของฉันบน en01 แทนที่จะเป็น VPS บน tun0 แต่ฉันไม่แน่ใจว่าจะแก้ไขอย่างไร
VPS tcpdump:
# จริยธรรม 0
21:43:39.972647 IP my_ip.2729 > vps_ip.25565: ค่าสถานะ [S], seq 1483515507, ชนะ 64240, ตัวเลือก [mss 1460,nop,nop,sackOK], ความยาว 0
#tun0
21:43:39.972739 IP my_ip.2729 > 10.8.0.6.25565: ค่าสถานะ [S], seq 1483515507, ชนะ 64240, ตัวเลือก [mss 1460,nop,nop,sackOK], ความยาว 0
เซิร์ฟเวอร์ท้องถิ่น tcpdump:
#ทูน0
21:43:39.972566 IP my_ip.2729 > 10.8.0.6.25565: ค่าสถานะ [S], seq 1483515507, ชนะ 64240, ตัวเลือก [mss 1356,nop,nop,sackOK], ความยาว 0
#en01
21:43:39.972618 IP 10.8.0.6.25565 > my_ip.2729: ค่าสถานะ [S.], seq 2141764446, ack 1483515508, ชนะ 64240, ตัวเลือก [mss 1460,nop,nop,sackOK], ความยาว 0