เป้าหมายของฉันคือการสร้าง VPN ดังนั้น

  1. ลูกค้ามีที่อยู่ IP แบบคงที่
  2. ลูกค้าสามารถสื่อสารระหว่างกันและเซิร์ฟเวอร์
  3. ลูกค้าสามารถเข้าถึงอินเทอร์เน็ตทั่วโลกผ่าน VPN
  4. นอกจากนี้ ฉันต้องการตั้งค่า DNS และชื่อโดเมนส่วนตัว (ทำงานกับ NginX)

นี่คือการกำหนดค่าของเซิร์ฟเวอร์:

[Interface]
Address = 10.0.0.1/24
ListenPort = 5555
PrivateKey = xxxxx

[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0

และการกำหนดค่าของลูกค้า:

[Interface]
PrivateKey = xxxxx
ListenPort = 5555
Address = 10.0.0.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <server ip>:5555

แต่เมื่อฉันพยายามโหลดการกำหนดค่าของเซิร์ฟเวอร์wg setconf wg0 /etc/wireguard/wg0.confฉันได้รับข้อผิดพลาดนี้:

Line unrecognized: `Address=10.0.0.1/24'
Configuration parsing error

ดังนั้นฉันจึงแสดงความคิดเห็นบรรทัดนี้ แต่อาจทำให้ WG เลือกที่อยู่ IP แบบสุ่มสำหรับเซิร์ฟเวอร์และไคลเอนต์

เพื่อให้ WireGuard ทำงานได้ ฉันยังรันคำสั่งเหล่านี้:

ip link add dev wg0 type wireguard
ip address add dev wg0 10.0.0.1/24
ip link set up dev wg0

หลังจากที่ทุกwgคำสั่งที่ให้ผลผลิตต่อไปนี้:

interface: wg0
  public key: xxxxx
  private key: (hidden)
  listening port: 5555

peer: xxxxx
  endpoint: <my IP address>:6228
  allowed ips: 0.0.0.0/0
  latest handshake: 2 minutes, 11 seconds ago
  transfer: 26.02 KiB received, 248 B sent

จากไคลเอนต์ (ซึ่งก็คือ MacOS ที่มี WireGuard GUI) ฉันสามารถเชื่อมต่อได้ แต่:

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

ดังนั้นฉันจะบรรลุเป้าหมายได้อย่างไร และมีอะไรผิดปกติกับ configs ของฉัน ??

ป.ล. ไม่มีการiptablesติดตั้งไฟร์วอลล์หรือไฟร์วอลล์บนเซิร์ฟเวอร์ ดังนั้นจึงไม่มีปัญหา นอกจากนี้ฉันได้ระบุnet.ipv4.ip_forward=1& net.ipv6.conf.all.forwarding=1ในไฟล์/etc/sysctl.conf.
เวอร์ชันซอฟต์แวร์ OS คือUbuntu 18.04.4 LTS, Kernel: 4.15.0-20-generic, WG: wireguard-tools v1.0.20200206.


อัปเดต

ฉันลบการAddressกำหนดค่าของเซิร์ฟเวอร์และตั้งค่าAllowedIPs = 10.0.0.2/24ในการกำหนดค่าของไคลเอ็นต์ ในที่สุดฉันก็เชื่อมต่อกับ NginX ของเซิร์ฟเวอร์จากไคลเอนต์ด้วย IP ส่วนตัว และสามารถเข้าถึงอินเทอร์เน็ตได้ (เนื่องจากการรับส่งข้อมูลไปนอก VPN)

แต่ถ้าฉันตั้งค่าAllowedIPs = 0.0.0.0/0บนไคลเอนต์ ฉันไม่มีการเข้าถึงอินเทอร์เน็ต แม้ว่าจะยังสามารถเข้าถึงเซิร์ฟเวอร์ได้ด้วยที่อยู่ IP ของ VPN 10.0.0.1 ฉันพยายามแก้ไขด้วยifconfig wg0 broadcast/multicastแต่ไม่ประสบความสำเร็จ ตอนนี้คำสั่งip address show wg0ให้ผลลัพธ์ต่อไปนี้:

4: wg0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.10.10.1/24 scope global wg0
       valid_lft forever preferred_lft forever
    inet 10.10.10.1 peer 10.10.10.2/32 scope global wg0
       valid_lft forever preferred_lft forever

นอกจากนี้ ฉันไม่สามารถเข้าถึงลูกค้ารายหนึ่งจากอีกรายหนึ่งได้ ฉันคิดว่าเป็นปัญหาเดียวกัน ฉันจะแก้ไขการกำหนดค่า WireGuard หรือการตั้งค่าเครือข่ายเซิร์ฟเวอร์เพื่อแก้ปัญหาได้อย่างไร

answer

ใช้wg-quickแทนwgไฟล์ปรับแต่งและใช้งานได้ ;-) คุณเขียนว่าคุณกำลังใช้wgคำสั่งโดยตรงซึ่งใช้รูปแบบไฟล์การกำหนดค่าที่แตกต่างกัน ทำให้เกิดข้อผิดพลาด:

Line unrecognized: `Address=10.0.0.1/24,fd86:ea04:1115::1/64'
Configuration parsing error

สิ่งที่คุณสามารถตรวจสอบได้:

แยกอยู่สายที่จะมีการตั้งค่าที่ถูกต้องบนเซิร์ฟเวอร์:

[Interface]
Address = 10.0.0.1/24
Address = fd86:ea04:1115::1/64
ListenPort = 5555
PrivateKey = xxxxx

[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0

ในฝั่งไคลเอ็นต์ควรมีจุดสิ้นสุดเพื่อทราบว่าจะเชื่อมต่อที่ไหนและ netmask จะจับคู่ (เหมือนกัน) กับฝั่งเซิร์ฟเวอร์ดังนั้นในกรณีนี้/24 :

[Interface]
PrivateKey = xxxxx
ListenPort = 5555
Address = 10.0.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <remote>:<ip>

คุณสามารถลองใช้ที่อยู่ทั้งสองในบรรทัดเดียว แต่แน่นอนว่ามาสก์/24ควรเหมือนกันทั้งสองด้าน

ในหลายวันหลายคืนและเซิร์ฟเวอร์ที่ถูกฆ่า ฉันก็แก้ปัญหาทั้งหมดด้วยตัวเอง :)

  • ประการแรก ฉันต้องการพูดถึงสิ่งนั้นwgและwg-quickยูทิลิตี้จะจัดการกับไฟล์การกำหนดค่าต่างกัน ดังนั้น ฉันwg setconf wg0 /etc/wireguard/wg0.confไม่ได้ทำงานตามที่คาดหวัง และฉันเดาว่ามันใช้รูปแบบการกำหนดค่าแบบเก่า ตอนนี้ผมใช้wg-quickผ่านsystemctl.

  • ประการที่สอง การเพิ่มnet.ipv4.ip_forward=1ไฟล์ของ/etc/sysctl.confฉันไม่ทำงานแม้ว่าฉันจะเรียกsystemctl daemon-reload ; systemctl restart systemd-networkd. ฉันต้องเชื่อมโยงการกำหนดค่ากับเคอร์เนลโดยใช้sysctl -p /etc/sysctl.confคำสั่ง สิ่งนี้ทำให้เพื่อนสามารถสื่อสารกันและเข้าถึงอินเทอร์เน็ตผ่าน VPN

  • เป็นการดีที่จะกล่าวว่าสำหรับAddressโน้ตทั้งหมดควรใช้ซับเน็ตมาสก์ขนาด 32 บิต ซึ่งหมายถึง IP ที่แน่นอน ไม่ใช่ช่วง

  • นอกจากนี้ ฉันได้ตั้งค่า DNS แบบกำหนดเองด้วย BIND9 เพื่อสร้างโดเมนของตัวเองในเครือข่าย และ NginX พร้อมการตรวจสอบที่อยู่ IP ของผู้ส่งเพื่อจำกัดการเข้าถึงไคลเอนต์ของ VPN เท่านั้น

สำหรับตอนนี้ configs ของฉันมีดังนี้

เซิร์ฟเวอร์

[Interface]
Address = 10.0.0.1/32
ListenPort = 5555
PrivateKey = ___some_private_key___

# The following is needed only if you have `ufw` installed
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -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; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = ___some_public_key___
AllowedIPs = 10.0.0.1/32

ลูกค้า

[Interface]
PrivateKey = ___some_private_key___
ListenPort = 5555
Address = 10.0.0.1/32

[Peer]
PublicKey = ___some_public_key___
AllowedIPs = 10.0.0.0/24
Endpoint = ___some_ip_address__:5555

ตกลงแก้ไข wireguard "Line unrecognized Address=" โดยwg show wg0 ไม่ใช้ wg-quick

เพิ่งลบ / แสดงความคิดเห็นบรรทัดในการกำหนดค่าAddress = x.x.x.xใน /etc/wireguard/wg0.conf

การตั้งค่าของฉันบน Debian/ubuntu

  1. อินเทอร์เฟซ wg0 ได้รับการกำหนดค่าใน /etc/network/interfaces
auto wg0
iface wg0 inet static
address 192.168.1.1/24
pre-up ip link add wg0 type wireguard
pre-up wg setconf wg0 /etc/wireguard/wg0.conf
post-down ip link del wg0