OpenVPN ไคลเอนต์ต่อไคลเอนต์


18

เมื่อใช้เซิร์ฟเวอร์ OpenVPN ของ TUN (เลเยอร์ 3) ที่client-to-clientปิดใช้งานไคลเอ็นต์ของฉันยังคงสามารถพูดคุยกันได้

การกำหนดค่าไคลเอนต์ต่อไคลเอ็นต์ควรป้องกันสิ่งนี้ตามเอกสารประกอบ:

ยกเลิกข้อคิดเห็นออกคำสั่งแบบ client-to-client หากคุณต้องการเชื่อมต่อลูกค้าเพื่อให้สามารถเข้าถึงซึ่งกันและกันผ่าน VPN โดยค่าเริ่มต้นลูกค้าจะสามารถเข้าถึงเซิร์ฟเวอร์เท่านั้น

ทำไมลูกค้าถึงสามารถสื่อสารกันได้เมื่อปิดการใช้งานตัวเลือกนี้

นี่คือเซิร์ฟเวอร์ของฉัน conf:

port 443
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh4096.pem
topology subnet
server 10.10.201.0 255.255.255.128
ifconfig-pool-persist ipp.txt
crl-verify /etc/openvpn/keys/crl.pem
push "route [omitted]"
push "dhcp-option DNS [omitted]"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
cipher AES-256-CBC
tls-auth /etc/openvpn/keys/pfs.key 0
verb 4

คำตอบ:


56

หากclient-to-clientมีการเปิดใช้งานแพ็คเก็ตเซิร์ฟเวอร์ VPN ส่งต่อไคลเอนต์กับลูกค้าภายในโดยไม่ต้องส่งพวกเขาไปยังชั้น IP ของโฮสต์ (เช่นการ kernel) สแต็กเครือข่ายโฮสต์ไม่เห็นแพ็กเก็ตเหล่านั้นเลย

           .-------------------.
           | IP Layer          |
           '-------------------'


           .-------------------.
           | TUN device (tun0) |
           '-------------------'


           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  2   
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

ถ้าclient-to-clientเป็นคนพิการแพ็คเก็ตจากลูกค้าไปยังลูกค้าอีกไปถึงชั้น IP โฮสต์ (iptables, เส้นทางตาราง ฯลฯ ) ของเครื่องโฮสติ้งเซิร์ฟเวอร์ VPN: ถ้าการส่งต่อ IP ถูกเปิดใช้งานพิธีกรอาจส่งแพ็กเก็ต (โดยใช้มัน ตารางเส้นทาง) อีกครั้งไปยังอินเตอร์เฟส TUN และ VPN daemon จะส่งต่อแพ็กเก็ตไปยังไคลเอ็นต์ที่ถูกต้องภายในช่องสัญญาณ

           .-------------------.
           | IP Layer          |  (4) routing, firewall, NAT, etc.
           '-------------------'      (iptables, nftables, conntrack, tc, etc.)
              ^          |
          3   |          |  5
              |          v
           .-------------------.
           | TUN device (tun0) |
           '-------------------'
             ^           |
          2  |           |  6  
             |           v
           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  7  
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

ในกรณีนี้ ( client-to-clientปิดใช้งาน) คุณสามารถปิดกั้นแพ็กเก็ตไคลเอ็นต์ต่อไคลเอ็นต์โดยใช้ iptables:

 iptables -A FORWARD -i tun0 -o tun0 -j DROP

tun0อินเตอร์เฟส VPN ของคุณอยู่ที่ไหน


ทำเครื่องหมายว่านี่เป็นคำตอบ; กระชับยังให้ข้อมูลอย่างมากและให้กฎไฟร์วอลล์ iptables ในคำตอบ
lobi

1
ฉันมีคำถามเกี่ยวกับแผนภาพคุณวาดมันด้วยถ่านและพื้นที่โดยช่องว่าง? หรือคุณใช้แอพใด ๆ เพื่อช่วยให้คุณได้รับสิ่งนั้นอย่างง่ายและรวดเร็ว?
Mohammed Noureldin

3
@MohammedNoureldin ฉันสร้างไดอะแกรมดั้งเดิมด้วย asciio ( search.cpan.org/dist/App-Asciio ) ซึ่งเป็นโปรแกรมแก้ไขจุดและคลิก WYSWYG สำหรับไดอะแกรม asciiart
ysdx

ขอบคุณคุณจัดการเพื่อเรียกใช้บน windows? ดูเหมือนว่าจะเป็นแอพจากยุคกลางและฉันไม่สามารถเรียกใช้บน windows ได้ฉันพยายามติดตั้งด้วยแพ็คเกจ camelbox แต่ฉันได้รับข้อผิดพลาด 404 เสมอ
Mohammed Noureldin

2
@MohammedNoureldin ฉันไม่ได้ใช้ Windows ฉันใช้ Debian และสามารถติดตั้งได้จากแพคเกจอย่างมาก
ysdx

7

คุณต้องทำมากกว่าแค่แสดงความคิดเห็นคำสั่งตามที่กล่าวไว้ที่นี่ :

Uncomment คำสั่งนี้เพื่อให้ลูกค้าที่แตกต่างกันสามารถ "ดู" ซึ่งกันและกัน โดยค่าเริ่มต้นลูกค้าจะเห็นเฉพาะเซิร์ฟเวอร์ หากต้องการบังคับให้ไคลเอ็นต์เห็นเฉพาะเซิร์ฟเวอร์คุณจะต้องไฟร์วอลล์ไฟร์วอลล์ของอินเตอร์เฟส TUN / TAP อย่างเหมาะสม

ดังนั้นคุณอาจกำหนดค่านโยบายที่อยู่ IP แยกต่างหากสำหรับลูกค้าแต่ละราย ดูในส่วนการกำหนดค่ากฎลูกค้าที่เฉพาะเจาะจงและนโยบายการเข้าถึงที่นี่: https://openvpn.net/index.php/open-source/documentation/howto.html และนี่: https://www.sbarjatiya.com/notes_wiki/index.php/Configuring_separate_IP_and_firewall_rule_for_each_openvpn_client


จากนั้นนี่หมายถึงสิ่งที่ฉันคิด: วิธีเดียวที่จะบรรลุเป้าหมายนี้คือการทำให้ลูกค้าแต่ละรายบนเครือข่ายย่อยที่แตกต่างกัน ส่วนใหญ่จะตอบคำถามรวมทั้งคุณได้ให้เอกสารเกี่ยวกับวิธีการทำเช่นนั้น ฉันจะทำเครื่องหมายลงเป็นคำตอบ ขอบคุณ
lobi

6

ย่อหน้าถัดไปของ man page สำหรับopenvpnคำตอบของคำถามนี้แม้ว่ามันจะไม่ชัดเจนในตอนแรกที่อ่าน:

เนื่องจากโหมดเซิร์ฟเวอร์ OpenVPN จัดการกับไคลเอนต์หลายตัวผ่านทาง tun หรือ tap interface แบบเดียวจึงเป็นเราเตอร์ที่มีประสิทธิภาพ การ --client-to-client ตั้งค่าสถานะบอก OpenVPN เพื่อจัดเส้นทางทราฟฟิกไคลเอ็นต์กับไคลเอ็นต์ภายในแทนที่จะผลักดันทราฟฟิกที่มาจากไคลเอ็นต์ทั้งหมดไปยังอินเตอร์เฟส TUN / TAP

เมื่อใช้ตัวเลือกนี้ลูกค้าแต่ละรายจะ "เห็น" ไคลเอ็นต์อื่นที่เชื่อมต่ออยู่ในปัจจุบัน มิฉะนั้นลูกค้าแต่ละรายจะเห็นเฉพาะเซิร์ฟเวอร์ อย่าใช้ตัวเลือกนี้หากคุณต้องการไฟร์วอลล์ทราฟฟิกทราฟฟิคโดยใช้กฎที่กำหนดเองสำหรับแต่ละไคลเอ็นต์

client-to-clientตัวเลือกสั้นวงจรตารางเส้นทางปกติบนเซิร์ฟเวอร์ การลบจะไม่ป้องกันไคลเอ็นต์โดยใช้ตารางการเราต์ของเซิร์ฟเวอร์ หากตารางเส้นทางเหล่านั้น - และการกำหนดค่าไฟร์วอลล์ของเซิร์ฟเวอร์ - อนุญาตให้ไคลเอนต์เห็นซึ่งกันและกันพวกเขาจะสามารถทำได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.