Wireguard

آموزش راه اندازی تونل wireguard در سودار

فرض کنید در سناریو زیر قصد داریم دو تونل wireguard بزنیم که دو شبکه پشتی هر روتر در vrf جداگانه قرار داشته باشند و هر کدام از تونل مربوط به خود برای ارتباط استفاده کنند و هیچ ارتباطی به شبکه دیگر نتواند برقرار کند :

wg

ابتدا در هر روتر ۳ vrf جداگانه می سازیم . یک vrf برای شبکه بین روتر ها (اینترنت یا public) و برای هر شبکه پشت روتر هم یک vrf جداگانه می سازیم :

soodar1(config)# vrf pub  
soodar1(config)# vrf green  
soodar1(config)# vrf red  
soodar2(config)# vrf pub  
soodar2(config)# vrf green  
soodar2(config)# vrf red  

اینترفیس ها را در vrf مربوطه قرار می دهیم (در اینجا pub برای شبکه public و دو vrf دیگر برای شبکه private استفاده می شوند):

soodar1(config)# interface ge0  
soodar1(config-if)# ip vrf forwarding pub
soodar1(config-if)# ip address 200.1.2.1/24
soodar1(config-if)# q
soodar1(config)# interface ge1  
soodar1(config-if)# ip vrf forwarding green
soodar1(config-if)# ip address 1.1.1.1/24
soodar1(config-if)# q
soodar1(config)# interface ge2  
soodar1(config-if)# ip vrf forwarding red
soodar1(config-if)# ip address 1.2.1.1/24
soodar1(config-if)# q
soodar2(config)# interface ge0  
soodar2(config-if)# ip vrf forwarding pub
soodar2(config-if)# ip address 200.1.2.2/24
soodar2(config-if)# q
soodar2(config)# interface ge1  
soodar2(config-if)# ip vrf forwarding green
soodar2(config-if)# ip address 2.1.1.1/24
soodar2(config-if)# q
soodar2(config)# interface ge2  
soodar2(config-if)# ip vrf forwarding red
soodar2(config-if)# ip address 2.2.1.1/24
soodar2(config-if)# q

ساخت تونل wireguard

در این سناریو ما :

  • نیاز به دو تونل wg داریم تا دو شبکه متفاوت در vrf جداگانه را به هم وصل کند .
  • هر اینترفیس تونل باید در یک vrf قرار بگیرد .
  • باید route هایی که از طریق هر تونل عبور کنند را مشخص کنیم
  • به صورت پیش فرض از الگوریتم استاندارد خود wireguard برای رمزنگاری استفاده می شود اما در صورت نیاز می توان از الگوریتم بومی نیز استفاده کرد .

ساخت کلید wg

در ابتدا برای هر تونل یک کلید wg تولید می کنیم .

دقت شود که کلید حتما باید از نوع x25519 انتخاب گردد.

soodar1(config)# crypto key generate x25519 label wg10
informational-ZEBRA: new X25519 key wg10 generated

soodar1(config)# crypto key generate x25519 label wg11
informational-ZEBRA: new X25519 key wg11 generated

soodar1(config-if)# do sh crypto key wg10
Keypair Label: wg10
  Algorithm:   X25519
  Public key:  A1D71640B325F3275C4C92431EF7A41DF5F25EF010FA7FAEB5F1214A34F80D76

soodar1(config-if)# do sh crypto key wg11
Keypair Label: wg11
  Algorithm:   X25519
  Public key:  4161E811D7BEE4AA61E2079FAE1A76ED03E5F21CEC38B1A70D9C2781247D7D5A

soodar1(config-if)#
soodar2(config)# crypto key generate x25519 label wg20
informational-ZEBRA: new X25519 key wg20 generated

soodar2(config)# crypto key generate x25519 label wg21
informational-ZEBRA: new X25519 key wg21 generated

soodar2(config)# do sh crypto key wg20
Keypair Label: wg20
  Algorithm:   X25519
  Public key:  045CB4AD197FD8C60B8AA0C966B625B3209570DFC42039CD9EC8983B6E818831

soodar2(config)# do sh crypto key wg21
Keypair Label: wg21
  Algorithm:   X25519
  Public key:  10295CB9E3CE6AF124630E8351B5C46E0F54C107346F679BCEE9FAA970F16300

ساخت اینترفیس wireguard

  • اینترفیس تونل باید در vrf ی قرار بگیرد که قرار است ترافیک شبکه private مربوط به همان vrf را از خود عبور دهد (ge1 , 1.1.1.1/24)
  • کلیدی که قرار است برای این تونل استفاده شود را مشخص می کنیم . public key این کلید در تنظیمات تونل طرف مقابل استفاده می شود
  • پورتی که روی آن گوش می کنیم و بسته ها را با آن پورت مقصد قبول می کنیم را هم مشخص می کنیم این پورت در طرف مقابل تونل در بخشpeer ها باید مد نظر گرفته شود
  • یک ip هم به اینترفیس اختصاص می دهیم
soodar1(config)# interface wireguard10  
soodar1(config-if)# ip vrf forwarding green
soodar1(config-if)# wireguard source 200.1.2.1
soodar1(config-if)# wireguard private-key wg10
soodar1(config-if)# wireguard port 1212
soodar1(config-if)# ip address 10.0.12.12/32
soodar1(config-if)# end
soodar1# 
soodar2(config)# interface wireguard20  
soodar2(config-if)# ip vrf forwarding green
soodar2(config-if)# wireguard source 200.1.2.2
soodar2(config-if)# wireguard private-key wg20
soodar2(config-if)# wireguard port 2121
soodar2(config-if)# ip address 10.0.12.21/32
soodar2(config-if)# q
soodar2(config)# 

افزودن peer

اطلاعات مربوط به طرف مقابل تونل را را در این بخش مشخص می کنیم .

  • ابتدا یک نام برای peer مشخص می کنیم .
  • public-key مربوط به peer را که قبلا در peer اضافه شده است را تنظیم می کنیم (با دستور sh crypto key KEYNAME می توان public key کلید را مشاهده کرد) .
  • آدرس شبکه هایی که قرار است از این تونل route شود و همچنین از این تونل به مقصد ما پذیرفته شود را در allowed ip اضافه می کنیم .

دقت شود اگر بسته ای از طریق تونل به هر نحوی به ما برسد اما آن آدرس جزو allowed ip های ما نباشد، drop خواهد شد .

soodar1(config)# interface wireguard10  
soodar1(config-if)# wireguard peer soodar2
soodar1(config-wg-peer)# public-key 045CB4AD197FD8C60B8AA0C966B625B3209570DFC42039CD9EC8983B6E818831
soodar1(config-wg-peer)# allowed-ip 2.1.1.0/24
soodar1(config-wg-peer)# end
soodar1# 

soodar2(config)# interface wireguard20  
soodar2(config-if)# wireguard peer soodar1
soodar2(config-wg-peer)# public-key A1D71640B325F3275C4C92431EF7A41DF5F25EF010FA7FAEB5F1214A34F80D76
soodar2(config-wg-peer)# allowed-ip 1.1.1.0/24
soodar2(config-wg-peer)# end
soodar2# 

شما می توانید در هر اینترفیس وایرگارد که می سازید peerهای متعددی اضافه نمایید یعنی با ساخت یک اینترفیس تونل و peer های مختلف چندین تونل ایجاد نمایید . البته می توان برای هر peer نیز اینترفیس جداگانه ای ساخت .
مطلب قابل توجه بعدی در این بخش این است که مقصد تونل (endpoint) فقط لازم است در یک سمت تونل تنظیم شود و در سمت دیگر (سرور) که peer های زیادی می تواند داشته باشد تعریف نمی شود و ip طرف مقابل و port مهم نیست و فقط public key مر بوط به peer تعیین کننده است .
در این سناریو در soodar1 که در این جا به عنوان سرور در نظر گرفته شده ، endpoint ی تنظیم نشده است . اما در soodar2 این تنظیم انجام شده است و آدرس ip و port ی که soodar1 منتظر دریافت بسته برای تشکیل تونل است را وارد کرده ایم .

تنظیم vrf برای ارتباط با peer
اگر route مربوط به peer در vrf خاصی وجود دارد (در اینجا در pub قرار دارد) باید در تنظیمات peer مشخص کنیم که از کدام vrf برای ارتباط با peer استفاده کند که در این سناریو چون اینترفیس های ge0 هر دو روتر در vrf pub قرار دارند در تنیجه یکدیگر را از pub vrf مسیریابی می کنند و این موضوع در تنظیمات peer با دستور vrf pub مشخص شده است .

soodar1(config-wg-peer)# vrf pub
soodar1(config-wg-peer)# end
soodar1# 

soodar2(config-wg-peer)# endpoint 200.1.2.1 port 1212 
soodar2(config-wg-peer)# vrf pub
soodar2(config-wg-peer)# end
soodar2# 

مشاهده وضعیت تونل

برای مشاهده وضعیت تونل های wirguard می توان از دستور زیر استفاده کرد. در نظر داشته باشید گاهی اوقات ممکن است بروز شدن وضعیت تونل کمی با تاخیر انجام شود و به طور مثال تونل وصل شده باشد اما این دستور تونل را قطع نشان دهد .

soodar1# sh wireguard 
Wireguard 10
  Source: 200.1.2.1
  Key: wg10
  Public key: A1D71640B325F3275C4C92431EF7A41DF5F25EF010FA7FAEB5F1214A34F80D76
  Port: 1212

  Peer soodar2:
    Public key: 045CB4AD197FD8C60B8AA0C966B625B3209570DFC42039CD9EC8983B6E818831
    Persistent keepalive: 10
    VRF: pub
    Connected: True
    Allowed IPs:
     - 2.1.1.0/24

soodar1# 

Connected: True مشخص می کند که تونل وصل شده است .

در نمایش وضعیت اینترفیس هم اینترفیس wireguard در vrf مربوطه قرار دارد و up شده است .

soodar1(config)# show int vrf all brief 
Interface       Status  VRF             Addresses
---------       ------  ---             ---------
pimreg          up      default         

Interface       Status  VRF             Addresses
---------       ------  ---             ---------
ge1             up      green           1.1.1.1/24
green           up      green           
pimreg300       up      green           
wireguard10     up      green           10.0.0.1/32

Interface       Status  VRF             Addresses
---------       ------  ---             ---------
ge0             up      pub             200.1.2.1/24
pub             up      pub             

Interface       Status  VRF             Addresses
---------       ------  ---             ---------
ge2             up      red             1.2.1.1/24
red             up      red             

soodar1# 

افزودن تونل دوم

تنظیم تونل دوم هم مانند تونل اول اضافه می شود توجه شود که در تونل جدید باید از کلید های جدید استفاده شود :

soodar1(config)# interface wireguard11  
soodar1(config-if)# ip vrf forwarding red
soodar1(config-if)# wireguard source 200.1.2.1
soodar1(config-if)# wireguard private-key wg11
soodar1(config-if)# wireguard port 4040
soodar1(config-if)# ip address 10.0.120.120/32
soodar1(config-if)# wireguard peer soodar2
soodar1(config-wg-peer)# public-key 10295CB9E3CE6AF124630E8351B5C46E0F54C107346F679BCEE9FAA970F16300
soodar1(config-wg-peer)# allowed-ip 2.2.1.0/24
soodar1(config-wg-peer)# vrf pub
soodar1(config-if)# end
soodar1# 
soodar2(config)# interface wireguard21  
soodar2(config-if)# ip vrf forwarding red
soodar2(config-if)# wireguard source 200.1.2.2
soodar2(config-if)# wireguard private-key wg21
soodar2(config-if)# wireguard port 6060
soodar2(config-if)# ip address 10.0.120.210/32
soodar2(config-if)# wireguard peer soodar1
soodar2(config-wg-peer)# public-key 4161E811D7BEE4AA61E2079FAE1A76ED03E5F21CEC38B1A70D9C2781247D7D5A
soodar2(config-wg-peer)# allowed-ip 1.2.1.0/24
soodar2(config-wg-peer)# endpoint 200.1.2.1 port 4040 
soodar2(config-wg-peer)# vrf pub
soodar2(config-wg-peer)# end
soodar2# 

نمایش تنظیمات روتر ها

soodar1# show running-config
hostname soodar1
no zebra nexthop kernel enable
security passwords min-length 8
log syslog
log monitor
no banner motd
!
!
vrf pub
!
vrf green
!
vrf red
!
interface ge0 vrf pub
 ip vrf forwarding pub
 no shutdown
 ip address 200.1.2.1/24
!
interface pub vrf pub
 no ip address
 no shutdown
!
interface ge1 vrf green
 ip vrf forwarding green
 no shutdown
 ip address 1.1.1.1/24
!
interface green vrf green
 no ip address
 no shutdown
!
interface wireguard10 vrf green
 ip vrf forwarding green
 wireguard source 200.1.2.1
 wireguard private-key wg10
 wireguard port 1212
 wireguard peer soodar2
  public-key 045CB4AD197FD8C60B8AA0C966B625B3209570DFC42039CD9EC8983B6E818831
  vrf pub
  allowed-ip 2.1.1.0/24
 no shutdown
 ip address 10.0.12.12/32
!
interface ge2 vrf red
 ip vrf forwarding red
 no shutdown
 ip address 1.2.1.1/24
!
interface red vrf red
 no ip address
 no shutdown
!
interface wireguard11 vrf red
 ip vrf forwarding red
 wireguard source 200.1.2.1
 wireguard private-key wg11
 wireguard port 4040
 wireguard peer soodar2
  public-key 10295CB9E3CE6AF124630E8351B5C46E0F54C107346F679BCEE9FAA970F16300
  vrf pub
  allowed-ip 2.2.1.0/24
 no shutdown
 ip address 10.0.120.120/32
!
line vty
!
end


soodar1# 
soodar2# show running-config
hostname soodar2
no zebra nexthop kernel enable
security passwords min-length 8
log syslog
log monitor
no banner motd
!
!
vrf pub
!
vrf green
!
vrf red
!
interface ge0 vrf pub
 ip vrf forwarding pub
 no shutdown
 ip address 200.1.2.2/24
!
interface pub vrf pub
 no ip address
 no shutdown
!
interface ge1 vrf green
 ip vrf forwarding green
 no shutdown
 ip address 2.1.1.1/24
!
interface green vrf green
 no ip address
 no shutdown
!
interface wireguard20 vrf green
 ip vrf forwarding green
 wireguard source 200.1.2.2
 wireguard private-key wg20
 wireguard port 2121
 wireguard peer soodar1
  public-key A1D71640B325F3275C4C92431EF7A41DF5F25EF010FA7FAEB5F1214A34F80D76
  endpoint 200.1.2.1 port 1212
  vrf pub
  allowed-ip 1.1.1.0/24
 no shutdown
 ip address 10.0.12.21/32
!
interface ge2 vrf red
 ip vrf forwarding red
 no shutdown
 ip address 2.2.1.1/24
!
interface red vrf red
 no ip address
 no shutdown
!
interface wireguard21 vrf red
 ip vrf forwarding red
 wireguard source 200.1.2.2
 wireguard private-key wg21
 wireguard port 6060
 wireguard peer soodar1
  public-key 4161E811D7BEE4AA61E2079FAE1A76ED03E5F21CEC38B1A70D9C2781247D7D5A
  endpoint 200.1.2.1 port 4040
  vrf pub
  allowed-ip 1.2.1.0/24
 no shutdown
 ip address 10.0.120.210/32
!

line vty
!
end
soodar2# 

حذف تونل wireguard

برای حذف تونل wireguard دستور زیر را وارد کنید :

soodar1(config)# int wireguard10 
soodar1(config-if)# shutdown 
informational-ZEBRA: Interface wireguard10 has gone DOWN
soodar1(config-if)# q
soodar1(config)# no int wireguard10 
informational-ZEBRA: vrf-change for wireguard10 vrf_id 6 -> 0
soodar1(config)# 

فعال کردن log های wireguard

با دستور زیر می توانید Log های مربوط به wireguard را فعال کنید:

soodar1# debug wireguard event