Score:1

การกำหนด IP สาธารณะให้กับไคลเอนต์ OpenVPN iptables, route หรือใช้ทำอะไร?

ธง jp

ฉันมีเซิร์ฟเวอร์ที่มีการกำหนดค่า Pi-Hole เพื่อบล็อกโฆษณาและเครื่องมือติดตาม ลูกค้าเชื่อมต่อผ่าน OpenVPN และรับที่อยู่จาก 10.8.0.0/24 OpenVPN จะพุช DNS ไปยังไคลเอ็นต์เท่านั้น และทราฟฟิกจะถูกกำหนดเส้นทางผ่านโลคัลเกตเวย์ แต่แน่นอนว่าไคลเอ็นต์ทุกรายบน VPN สามารถติดต่อไคลเอ็นต์อื่น ๆ ทุกเครื่องผ่านที่อยู่ 10.8.0.x ของตนได้

ฉันได้สั่งซื้อ ipv4 ตัวที่สองซึ่งฉันต้องการใช้สำหรับไคลเอนต์ 10.8.0.4 โดยเฉพาะฉันต้องการเข้าถึง IP สาธารณะและเปิดเผยไคลเอนต์นั้นโดยตรงกับอินเทอร์เน็ตเพื่อใช้ Nextcloud ที่โฮสต์ในเครื่อง

ฉันค้นหา Server Fault และพบปัญหาที่คล้ายกัน ฉันพยายามเพิ่มกฎ POSTROUTING และ PREROUTING ให้กับ iptables แต่ไม่ได้ผล ขณะนี้ ipv4 ถูกเพิ่มชั่วคราวไปยัง eth0 ผ่าน 'ip addr เพิ่ม xx.xx.xx.xx dev eth0' ไม่ใช่ tun0 (ถูกต้องไหม) เซิร์ฟเวอร์ OpenVPN ได้รับการกำหนดค่าตรงตามที่กล่าวไว้ในเอกสาร Pi-Hole (https://docs.pi-hole.net/guides/vpn/openvpn/only-dns-via-vpn/). เปิดใช้งาน net.ipv4.ip_forward แล้ว

ฉันต้องใช้ iptables หรือไม่? เป็นไปได้หรือแนะนำให้เพิ่ม ip สาธารณะในเส้นทางหรืออะไร? ขออภัยหากคำถามดูงี่เง่า ฉันค่อนข้างใหม่กับการกำหนดค่า OpenVPN และ Route/iptables

นั่นคือสิ่งแรกที่ฉันลอง: เปลี่ยนเส้นทางการรับส่งข้อมูลขาเข้าทั้งหมดจาก IP สาธารณะรองไปยังที่อยู่ IP ภายในโดยใช้ iptables

กฎ iptables ปัจจุบันของฉันคือ:

# สร้างโดย xtables-save v1.8.2 ในวันพฤหัสบดีที่ 12 ธันวาคม 14:37:26 น. 2019
*แนท
: ยอมรับ [329:28209]
: ยอมรับอินพุต [281:25114]
:หลังยอมรับ [17:1423]
: ยอมรับเอาต์พุต [245:22126]
-A Postrouting -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-แหล่งที่มา xx.xx.xx.xx
-A โพสต์ -o eth0 -j MASQUERADE
ให้สัญญา
# เสร็จสิ้นเมื่อ พฤ ธ.ค. 55 14:37:26 น. 2562
# สร้างโดย xtables-save v1.8.2 ในวันพฤหัสบดีที่ 12 ธันวาคม 14:37:26 น. 2019
*กรอง
:อินพุตลดลง [0:0]
:ส่งต่อ ยอมรับ [0:0]
:เอาต์พุตยอมรับ [0:0]
-A อินพุต -i lo -j ยอมรับ
-A INPUT -m state --สถานะที่เกี่ยวข้อง,ESTABLISHED -j ACCEPT
-A อินพุต -i tun0 -j ยอมรับ
-อินพุต -i tun0 -p tcp -m tcp --dport 53 -j ยอมรับ
-A อินพุต -i tun0 -p udp -m udp --dport 53 -j ยอมรับ
-อินพุต -i tun0 -p tcp -m tcp --dport 80 -j ยอมรับ
-อินพุต -i eth0 -p tcp -m tcp --dport 80 -j ยอมรับ
-อินพุต -i tun0 -p tcp -m tcp --dport 443 -j ยอมรับ
-อินพุต -i eth0 -p tcp -m tcp --dport 443 -j ยอมรับ
-อินพุต -p tcp -m tcp --dport 2202 -j ยอมรับ
-อินพุต -p tcp -m tcp --dport 1194 -j ยอมรับ
-อินพุต -p udp -m udp --dport 1194 -j ยอมรับ
-A INPUT -p udp -m udp --dport 80 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 443 -j REJECT --reject-with icmp-port-unreachable
ให้สัญญา
# เสร็จสิ้นเมื่อ พฤ ธ.ค. 55 14:37:26 น. 2562

กฎ NAT ของ iptables:

ห่วงโซ่ PREROUTING (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง

เชนอินพุท (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง

ห่วงโซ่โพสต์ (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
SNAT ทั้งหมด -- 10.8.0.0/24 !10.8.0.0/24 ถึง:xx.xx.xx.xx
สวมหน้ากากทั้งหมด - ทุกที่ทุกที่

Chain OUTPUT (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง

หลังจากความคิดเห็นจาก NiKiZe ฉันได้เพิ่มที่อยู่ IP สาธารณะชั่วคราวผ่าน

ip addr เพิ่ม xx.xx.xx.xx dev eth0

และป้อนกฎทั้งสอง (เพื่อชี้แจงว่า: ฉันส่งออกชุดกฎการทำงานผ่าน iptables-save แก้ไขทั้งสองคำสั่งและกู้คืนผ่าน iptables-restore)

-A PREROUTING -d xx.xx.xx.xx -j DNAT --to-ปลายทาง 10.8.0.4
-A Postrouting -s 10.8.0.4 ! -d 10.8.0.4 -j SNAT --to-แหล่งที่มา xx.xx.xx.xx

จากนั้นฉันเปิดเทอร์มินัลหลายเซสชันและตรวจสอบทราฟฟิกเว็บด้วย tcpdump ที่เซิร์ฟเวอร์ OpenVPN และเซิร์ฟเวอร์ในเครื่องของฉัน ยืนยันว่าทราฟฟิกขาเข้าที่ eth0 ถึง pi.hole.http ถูกส่งไปยังเซิร์ฟเวอร์ในเครื่องของฉัน server.vpn.http อย่างถูกต้อง แต่คำตอบหมดเวลา...

กฎแนทปัจจุบันของฉันคือ:

user@dns:~# iptables -t nat -vL --line-numbers
CHAIN ​​PREROUTING (นโยบายยอมรับ 1 แพ็กเก็ต 52 ไบต์)
num pkts bytes target prot เลือกใช้ปลายทางต้นทาง
1 0 0 DNAT ทั้งหมด -- ใดๆ ที่ใดก็ได้ pi.hole ถึง:10.8.0.4

Chain INPUT (นโยบายยอมรับ 0 แพ็กเก็ต, 0 ไบต์)
num pkts bytes target prot เลือกใช้ปลายทางต้นทาง

Chain POSTROUTING (นโยบายยอมรับ 1 แพ็กเก็ต 60 ไบต์)
num pkts bytes target prot เลือกใช้ปลายทางต้นทาง
1 0 0 SNAT ทั้งหมด -- ใดๆ ก็ตาม server.vpn !server.vpn to:xx.xx.xx.xx <- เพิ่มที่อยู่ IP ชั่วคราว
2 0 0 SNAT ทั้งหมด -- ใด ๆ 10.8.0.0/24 !10.8.0.0/24 ถึง:xx.xx.xx.xx <- ที่อยู่ IP หลัก ป้อนแบบคงที่
3 0 0 MASQUERADE ทั้งหมด -- eth0 ใด ๆ ทุกที่

Chain OUTPUT (นโยบายยอมรับ 1 แพ็กเก็ต 60 ไบต์)
num pkts bytes target prot เลือกใช้ปลายทางต้นทาง

การแก้ไขอื่น: เมื่อฉันเพิ่ม 'src server.vpn' ใน tcpdump ฉันเห็นว่าไม่มีการรับส่งข้อมูลขาออกจากเซิร์ฟเวอร์ภายในเครื่อง ดังนั้นจึงต้องมีปัญหากับการกำหนดค่าเซิร์ฟเวอร์ภายในเครื่องหรือกฎการโพสต์เราต์ ฉันถูกไหม?

หลังจากเปลี่ยนเส้นทางบน server.vpn การเชื่อมต่อก็ใช้งานได้ 'เส้นทาง -n' ก่อน:

ตารางเส้นทางเคอร์เนล IP
เกตเวย์ปลายทาง Genmask ตั้งค่าสถานะการอ้างอิงเมตริก ใช้ Iface
0.0.0.0 192.168.178.1 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth3
169.254.160.0 169.254.160.1 255.255.248.0 UG 0 0 0 tun1000
169.254.160.0 0.0.0.0 255.255.248.0 คุณ 0 0 0 tun1000
172.17.0.0 0.0.0.0 255.255.0.0 คุณ 0 0 0 นักเทียบท่า 0
192.168.178.0 0.0.0.0 255.255.255.0 คุณ 0 0 0 eth0

และหลังจากนั้น:

ตารางเส้นทางเคอร์เนล IP
เกตเวย์ปลายทาง Genmask ตั้งค่าสถานะการอ้างอิงเมตริก ใช้ Iface
0.0.0.0 10.8.0.1 0.0.0.0 ยูจี 0 0 0 ตัน0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth3
169.254.160.0 169.254.160.1 255.255.248.0 UG 0 0 0 tun1000
169.254.160.0 0.0.0.0 255.255.248.0 คุณ 0 0 0 tun1000
172.17.0.0 0.0.0.0 255.255.0.0 คุณ 0 0 0 นักเทียบท่า 0
192.168.178.0 0.0.0.0 255.255.255.0 คุณ 0 0 0 eth0

ถ้าฉันเข้าใจถูกต้อง นั่นหมายความว่าทุกการเชื่อมต่อเครือข่าย แม้กระทั่งเริ่มต้นโดย server.vpn จะถูกส่งผ่าน VPN นี่ไม่ใช่พฤติกรรมที่คาดไว้ ฉันแค่ต้องการให้เซิร์ฟเวอร์เข้าถึงได้ภายในเครื่องและใช้อินเทอร์เน็ตปกติที่จัดเส้นทางในเครื่องและตอบรับการเชื่อมต่อที่ถูกกำหนดเส้นทางจาก IP สาธารณะบนเซิร์ฟเวอร์ OpenVPN

in flag
ต้องเพิ่ม IP สาธารณะในอินเทอร์เฟซเดียวกันกับที่เกตเวย์สำหรับที่อยู่นั้น ดังนั้นเป็นไปได้มากว่าอินเทอร์เฟซอินเทอร์เน็ต/eth0 ของคุณ (ทางเลือกอื่นคือการรับช่วงซึ่งกำหนดเส้นทางผ่าน IP สาธารณะของคุณ) "สิ่งแรกที่ฉัน พยายาม" ลิงก์คือสิ่งที่คุณต้องทำ แต่อาจมี gotchas อีกมากในระหว่างทาง tcpdump เป็นเครื่องมือที่ยอดเยี่ยมในการติดตามทราฟฟิก และพยายามทำความเข้าใจโฟลว์ ตัวนับใน iptables เป็นอีกหนึ่งเครื่องมือที่มักพลาดในการวินิจฉัยปัญหา
Thomson avatar
jp flag
ขอบคุณสำหรับคำแนะนำ ฉันได้ตรวจสอบอินเทอร์เฟซ tun0 ที่เซิร์ฟเวอร์ภายในเครื่องและเซิร์ฟเวอร์ OpenVPN แล้ว หลังจากเพิ่มกฎก่อนและหลังการกำหนดเส้นทางแล้ว ฉันสามารถดูผ่าน tcpdump การรับส่งข้อมูลที่เข้ามาที่เซิร์ฟเวอร์ภายใน แต่ไม่มีการตอบกลับ หมดเวลาแล้ว หมายความว่ากฎการเลื่อนเส้นทางของฉันผิดใช่หรือไม่
in flag
คุณจะต้องได้รับการเข้าชมที่จะไหลทั้งสองทาง ใช้ tcpdump ตรวจสอบว่าทราฟฟิกมาจากที่ใด และตรวจสอบว่าคุณมีเส้นทางที่รับทราฟฟิกนั้นกลับ
Thomson avatar
jp flag
ฉันคิดว่าฉันมีกฎ POSTROUTING บนเซิร์ฟเวอร์ OpenVPN แล้ว แต่เห็นได้ชัดว่า server.vpn ไม่ส่งคำตอบไปยังการตอบกลับ httpฉันตรวจสอบกับ tcpdump อีกครั้งและพบว่าการตอบกลับที่มาจากเซิร์ฟเวอร์ OpenVPN บน tun0 ได้รับคำตอบใน eth0 ดังนั้นผู้รับจึงทิ้งไป ฉันต้องเพิ่มกฎการกำหนดเส้นทางแบบคงที่ให้กับ server.vpn ด้วยหรือไม่ มี iptables ที่นั่น แต่จำเป็นต้องมีกฎอะไร ฉันจะแน่ใจได้อย่างไรว่าการรับส่งข้อมูลขาเข้าจาก tun0 ได้รับการตอบสนองโดยไม่เปลี่ยนเกตเวย์เริ่มต้น
in flag
ใช่ สิ่งนี้อาจลงเอยด้วยการตั้งค่า "หลายโฮมด์" ซึ่งหมายความว่าวิธีทั่วไปในการแก้ปัญหานี้คือการใช้ `ip rule` และ `ip route` เช่น https://serverfault.com/a/736047/187998 (คุณไม่จำเป็นต้องสร้างชื่อสำหรับตาราง แต่สามารถใช้ตัวเลขแทนได้)
Thomson avatar
jp flag
ขอขอบคุณสำหรับความช่วยเหลือของคุณ! ฉันทำให้มันใช้งานได้โดยตั้งค่าเซิร์ฟเวอร์ OpenVPN เป็นเกตเวย์ แต่ตอนนี้ยังไม่มีโชคในการตั้งค่า "multi homed" ขณะนี้ฉันกำลังอ่านเพิ่มเติมเกี่ยวกับการกำหนดค่าของ OpenVPN, iptables และการกำหนดเส้นทางโดยทั่วไป ฉันหวังว่าจะทำให้มันใช้งานได้

โพสต์คำตอบ

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