OpenVPN บนเครือข่ายท้องถิ่น


0

ฉันได้ติดตั้ง OpenVPN บน Raspberry PI (เซิร์ฟเวอร์: 192.168.0.2) และบนแล็ปท็อป Ubuntu ของฉัน (ไคลเอนต์: 192.168.0.3) เครื่องทั้งสองเชื่อมต่อกับเครือข่ายไร้สายเดียวกันและมีที่อยู่ที่กำหนดโดย DHCP จากเราเตอร์ไร้สายที่ 192.168.0.1 อย่างไรก็ตามเมื่อ VPN เริ่มต้นฉันไม่สามารถเข้าถึงอินเทอร์เน็ตจากไคลเอนต์ได้

เมื่อฉันเริ่ม OpenVPN บนเซิร์ฟเวอร์ (ด้วยตัวเลือกต่อไปนี้) ดูเหมือนว่าจะเริ่มต้นอย่างถูกต้อง

port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
cipher AES-256-CBC
auth SHA512
topology subnet
server 10.8.0.0 255.255.255.0
push "dhcp-option DNS 8.8.8.8"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

เมื่อฉันเริ่ม OpenVPN บนไคลเอนต์ (ด้วยตัวเลือกต่อไปนี้) มันก็ดูเหมือนจะเริ่มต้นอย่างถูกต้อง

ca keys/ca.crt
cert keys/client-no-pass.crt
key keys/client-no-pass.key
remote 192.168.0.2 1194
comp-lzo
client
dev tun
redirect-gateway local
remote-cert-tls server
cipher AES-256-CBC
auth SHA512
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
mute 20

บนไคลเอนต์ฉันจะเห็นว่าตารางการกำหนดเส้นทาง IP ของฉันได้รับการจัดการให้ใช้ที่อยู่ IP ของเซิร์ฟเวอร์ VPN เป็นเส้นทางเริ่มต้นและการรับส่งข้อมูลทั้งหมดไปยังเครือข่าย VPN จะถูกจัดหาด้วยที่อยู่ IP ของ tun0 เท่ากับ 10.8.0.4

me@client:~$ ip route
default via 10.8.0.1 dev tun0 
10.8.0.0/24 dev tun0  proto kernel  scope link  src 10.8.0.4 
169.254.0.0/16 dev wlp4s0  scope link  metric 1000 
192.168.0.0/24 dev wlp4s0  proto kernel  scope link  src 192.168.0.3 metric 600

เมื่อ VPN ถูกตัดการเชื่อมต่อฉันสามารถ ping 8.8.8.8 (เซิร์ฟเวอร์ DNS) เมื่อเชื่อมต่อ VPN ฉันไม่สามารถทำได้

หลังจากค้นหา Google ฉันพยายามเพิ่มสิ่งนี้บนเซิร์ฟเวอร์ แต่ไม่ช่วย:

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j SNAT --to-source 192.168.0.2

ผมทำอะไรผิดหรือเปล่า? ฉันจะแก้ไขได้อย่างไร สถานการณ์ WLAN VPN ในพื้นที่ของฉันไม่รองรับหรือไม่ ฉันได้ลองใช้ Wireshark เพื่อรับปริมาณการใช้งาน tun0 จากลูกค้า แต่ไม่สามารถแก้ไขปัญหาได้

แก้ไข: ข้อมูลเพิ่มเติม :

  1. ที่อยู่ IP ของเซิร์ฟเวอร์คือ "สงวน" (ตามที่อยู่ MAC) เพื่อให้เราเตอร์กำหนดที่อยู่เดียวกันเสมอ 192.168.0.2

  2. เซิร์ฟเวอร์ได้รับการกำหนดค่า (โดยวิธีการแก้ไข/etc/sysctl.conf) เพื่อส่งต่อแพ็กเก็ต IPV4 และสิ่งนี้ได้รับการทดสอบโดยการรันcat /proc/sys/net/ipv4/ip_forward(ส่งคืน 1)

  3. ตารางการเราต์เซิร์ฟเวอร์แสดงสิ่งนี้:

me @ server: ~ $ ip เส้นทาง
เริ่มต้นผ่าน 192.168.0.1 dev wlan0 เมตริก 303
10.8.0.0/24 dev tun0 proto เคอร์เนลขอบเขตลิงก์ src 10.8.0.1
192.168.0.0/24 dev wlan0 การเชื่อมโยงขอบเขตเคอร์เนลโปรโต src 192.168.0.2 เมตริก 303
  1. ไฟร์วอลล์ของเซิร์ฟเวอร์มีลักษณะดังนี้:
ฉัน @ เซิร์ฟเวอร์: ~ $ sudo iptables -S
-P ยอมรับการยอมรับ
-P ไปข้างหน้ายอมรับ
-P OUTPUT ACCEPT
-A ไปข้างหน้า -m conntrack - สถานะที่เกี่ยวข้องก่อตั้งขึ้น -j ยอมรับ
-A ไปข้างหน้า -s 10.8.0.0/24 -i tun0 -o wlan0 -m conntrack - รัฐใหม่ -j ยอมรับ

me @ server: ~ $ sudo iptables -t nat -S
การยอมรับ PR-P
-P ยอมรับการยอมรับ
-P OUTPUT ACCEPT
ยอมรับการโพสต์ -P
-A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j MASQUERADE

นอกเหนือจากคำถามทางเทคนิคที่ถูกต้องที่คุณถาม เป้าหมายสุดท้ายของคุณที่นี่คืออะไร? เห็นได้ชัดว่าหากทั้งสองเครื่องเชื่อมต่อกับเครือข่ายเดียวกันไม่จำเป็นต้องมีช่องสัญญาณ VPN ระหว่างทั้งสองเครื่อง นี่เป็นเพียงการทดสอบหรือไม่
Appleoddity

ใช่ฉันแค่พยายามทดสอบ OpenVPN บน LAN ของฉัน ฉันเข้าใจว่าไม่จำเป็นต้องใช้ VPN ในสถานการณ์นี้ แต่ฉันก็เริ่มคิดว่ามันเป็นไปไม่ได้ที่จะเรียกใช้ VPN เมื่อทั้งเซิร์ฟเวอร์และไคลเอนต์อยู่ในเครือข่ายเดียวกัน
Jono

ฉันไม่แน่ใจว่าเป็นเหตุผลหรือไม่ แต่โดยปกติแล้วการตั้งค่า NAT กับ iptables จะใช้-j MASQUERADEในกฎ POSTROUTING
Nathan.Eilisha Shiraini

นาธานตามคำแนะนำของเลียมฉันได้แก้ไข iptables เพื่อใช้ MASQUERADE (ดังที่แสดงในการแก้ไขล่าสุดของคำถาม) แต่ก็ยังไม่สามารถแก้ไขปัญหาได้
Jono

คำตอบ:


1

คุณต้องยืนยันว่าทั้งเส้นทางและการแปลที่อยู่เครือข่าย (NAT) ทำงานอย่างถูกต้องบนเซิร์ฟเวอร์ VPN ของคุณ ลองใช้tcpdumpเพื่อตรวจสอบทราฟฟิกเครือข่ายบนอินเทอร์เฟซ VPN ของเซิร์ฟเวอร์และพอร์ตอีเธอร์เน็ตเพื่อให้แน่ใจว่าแพ็กเก็ตนั้นต่อเนื่องและที่อยู่ของมันคืออะไร เพื่อตอบความคิดเห็นของคุณว่าการออกแบบนี้สามารถทำได้หรือไม่และเป็นวิธีที่ดีในการเรียนรู้เกี่ยวกับแนวคิดทั้งหมดที่เกี่ยวข้อง

นี่คือคำแนะนำที่ดีเกี่ยวกับNAT กับ Linuxและอื่น ๆ อีกมากมายก็มีให้เช่นกัน สิ่งสำคัญในการตรวจสอบว่าระบบของคุณได้รับการกำหนดค่าอย่างถูกต้องสำหรับการกำหนดเส้นทางหรือไม่ - โดยค่าเริ่มต้นมันอาจถูกปิด ถ้า

cat /proc/sys/net/ipv4/ip_forward

ส่งกลับค่าศูนย์จากนั้นจะปิดและไม่มีกฎไฟร์วอลล์จะช่วยคุณ คุณสามารถเรียกใช้echo 1 > /proc/sys/net/ipv4/ip_forwardเพื่อเปิดใช้งานได้ แต่ให้ดูที่คู่มือทั้งหมดเพื่อทำตามขั้นตอนที่จำเป็นทั้งหมดรวมถึงคำแนะนำสำหรับการเปลี่ยนแปลงนี้อย่างถาวร (จะหายไปทุกครั้งที่คุณเริ่มระบบใหม่)

นอกจากนี้หากคุณใช้ DHCP สำหรับเซิร์ฟเวอร์ VPN คุณอาจต้องการใช้ MASQUERADE แทน SNAT เนื่องจากที่อยู่ IP อาจเปลี่ยนแปลงและกฎไฟร์วอลล์ของคุณจะไม่ถูกต้อง

โปรดทราบว่าหากคุณไม่ต้องการใช้ NAT คุณจะต้องแจ้งให้เราเตอร์ในพื้นที่ของคุณ (ที่เสียบเข้ากับ ISP ของคุณ) ทราบว่า VPN subnet (10.8.0.0/24) ของคุณอยู่หลังที่อยู่ IP ของเซิร์ฟเวอร์ VPN (192.168) 0.2) ตอนนี้มันไม่มีความคิดวิธีการหา 10.8.0.4 ดังนั้นจะทิ้งแพ็คเก็ตตอบกลับ

อีกครั้งหากที่อยู่ของเซิร์ฟเวอร์ได้รับมอบหมายจาก DHCP สิ่งนี้อาจเปลี่ยนแปลงได้และคุณจะต้องอัปเดตรายการเส้นทางและคุณอาจไม่สามารถเพิ่มเส้นทางนี้ได้หากคุณใช้เราเตอร์ของ ISP และพวกเขาไม่อนุญาตให้คุณจัดการ อุปกรณ์ของพวกเขา


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

1
ฉันพบลิงค์นี้เป็นประโยชน์อย่างมากcommunity.openvpn.net/openvpn/wiki/BridgingAndRoutingเนื่องจากมีคำสั่งให้ฉันในรายการ FORWARD ที่ถูกต้องที่จะเพิ่มลงในเซิร์ฟเวอร์ VPN
Jono
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.