WireGuard использует постоянные ключи шифрования (публичные и приватные) для установления доверия между узлами сети. Это отличает его от традиционных протоколов типа OpenVPN или IPSec, где используется сложный процесс обмена ключами.
Примечание :
WireGuard - stateless VPN протокол, поэтому и сервер, и клиент всегда будут UP в ожидании инициализации соединения от другой стороны;

В примере для того, чтобы соединение установилось, был выключен firewall на всех интерфейсах - ip firewall disable; Для того, чтобы firewall пропускал трафик, нужно в security zone-pair разрешить UDP порты wireguard'а; По-умолчанию на ESR порт для сервера 5000, а для клиента - 0. Пакеты, приходящие на WG-интерфейс, инкапсулируются в UDP. |
На ESR реализован механизм генерации ключей для WireGuard. Поэтому первым делом сгенерируем публичные ключи для взаимного обмена между устройствами и приватные ключи для использования в конфигурации устройства, которые будут храниться в crypto:private-key/ и crypto:public-key/ соответственно.
R2-WG-Server:
crypto generate private-key x25519 filename wg_server.priv - Генерируем приватный ключ сервера; crypto generate public-key x25519 private-key wg_server.priv filename wg_server.pub - Генерируем публичный ключ на основе приватного; |
Публичный ключ сервера необходимо загрузить на клиента. |
R1-WG-Client:
crypto generate private-key x25519 filename wg_client_1.priv - Генерируем приватный ключ клиента; crypto generate public-key x25519 private-key wg_client_1.priv filename wg_client_1.pub - Генерируем публичный ключ клиента на основе приватного; |
Публичный ключ клиента необходимо загрузить на сервер. |
Создаем object-group network:
R2-WG-Server(config)# object-group network Client_1 - Задаем имя object-group; R2-WG-Server(config-object-group-network)# ip prefix 12.1.1.0/24 - Сеть локального адреса; R2-WG-Server(config-object-group-network)# ip prefix 10.10.1.0/24 - Сеть которая на стороне клиента. R2-WG-Server(config-object-group-network)# exit После добавления сети в object-group network, появляется статический маршрут с nexthop wg. R2-WG-Server# show ip rou - Смотрим таблицу маршрутизации. Codes: C - connected, S - static, R - RIP derived, O - OSPF derived, IA - OSPF inter area route, E1 - OSPF external type 1 route, E2 - OSPF external type 2 route, B - BGP derived, D - DHCP derived, K - kernel route, V - VRRP route, i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area, H - NHRP, * - FIB route S * 0.0.0.0/0 [1/0] via 192.168.10.1 on gi1/0/1 [static 2025-06-05] C * 13.13.13.0/24 [0/0] dev gi1/0/3 [direct 2025-06-05] C * 12.1.1.0/24 [0/0] dev wg0 [direct 2025-06-05] C * 192.168.10.0/24 [0/0] dev gi1/0/1 [direct 2025-06-05] S * 10.10.1.0/24 [40/0] dev wg0 [static 2025-06-05] |
Создаем профиль WireGuard-сервера:
R2-WG-Server(config)# remote-access wireguard VPN - Задаем имя профиля; R2-WG-Server(config-wireguard-server)# mtu 1420 - Задаем mtu; R2-WG-Server(config-wireguard-server)# port 43020 - Задаем порт для прослушивания; R2-WG-Server(config-wireguard-server)# local-address 12.1.1.1/24 - Задаем локальный адрес туннеля; R2-WG-Server(config-wireguard-server)# ip firewall disable - В данном примере не используется firewall, поэтому выключаем его; R2-WG-Server(config-wireguard-server)# private-key wg_server.priv - Указываем приватный ключ сервера; R2-WG-Server(config-wireguard-server)# peer 1 - Перейти к настройке разрешённых туннелей WireGuard-сервера; R2-WG-Server(config-wireguard-peer)# access-addresses object-group Client_1 - Указываем список адресов, которые будут работать внутри туннеля; R2-WG-Server(config-wireguard-peer)# public-key client.pub - Указываем публичный ключ клиента; R2-WG-Server(config-wireguard-peer)# enable - Активируем пир; R2-WG-Server(config-wireguard-peer)# exit - exit; R2-WG-Server(config-wireguard-server)# enable - Активируем RA профиль. |
Создаем object-group network:
R1-WG-client(config)# object-group network Client_1 - Задаем имя object-group;
R1-WG-client(config-object-group-network)# ip prefix 12.1.1.0/24 - Сеть локального адреса;
R1-WG-client(config-object-group-network)# ip prefix 13.13.13.0/24 - Сеть которая на стороне сервера.
R1-WG-client(config-object-group-network)# exit
После добавления сети в object-group network, появляется статический маршрут с nexthop wg.
R1-WG-client# show ip rou - Смотрим таблицу маршрутизации.
Codes: C - connected, S - static, R - RIP derived,
O - OSPF derived, IA - OSPF inter area route,
E1 - OSPF external type 1 route, E2 - OSPF external type 2 route,
B - BGP derived, D - DHCP derived, K - kernel route, V - VRRP route,
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area,
H - NHRP, * - FIB route
S * 0.0.0.0/0 [1/0] via 192.168.1.1 on gi1/0/1 [static 2025-06-05]
S * 13.13.13.0/24 [40/0] dev wg1 [static 2025-06-05]
C * 12.1.1.0/24 [0/0] dev wg1 [direct 2025-06-05]
C * 10.10.1.0/24 [0/0] dev gi1/0/3 [direct 2025-06-05]
C * 192.168.1.0/24 [0/0] dev gi1/0/1 [direct 2025-06-05] |
Создаем WireGuard-туннель и переходим в режим его конфигурирования.
R1-WG-client(config)# tunnel wireguard 1 - Задаем имя профиля; R1-WG-client(config-wireguard-server)# mtu 1420 - Задаем mtu; R1-WG-client(config-wireguard-server)# local-address 12.1.1.2/24 - Задаем локальный адрес туннеля; R1-WG-client(config-wireguard-server)# ip firewall disable - В данном примере не используется firewall, поэтому выключаем его; R1-WG-client(config-wireguard-server)# private-key wg_client_1.priv - Задаем приватный ключ клиента; R1-WG-client(config-wireguard-server)# peer 1 - Перейти к настройке разрешенных пиров; R1-WG-сlient(config-wireguard-peer)# access-addresses object-group Client_1 - Указываем список адресов, которые будут работать внутри туннеля; R1-WG-сlient(config-wireguard-peer)# remote address 192.168.10.2 - Указываем IP-адрес удаленного пира; R1-WG-сlient(config-wireguard-peer)# remote port 43020 - Указываем UDP-порт удаленного пира; R1-WG-сlient(config-wireguard-peer)# public-key server.pub - Указываем публичный ключ сервера; R1-WG-сlient(config-wireguard-peer)# enable - Активируем пир; R1-WG-сlient(config-wireguard-peer)# exit - exit; R1-WG-client(config-wireguard-server)# enable - Активируем туннель. |
R2-WG-Server# show remote-access configuration wireguard VPN - Просмотр конфигурации WireGuard-сервера; State: Enabled VRF: -- Description: -- Port: 43020 MTU: 1420 Local addres: 12.1.1.1/24 Security zone: -- Private key: wg_server.priv Peer: 1 State: Enabled Description: -- Public key: client.pub Access-addresses: -- DNS servers: -- R2-WG-Server# show remote-access counters wireguard server - Просмотр счетчиков. User IP-address Packets recv Bytes recv Err recv MC recv ------------- --------------------- ------------ ---------- ---------- ---------- peer 1 12.1.1.0, ... -- 277836 -- -- User IP-address Packets sent Bytes sent Err sent ------------- --------------------- ------------ ---------- ---------- peer 1 12.1.1.0, ... -- 277220 -- |
R1-WG-client# show tunnels counters wireguard 1 - Просмотр счетчиков;
Tunnel 'wireguard 1' counters:
Packets received: 2172
Bytes received: 277220
Dropped on receive: 0
Receive errors: 0
Multicasts received: 0
Receive length errors: 0
Receive buffer overflow errors: 0
Receive CRC errors: 0
Receive frame errors: 0
Receive FIFO errors: 0
Receive missed errors: 0
Receive compressed: 0
Packets transmitted: 2179
Bytes transmitted: 277836
Dropped on transmit: 0
Transmit errors: 0
Transmit aborted errors: 0
Transmit carrier errors: 0
Transmit FIFO errors: 0
Transmit heartbeat errors: 0
Transmit window errors: 0
Transmit comressed: 0
Collisions: 0
R1-WG-client# show tunnels configuration wireguard 1 - Просмотр конфигурации WireGuard-туннеля;
State: Enabled
Description: --
VRF: --
Security zone: --
IP address: 12.1.1.2/24
Port: 0
MTU: 1420
R1-WG-client# monitor wireguard 1 packets 4 - Монитор трафика
04:47:02.313266 ip: (tos 0x0, ttl 64, id 42452, offset 0, flags [DF], proto ICMP (1), length 84)
12.1.1.1 > 12.1.1.2: ICMP echo request, id 1, seq 1, length 64
04:47:02.313373 ip: (tos 0x0, ttl 64, id 36092, offset 0, flags [none], proto ICMP (1), length 84)
12.1.1.2 > 12.1.1.1: ICMP echo reply, id 1, seq 1, length 64
04:47:03.312672 ip: (tos 0x0, ttl 64, id 43327, offset 0, flags [DF], proto ICMP (1), length 84)
12.1.1.1 > 12.1.1.2: ICMP echo request, id 1, seq 2, length 64
04:47:03.312705 ip: (tos 0x0, ttl 64, id 36974, offset 0, flags [none], proto ICMP (1), length 84)
12.1.1.2 > 12.1.1.1: ICMP echo reply, id 1, seq 2, length 64 |