ฉันมีเซิร์ฟเวอร์ที่มีการกำหนดค่า 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