Score:0

Iptables การส่งต่อพอร์ตในขณะที่รักษา IP ไคลเอนต์

ธง fr

TL;DR: ฉันจะทำให้ไคลเอนต์ ip ที่เชื่อมต่อกับ VPS ที่โฮสต์ระยะไกลเป็น IP ที่ได้รับการส่งต่อ/แนทผ่าน iptables ไปยังเซิร์ฟเวอร์เกมที่ทำงานที่บ้านของฉันได้อย่างไร

ฉันมีเซิร์ฟเวอร์เกม Rust ที่ฉันโฮสต์อยู่ที่บ้าน ฉันต้องการให้เป็นสาธารณะ แต่ฉันไม่ต้องการให้ที่อยู่ IP ของฉันแก่ทุกคน ดังนั้นฉันจึงเช่า VPS ขนาดเล็กที่ตั้งใจจะใช้เป็น reverse proxy ขณะนี้ฉันใช้ nginx เพื่อส่งต่อทราฟฟิกผ่าน clinet-server VPN ซึ่งใช้งานได้ดี อย่างไรก็ตาม บนเซิร์ฟเวอร์เกม IP ของผู้เล่นทุกคนคือที่อยู่ทันเนลของ VPS ไม่ใช่ IP ไคลเอนต์จริง ฉันลองใช้ proxy_pass $remote_addr:28015 ความโปร่งใส; proxy_responses 0 ในการกำหนดค่า nginx ของฉันไม่มีการเปลี่ยนแปลง ดังนั้นฉันจึงเปลี่ยนไปทำผ่าน iptables

ฉันสามารถทำให้มันทำงานได้ 99% อย่างที่ฉันต้องการ ทำสิ่งนี้:

sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 28015 -j NAT --to-ปลายทาง my_ip:28015
iptables -t nat -A PREROUTING -p udp --dport 28015 -j NAT --to-ปลายทาง my_ip:28015
iptables -t nat -A PREROUTING -p tcp --dport 28016 -j NAT --to-ปลายทาง my_ip:28016
iptables -t nat -A PREROUTING -p udp --dport 28016 -j NAT --to-ปลายทาง my_ip:28016
iptables -t nat -A โพสต์ -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp -d my_ip --dport 28015 -m state --state ใหม่ ก่อตั้ง ที่เกี่ยวข้อง -j ยอมรับ
iptables -A FORWARD -p ucp -d my_ip --dport 28015 -m state --state NEW,ESTABLISHED,RELATED -j ยอมรับ
ufw ปิดการใช้งาน
ufw เปิดใช้งาน
รีบูต vps \

สิ่งนี้ทำโดยพื้นฐานแล้วเหมือนกับ nginx ซึ่งใช้งานได้ดี แต่ทุกคนมี ip สาธารณะของ VPS เท่านั้น (โปรดทราบว่า LAN และที่อยู่ ip สาธารณะของ VPS นั้นเหมือนกัน) ถ้าฉันละเว้นการสวมหน้ากาก มันจะไม่ทำงาน

ข้อมูลบางอย่างเกี่ยวกับการตั้งค่า:
VPS มีอินเทอร์เฟซเดียว: eth0
VPS กำลังทำงานอยู่ อูบุนตู 20.04
ที่บ้านของฉัน โมเด็มอยู่ในโหมด passthru ไปยัง pfsesneใน pfsense ฉันมีกฎการส่งต่อพอร์ตเพื่อส่ง 28015/28016 tcp/udp ไปที่ เซิร์ฟเวอร์เกม.

หมายเหตุด้านข้าง: ฉันไม่แน่ใจว่าทำไม nginx ไม่ทำงานสำหรับสิ่งนี้ มันเกือบจะเหมือนกับว่า nginx ไม่ได้ทำอะไรเลยกับ proxy_pass $remote_addr คำสั่ง

Score:0
ธง us

คุณไม่สามารถทำได้ด้วย IPTables เพื่อให้การส่งต่อแพ็กเก็ตแบบสองทิศทางทำงานได้อย่างถูกต้อง ที่อยู่ IP ต้นทางของแพ็กเก็ตที่ส่งจาก VPS ของคุณจะต้องมีที่อยู่ VPS มิฉะนั้นแพ็กเก็ตตอบกลับจะไม่ถูกส่งไปยัง VPS ซึ่งจะส่งต่อไปยังไคลเอนต์

คุณต้องรองรับโปรโตคอลเลเยอร์ 7 เพื่อส่งต่อที่อยู่ IP ดั้งเดิมไปยังแอปพลิเคชันของคุณ ใน HTTP / HTTPS ทำได้ดังนี้:

  1. nginx reverse proxy ทำงานบน VPS ของคุณ
  2. พร็อกซีย้อนกลับเพิ่มส่วนหัว X-ส่งต่อ-สำหรับ: <clientip> เพื่อขอให้ส่งไปยังเซิร์ฟเวอร์ต้นทาง
  3. เซิร์ฟเวอร์ต้นทางอ่านส่วนหัวและใช้เป็นที่อยู่ IP ของไคลเอนต์แทนที่จะใช้ที่อยู่ IP ที่เชื่อมโยงกับซ็อกเก็ต TCP

ความเป็นไปได้อีกอย่างคือการใช้พร็อกซี SOCKS ระหว่าง VPS และเซิร์ฟเวอร์ต้นทาง พร็อกซี SOCKS สรุปทราฟฟิกจากไคลเอ็นต์ และเพิ่มข้อมูลเมตาเพิ่มเติม เช่น ที่อยู่ IP ไคลเอนต์

AAron avatar
fr flag
เซิร์ฟเวอร์เกมเป็นทราฟฟิก UDP ทั้งหมด `X-Forwarded-For` ใช้ได้กับสตรีม UDP ด้วยหรือไม่
us flag
หากคุณมีโปรโตคอลเลเยอร์ 7 ที่ใช้งานซึ่งมี HTTP เช่นความหมายพร้อมส่วนหัวเป็นต้น ก็ใช่ แต่ถ้าคุณใช้โปรโตคอลแอปพลิเคชันที่กำหนดเองบน UDP โปรโตคอลนั้นจำเป็นต้องสนับสนุนกลไกนี้ และคุณต้องใช้พร็อกซีสำหรับโปรโตคอลนั้นด้วย เนื่องจากคุณพูดถึงการใช้ nginx `proxy_pass` ฉันถือว่าคุณใช้ HTTP like protocol
AAron avatar
fr flag
ฉันหมายความว่า เท่าที่ฉันรู้ว่ามันเป็น UDP มาตรฐานที่ลุ่ม สิ่งเดียวที่ฉันทำคือเปลี่ยนเส้นทางไปที่อื่นใน nginx.conf ของฉัน หลังจากวงเล็บปิดสำหรับบล็อกเซิร์ฟเวอร์เริ่มต้น ฉันมีสิ่งนี้: `สตรีม { เซิร์ฟเวอร์ { ฟัง 28015 udp; proxy_pass my_ip:28015; proxy_bind $remote_addr:$remote_port โปร่งใส; proxy_responses 0; } }`
us flag
ตกลงนั่นคือพร็อกซี bytestream ที่ nginx เสนอให้ นั่นคือแนวคิดรีเลย์เลเยอร์ 4 และไม่มีฟังก์ชันที่คุณต้องการ สำหรับฉันแล้ว ดูเหมือนว่าตัวเลือกเดียวของคุณคือเปลี่ยนไปทำงานผ่าน HTTP,/HTTPS หรือใช้ฟังก์ชันในโปรโตคอล UDP ของคุณที่อนุญาตให้พร็อกซีแบบกำหนดเองเพิ่ม IP ไคลเอ็นต์ไปยังข้อความโปรโตคอล คุณต้องใช้พร็อกซีที่กำหนดเองด้วย อย่างไรก็ตาม เนื่องจากนี่เป็นฟังก์ชันการทำงานทั่วไป จึงมีแนวโน้มว่าจะมีโปรโตคอลเฟรมเวิร์กที่มีฟังก์ชันนี้
AAron avatar
fr flag
nginx มีฟังก์ชันที่ฉันกำลังมองหาหรือไม่?
AAron avatar
fr flag
ฉันต้องการชี้แจงว่าฉันไม่ได้สร้างการใช้งานโปรโตคอลของตัวเอง ไม่ใช่เกมของฉัน แต่เป็นเพียงเกมที่มีตัวเลือกในการโฮสต์เซิร์ฟเวอร์เฉพาะด้วยตัวคุณเอง ดังนั้นหากไม่มีฟังก์ชันการทำงานใน UDP และ/หรือ nginx ที่มีโมดูลอย่างน้อยหนึ่งโมดูลที่คอมไพล์แล้ว ก็จะเป็นไปไม่ได้อย่างมีประสิทธิภาพ
us flag
โปรโตคอลแอปพลิเคชันจำเป็นต้องรองรับการทำงาน nginx ican ทำหน้าที่เป็น bytestream proxy เท่านั้น ไม่สามารถใช้ฟังก์ชันพิเศษเช่นนี้ได้
AAron avatar
fr flag
เอาล่ะ ดูเหมือนว่าฉันจะจัดการกับ IP ที่เหมือนกันและจัดการกับการแบนตาม IP บน VPS หรือเพียงแค่กัดกระสุนและโฮสต์สิ่งทั้งหมดใน VPS ระยะไกล ฉันมีตัวเลือกในการทำอุโมงค์ข้อมูล VPN จาก vps ไปยังเซิร์ฟเวอร์เกม หากนั่นสร้างความแตกต่าง ความโปร่งใสของ IP เป็นไปไม่ได้ *เลย* กับ iptables หรือไม่ในกรณีการใช้งานของฉัน ฉันมีบทความสั้น ๆ ที่กล่าวถึงการทำสิ่งต่าง ๆ เช่น การมีกฎการส่งต่อที่ปลายทั้งสองด้าน แต่ค่อนข้างเคลือบมันเพราะฉันไม่คิดว่าจะนำไปใช้ ฉันมาถึงจุดที่น้ำผลไม้ไม่คุ้มค่าที่จะบีบอย่างแน่นอน
us flag
IPTables ทำงานบนเลเยอร์ 3 และเลเยอร์ 4 ของสแต็กเครือข่ายเท่านั้น และไม่มีกลไกใดที่จะมีความโปร่งใสของที่อยู่ IP ที่คุณต้องการ ชั้นแอปพลิเคชันจำเป็นต้องใช้คุณสมบัตินี้ อุโมงค์ VPN อาจไม่ช่วยเช่นกัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา