Данная статья родилась в результате объединения идей из лабораторной работы в рамках подготовки для сдачи экзамена CCNA компании Cisco, и курса "Сетевые протоколы в Linux", который прочитал Георгий Владимирович Курячий весной 2024 года на кафедре Автоматизации Систем Вычислительных Комплексов МГУ им. М.В. Ломоносова.

Если сформулировать задачу одной фразой, то в схеме Router-On-A-Stick, заменить маршрутизатор (Router) на машину под управлением GNU/Linux. Данная задача по своей сути представляет модификацию лабораторной работы и скорее представляет академический интерес.

Постановка задачи

При подготовке к сдаче экзамена CCNA от компании Cisco, после изучения виртуальных локальных сетей (VLANs) возникает задача маршрутизации трафика между несколькими виртуальными локальными сетями. И для ее решения предлагается несколько подходов, один из них носит название Router-On-A-Stick (ROAS).

Кратко, при подходе Router-On-A-Stick (ROAS) для маршрутизации между виртуальными локальными сетями используется отдельный маршрутизатор, который подключается к нескольким виртуальным локальным сетям, определенным на коммутаторе, через магистральный канал, при этом используется только один физических интерфейс маршрутизатора.

Классический вариант можно представить в виде следующей сетевой топологии.

Router-On-A-Stick

На схеме изображены две виртуальных локальных сети VLAN 10 (192.168.10.0/24) и VLAN 20 (192.168.20.0/24), настроенные на коммутаторе SW1, к каждой из которых подключено по две рабочие станции, и для маршрутизации трафика между ними, используется маршрутизатор R1.

А что если мы заменим маршрутизатор на машину под управлением какого-нибудь дистрибутива на базе GNU/Linux? И у нас получится следующая топология.

Linux-On-A-Stick

Конфигурация окружения

Конфигурация коммутатора

Поскольку основной интерес представляет конфигурирование машины под управлением GNU/Linux, особо останавливаться на конфигурации коммутатора нет смысла. Для целей данной лабораторной работы был использовал образ i86bi-linux-l2-ipbasek9-15.1g.bin коммутатора Cisco со следующей конфигурацией:

Конфигурация коммутатора
Current configuration : 1742 bytes
!
version 15.1
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
service compress-config
!
hostname SW1
!
boot-start-marker
boot-end-marker
!
!
logging discriminator EXCESS severity drops 6 msg-body drops EXCESSCOLL 
logging buffered 50000
logging console discriminator EXCESS
!
no aaa new-model
clock timezone +05 5 0
no ipv6 cef
ipv6 multicast rpf use-bgp
no ip icmp rate-limit unreachable
!
no ip domain-lookup
no ip cef
!
!
!
!
spanning-tree mode pvst
spanning-tree extend system-id
!
!
!
!
vlan internal allocation policy ascending
!
ip tcp synwait-time 5
! 
!
!
!
!
!
interface Ethernet0/0
 switchport trunk encapsulation dot1q
 switchport mode trunk
 duplex auto
!
interface Ethernet0/1
 duplex auto
!
interface Ethernet0/2
 duplex auto
!
interface Ethernet0/3
 duplex auto
!
interface Ethernet1/0
 duplex auto
!
interface Ethernet1/1
 switchport access vlan 10
 switchport mode access
 duplex auto
!
interface Ethernet1/2
 switchport access vlan 10
 switchport mode access
 duplex auto
!
interface Ethernet1/3
 duplex auto
!
interface Ethernet2/0
 duplex auto
!
interface Ethernet2/1
 switchport access vlan 20
 switchport mode access
 duplex auto
!
interface Ethernet2/2
 switchport access vlan 20
 switchport mode access
 duplex auto
!
interface Ethernet2/3
 duplex auto
!
interface Ethernet3/0
 duplex auto
!
interface Ethernet3/1
 duplex auto
!
interface Ethernet3/2
 duplex auto
!
interface Ethernet3/3
 duplex auto
!
interface Vlan1
 no ip address
!
!
no ip http server
!
!
!
!         
!
control-plane
!
!
line con 0
 exec-timeout 0 0
 privilege level 15
 logging synchronous
line aux 0
 exec-timeout 0 0
 privilege level 15
 logging synchronous
line vty 0 4
 login
!
end

Конфигурация рабочих станций

В качестве рабочих станций были использованы машины, поставляемые вместе с GNS3

Virtual PC Simulator, version 0.8.3
Welcome to Virtual PC Simulator, version 0.8.3
Dedicated to Daling.
Build time: Sep  9 2023 11:15:00
Copyright (c) 2007-2015, Paul Meng (mirnshi@gmail.com)
All rights reserved.

VPCS is free software, distributed under the terms of the "BSD" licence.
Source code and license can be found at vpcs.sf.net.
For more information, please visit wiki.freecode.com.cn.

Таблица адресации рабочих станций

Hostname

Address

Default Gateway

VLAN ID

PC1V10

192.168.10.10

192.168.10.1

10

PC2V10

192.168.10.20

192.168.10.1

10

PC1V20

192.168.20.10

192.168.20.1

20

PC2V20

192.168.20.10

192.168.20.1

20

Проверка сетевой связанности

После того, как коммутатор и рабочие станции были сконфигурированы, можно убедиться в том, что обеспечена сетевая связанность между рабочими станциями в рамках одной виртуальной локальной сети. Для VLAN 10 есть сетевая связанность междуPC1V10 и PC2V10, а для VLAN 20 - между PC1V20 и PC2V20

PC1V10> ping 192.168.10.20

84 bytes from 192.168.10.20 icmp_seq=1 ttl=64 time=1.461 ms
84 bytes from 192.168.10.20 icmp_seq=2 ttl=64 time=0.486 ms
84 bytes from 192.168.10.20 icmp_seq=3 ttl=64 time=0.376 ms
84 bytes from 192.168.10.20 icmp_seq=4 ttl=64 time=0.576 ms
84 bytes from 192.168.10.20 icmp_seq=5 ttl=64 time=0.471 ms
PC1V20> ping 192.168.20.20

84 bytes from 192.168.20.20 icmp_seq=1 ttl=64 time=0.359 ms
84 bytes from 192.168.20.20 icmp_seq=2 ttl=64 time=0.565 ms
84 bytes from 192.168.20.20 icmp_seq=3 ttl=64 time=0.332 ms
84 bytes from 192.168.20.20 icmp_seq=4 ttl=64 time=0.470 ms
84 bytes from 192.168.20.20 icmp_seq=5 ttl=64 time=0.568 ms

При этом, так как машина под управлением GNU/Linux пока еще без должной конфигурации, шлюз по умолчанию недоступен, и нет сетевой связанности между виртуальными локальными сетями VLAN 10 и VLAN 20.

PC1V10> ping 192.168.20.10

host (192.168.10.1) not reachable
PC1V20> ping 192.168.10.10

host (192.168.20.1) not reachable

Конфигурация GNU/Linux

А теперь, после подготовки необходимого окружения, самое время перейти к интересной части лабораторной работы!

В качестве дистрибутива GNU/Linux используется образ Debian GNU/Linux 12

debian@debian:~$ uname -a
Linux debian 6.1.0-22-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.94-1 (2024-06-21) x86_64 GNU/Linux

У данной машины доступен только один физический сетевой интерфейс ens4, вот его и будем конфигурировать.

root@debian:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 0c:e5:7e:1c:00:00 brd ff:ff:ff:ff:ff:ff
    altname enp0s4

Начнем с того, что создадим подынтерфейсы на физическом интерфейсе ens4 для наших виртуальных локальных сетей с помощью команд:

ip link add link ens4 name ens4.10 type vlan id 10
ip link add link ens4 name ens4.20 type vlan id 20

Далее, для каждого из подынтерфейсов назначим IPv4 адрес:

ip addr add dev ens4.10 192.168.10.1/24
ip addr add dev ens4.20 192.168.20.1/24

И остается только поднять интерфейс ens4 с помощью команды:

ip link set dev ens4 up

К данному моменту сетевые настройки имеют следующий вид:

root@debian:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 0c:e5:7e:1c:00:00 brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet6 fe80::ee5:7eff:fe1c:0/64 scope link 
       valid_lft forever preferred_lft forever
3: ens4.10@ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 0c:e5:7e:1c:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.1/24 scope global ens4.10
       valid_lft forever preferred_lft forever
    inet6 fe80::ee5:7eff:fe1c:0/64 scope link 
       valid_lft forever preferred_lft forever
4: ens4.20@ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 0c:e5:7e:1c:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.1/24 scope global ens4.20
       valid_lft forever preferred_lft forever
    inet6 fe80::ee5:7eff:fe1c:0/64 scope link 
       valid_lft forever preferred_lft forever

Теперь мы можем убедиться, что у нас есть сетевая связанность между рабочими станциями и их шлюзом по умолчанию.

PC1V10> ping 192.168.10.1

84 bytes from 192.168.10.1 icmp_seq=1 ttl=64 time=0.438 ms
84 bytes from 192.168.10.1 icmp_seq=2 ttl=64 time=0.728 ms
84 bytes from 192.168.10.1 icmp_seq=3 ttl=64 time=0.718 ms
84 bytes from 192.168.10.1 icmp_seq=4 ttl=64 time=0.747 ms
84 bytes from 192.168.10.1 icmp_seq=5 ttl=64 time=0.676 ms
PC1V20> ping 192.168.20.1

84 bytes from 192.168.20.1 icmp_seq=1 ttl=64 time=0.695 ms
84 bytes from 192.168.20.1 icmp_seq=2 ttl=64 time=0.624 ms
84 bytes from 192.168.20.1 icmp_seq=3 ttl=64 time=1.347 ms
84 bytes from 192.168.20.1 icmp_seq=4 ttl=64 time=0.847 ms
84 bytes from 192.168.20.1 icmp_seq=5 ttl=64 time=0.787 ms

Но все еще нет связи между виртуальными локальными сетями:

PC1V10> ping 192.168.20.10

192.168.20.10 icmp_seq=1 timeout
192.168.20.10 icmp_seq=2 timeout
192.168.20.10 icmp_seq=3 timeout
192.168.20.10 icmp_seq=4 timeout
192.168.20.10 icmp_seq=5 timeout

Дело в том, что по умолчанию в данном дистрибутиве маршрутизация на уровне ядра Linux отключена, и нужно ее включить. Данная задача решается выполнением следующей команды:

sysctl net.ipv4.ip_forward=1

И на этом конфигурация завершена! В чем можно убедиться проверив сетевую связанность между рабочими станциями в различных виртуальных локальных сетях. Например, между PC1V10 и PC1V20

PC1V10> ping 192.168.20.10

84 bytes from 192.168.20.10 icmp_seq=1 ttl=63 time=2.219 ms
84 bytes from 192.168.20.10 icmp_seq=2 ttl=63 time=1.233 ms
84 bytes from 192.168.20.10 icmp_seq=3 ttl=63 time=1.465 ms
84 bytes from 192.168.20.10 icmp_seq=4 ttl=63 time=0.905 ms
84 bytes from 192.168.20.10 icmp_seq=5 ttl=63 time=1.130 ms

Или PC2V10 и PC2V20

PC2V10> ping 192.168.20.20

84 bytes from 192.168.20.20 icmp_seq=1 ttl=63 time=3.012 ms
84 bytes from 192.168.20.20 icmp_seq=2 ttl=63 time=1.358 ms
84 bytes from 192.168.20.20 icmp_seq=3 ttl=63 time=0.944 ms
84 bytes from 192.168.20.20 icmp_seq=4 ttl=63 time=1.369 ms
84 bytes from 192.168.20.20 icmp_seq=5 ttl=63 time=1.400 ms

Вывод

Из выполненной лабораторной работы видно, что поместить GNU/Linux On-A-Stick, не сложнее, чем сделать это с маршрутизатором от компании Cisco. Так же она дает возможность получить опыт работы в гетерогенной среде.

Описанная лабораторная работа выполнена в среде GNS3 2.2.50

Ссылки