ฉันมีโฮสต์สองสามตัวที่อยู่เบื้องหลังเราเตอร์ NAT ที่ฉันต้องการเข้าถึงผ่าน VPN ของ Wireguard ฉันสามารถกำหนดค่าเครือข่ายส่วนตัวได้สำเร็จ แต่ก็ยังมีบางอย่างที่ทำให้ฉันงุนงง

ฉันต้องการให้เพื่อนแต่ละคน:

  • เข้าถึงซึ่งกันและกัน ( 172.9.9.*) ผ่าน VPN (ผ่านwg0)
  • เข้าถึงทุกโฮสต์อื่นนอก VPN (ผ่านeth0)

นี่คือสคีมาของเครือข่ายและการกำหนดค่าปัจจุบัน:

┌─────┐    ┌──────────┐    ┌─────┐
│  S  ├────┤ Internet ├────┤  A  │
└─────┘    └───┬──────┘    └─────┘
               │
               │
          ┌────┴─────┐
          │ NAT DHCP │
       ┌──┤  Router  ├──┐
       │  └──────────┘  │
       │                │
    ┌──┴──┐          ┌──┴──┐
    │  X  │          │  B  │
    └─────┘          └─────┘
  • S เป็นเซิร์ฟเวอร์ VPN และสามารถเข้าถึงได้บนอินเทอร์เน็ตผ่าน IP แบบคงที่
  • X เป็น "เซิร์ฟเวอร์คอมพิวเตอร์" สามารถเข้าถึงอินเทอร์เน็ตได้ แต่อยู่เบื้องหลัง NAT และ IP เป็นไดนามิกและไม่ทราบล่วงหน้า
  • Aเป็น "ไคลเอนต์ระยะไกล" ที่ต้องการเชื่อมต่อกับX;
  • Bเป็น "ไคลเอ็นต์ท้องถิ่น" ที่ต้องการเชื่อมต่อXและอยู่ในเครือข่ายท้องถิ่นเดียวกัน

ฉันต้องการสิ่งนั้นAและBสามารถเชื่อมต่อXผ่านSแต่โฮสต์ทั้งหมดเหล่านี้ควรใช้ VPN เมื่อติดต่อกันเท่านั้นไม่ใช่เมื่อเข้าถึงอินเทอร์เน็ต

ตัวอย่างเช่นAสามารถ ping google.com ได้โดยตรง แต่จะ ping Xผ่านS.

หลังจากค้นหาและอ่านเอกสารแล้ว ฉันยังไม่ชัดเจนว่าฉันสามารถทำได้โดยไม่ใช้หรือไม่iptablesและสามารถทำได้โดยใช้การกำหนดค่า Wireguard เท่านั้น

การกำหนดค่าปัจจุบันมีดังต่อไปนี้:

## S wg0.conf

[Interface]
PrivateKey = S-private-key
Address = 172.9.9.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
# A wg0.conf

[Interface]
Address = 172.9.9.100/24
PrivateKey = A-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0

Bการกำหนดค่าของคล้ายกับAแต่มี IP 172.9.9.101และคีย์ส่วนตัวต่างกัน

# X wg0.conf

[Interface]
Address = 172.9.9.10/24
PrivateKey = X-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25  # To keep the server reachable

การกำหนดค่านี้ใช้งานได้และโฮสต์ทั้งหมดสามารถเข้าถึงได้ผ่าน VPN แต่ฉันต้องการให้เฉพาะการรับส่งข้อมูลที่ส่งไปยังโฮสต์เท่านั้นที่172.9.9.*จะผ่าน VPN นี้ การรับส่งข้อมูลอื่นๆ จะถูกกำหนดเส้นทางโดยเกตเวย์เริ่มต้น

สิ่งที่ทำให้ฉันงงคือถ้าฉันเปลี่ยนการกำหนดค่าAเพื่อที่

AllowedIPs = 172.9.9.0/24

ดังนั้น สำหรับAแพ็คเกจจะถูกส่งไปตามที่ตั้งใจไว้ (เช่น ฉันสามารถcurl ifconfig.meและรับAIP สาธารณะของได้) แต่ถ้าฉันทำเช่นเดียวกันกับXมันจะไม่ทำงานและแพ็คเกจที่จะไม่ส่งไป172.9.9.0/24จะไม่สำเร็จ

แก้ไข#1

ลืมบอกไปว่าฉันยังอยากจะรักถ้าเมื่อเชื่อมต่อกับXลูกค้าในท้องถิ่นเช่นBจะไม่ส่งแพคเกจภายนอกเครือข่ายท้องถิ่นเพื่อให้และไม่ได้B -> Router -> XB -> Router -> S -> Router -> X

answer

ตั้งค่าAllowedIPsเป็นที่อยู่ IP ที่คุณต้องการกำหนดเส้นทางไปยัง/ผ่านเพียร์

ในการกำหนดค่า hub-and-spoke ปกติ บนฮับ (S) คุณจะต้องกำหนดค่าAllowedIPsสำหรับแต่ละเพียร์เหมือนที่คุณมี กำหนดเส้นทางแพ็กเก็ตไปยังแต่ละเพียร์ก็ต่อเมื่อพวกเขาใช้ที่อยู่ IP WireGuard ของเพียร์เป็นที่อยู่ปลายทาง และบนซี่ล้อของคุณ (A, B และ X) คุณจะต้องกำหนดค่าAllowedIPsCIDR ของเครือข่าย WireGuard ( 172.9.9.0/24) กำหนดเส้นทางแพ็กเก็ตไปยังฮับก็ต่อเมื่อพวกเขาใช้ที่อยู่ IP WireGuard ของเพียร์อื่นเป็นที่อยู่ปลายทาง

ด้วยการกำหนดค่าปกติ คุณจะเข้าถึง A จาก B หรือ X ด้วยที่อยู่ IP WireGuard ของ A 172.9.9.100, B จาก A หรือ X ด้วย172.9.9.101และ X จาก A หรือ B ด้วย172.9.9.10.

แต่ถ้าคุณต้องการเข้าถึงซี่ล้อแต่ละอันผ่านที่อยู่ IP ที่ผูกกับ NIC จริงของซี่ล้อ(เช่นeth0) คุณจะต้องปรับAllowedIPsทั้งฮับและซี่ล้อเพื่อรวมที่อยู่ IP เหล่านั้น

ตัวอย่างเช่น หากที่eth0อยู่ของ A คือ198.51.100.65, B's คือ192.168.0.66และ X คือ192.168.0.88คุณจะต้องปรับเพียร์ในการกำหนดค่า WireGuard ของฮับเป็นดังนี้:

## S wg0.conf
...

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32
AllowedIPs = 198.51.100.65/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32
AllowedIPs = 192.168.0.66/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
AllowedIPs = 192.168.0.88/32

และตั้งค่าAllowedIPsคอนฟิกของซี่ล้อแต่ละอันดังนี้:

AllowedIPs = 172.9.9.0/24
AllowedIPs = 198.51.100.65/32
AllowedIPs = 192.168.0.66/32
AllowedIPs = 192.168.0.88/32

(โปรดทราบว่าคุณสามารถระบุบล็อคทั้งหมดในบรรทัดเดียวได้ตามที่AllowedIPs = 172.9.9.0/24, 198.51.100.65/32, 192.168.0.66/32, 192.168.0.88/32คุณต้องการ)


ด้วยการกำหนดค่าปัจจุบันของคุณ โดยที่คุณมีAllowedIPs = 0.0.0.0/0ใน X เมื่อคุณเรียกใช้curl 198.51.100.65จาก X สิ่งที่เกิดขึ้นคือ X กำลังกำหนดเส้นทางแพ็กเก็ตที่กำหนดไว้สำหรับ A (และทุกอย่างอื่น ๆ ) ผ่านอุโมงค์ WireGuard ไปยัง S จากนั้น S จะกำหนดเส้นทางแพ็กเก็ตเหล่านั้นที่ไม่ได้เข้ารหัส อินเทอร์เน็ตไปยัง A (ปลอมแปลงด้วยที่อยู่ IP สาธารณะของ S) ในการตอบกลับ A จะส่งแพ็กเก็ตที่ไม่ได้เข้ารหัสทางอินเทอร์เน็ตไปยัง S ซึ่ง S จะกำหนดเส้นทางผ่านอุโมงค์ WireGuard ไปยัง X

หากคุณต้องการให้แน่ใจว่า S ไม่เคยกำหนดเส้นทางแพ็กเก็ตที่เจาะผ่านเครือข่าย WireGuard ของคุณไปยังอินเทอร์เน็ต คุณสามารถปรับกฎ iptables ของคุณเพื่อป้องกันสิ่งนี้ สิ่งต่อไปนี้น่าจะทำเคล็ดลับ:

PostUp = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o eth0 -j DROP; iptables -A FORWARD -i eth0 -o wg0 -j DROP

ฉันมีปัญหากับ DNS: ใช้AllowedIPs = 172.9.9.0/24allow me to ping 8.8.8.8แต่ไม่ใช่google.com.

ฉันแก้ไขรวมถึงอินเทอร์เฟซ DNS ใน IP ที่อนุญาต ดังนั้นฉันจึงได้รับการแก้ไข DNS ผ่าน VPN แต่การรับส่งข้อมูลไม่ได้อยู่ใน VPN:

[Interface]
...
DNS = 1.1.1.1

[Peer]
...
AllowedIPs = 172.9.9.0/24, 1.1.1.1/32

สิ่งนี้ไม่ตอบคำถามที่สองที่ฉันมี: ถ้าเป็นไปได้ที่จะสร้างXและBสื่อสารโดยตรงโดยไม่ต้องผ่านS. คำตอบอื่นช่วยในการทำความเข้าใจว่า

แก้ไข

ดูเหมือนว่าจะใช้งานได้โดยการวางDNSฟิลด์ ดังนั้นมันจึงควรใช้เซิร์ฟเวอร์ DNS เดียวกันสำหรับทั้งสองอินเทอร์เฟซ