Поиск по сайту:

Как превратить Linux-сервер в маршрутизатор для статической и динамической обработки трафика. Часть 10


Как мы и предполагали в предыдущих руководствах этой серии LFCE (Сертифицированный инженер Linux Foundation), в этой статье мы обсудим статическую и динамическую маршрутизацию IP-трафика с помощью конкретных приложений.

Представляем программу сертификации Linux Foundation

Прежде всего, давайте разберемся с некоторыми определениями:

  1. Проще говоря, пакет — это базовая единица, используемая для передачи информации внутри сети. Сети, использующие TCP/IP в качестве сетевого протокола, следуют одним и тем же правилам передачи данных: фактическая информация разбивается на пакеты, состоящие как из данных, так и из адреса, по которому она должна быть отправлена.
  2. Маршрутизация — это процесс «направления» данных от источника к месту назначения внутри сети.
  3. Статическая маршрутизация требует набора правил, настроенных вручную и определенных в таблице маршрутизации. Эти правила фиксированы и используются для определения способа прохождения пакета при его перемещении от одного компьютера к другому.
  4. Динамическая маршрутизация или интеллектуальная маршрутизация (если хотите) означает, что система может автоматически изменять при необходимости маршрут, по которому следует пакет.

Расширенная настройка IP и сетевых устройств

Пакет iproute предоставляет набор инструментов для управления сетью и контроля трафика, которые мы будем использовать в этой статье, поскольку они представляют собой замену устаревших инструментов, таких как ifconfig и route.

Центральная утилита пакета iproute называется просто ip. Его основной синтаксис следующий:

ip object command

Где object может быть только одним из следующих (показаны только наиболее часто встречающиеся объекты — полный список можно найти в man ip):

  1. ссылка: сетевое устройство.
  2. адрес: адрес протокола (IP или IPv6) на устройстве.
  3. маршрут: запись таблицы маршрутизации.
  4. правило: правило в базе данных политики маршрутизации.

Тогда как команда представляет собой конкретное действие, которое можно выполнить над объектом. Вы можете запустить следующую команду, чтобы отобразить полный список команд, которые можно применить к определенному объекту:

ip object help

Например,

ip link help

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

ip link set interface {up | down}

Дополнительные примеры команды «ip» можно найти в статье «10 полезных команд «ip» для настройки IP-адреса».

Пример 1. Отключение и включение сетевого интерфейса

В этом примере мы отключим и включим eth1:

ip link show
ip link set eth1 down
ip link show

Если вы хотите снова включить eth1,

ip link set eth1 up

Вместо отображения всех сетевых интерфейсов мы можем указать один из них:

ip link show eth1

Который вернет всю информацию для eth1.

Пример 2: Отображение основной таблицы маршрутизации

Вы можете просмотреть текущую основную таблицу маршрутизации с помощью одной из следующих трех команд:

ip route show
route -n
netstat -rn

Первый столбец вывода трех команд указывает целевую сеть. Вывод команды ip Route show (после ключевого слова dev) также представляет сетевые устройства, которые служат физическими шлюзами к этим сетям.

Хотя в настоящее время команда ip предпочтительнее маршрута, вы все равно можете обратиться к man ip-route и man Route для подробного объяснения остального. из колонн.

Пример 3. Использование сервера Linux для маршрутизации пакетов между двумя частными сетями.

Мы хотим маршрутизировать пакеты icmp (ping) с dev2 на dev4 и наоборот (обратите внимание, что обе клиентские машины находятся в разных сетях). Имя каждого сетевого адаптера вместе с соответствующим адресом IPv4 указывается в квадратных скобках.

Наша тестовая среда выглядит следующим образом:

Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Давайте посмотрим таблицу маршрутизации в dev1 (блок CentOS):

ip route show

а затем измените его, чтобы использовать его сетевой адаптер enp0s3 и подключение к 192.168.0.15 для доступа к хостам в сети 10.0.0.0/24:

ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

По сути, это звучит так: «Добавьте маршрут к сети 10.0.0.0/24 через сетевой интерфейс enp0s3, используя 192.168.0.15 в качестве шлюза».

Аналогично в dev4 (коробка openSUSE) для проверки связи с хостами в сети 192.168.0.0/24:

ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

Наконец, нам нужно включить пересылку на нашем маршрутизаторе Debian:

echo 1 > /proc/sys/net/ipv4/ip_forward

Теперь пингуем:

и,

Чтобы эти настройки сохранялись при загрузке, отредактируйте /etc/sysctl.conf на маршрутизаторе и убедитесь, что для переменной net.ipv4.ip_forward установлено значение true следующим образом:

net.ipv4.ip_forward = 1

Кроме того, настройте сетевые адаптеры на обоих клиентах (найдите файл конфигурации в /etc/sysconfig/network в openSUSE и /etc/sysconfig/network-scripts в CentOS – в обоих случаях он называется ifcfg-enp0s3).

Вот файл конфигурации из коробки openSUSE:

BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
Пример 4. Использование сервера Linux для маршрутизации пакетов между частными сетями и Интернетом.

Другой сценарий, в котором компьютер с Linux можно использовать в качестве маршрутизатора, — это когда вам нужно поделиться своим подключением к Интернету с частной локальной сетью.

Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Помимо настройки пересылки пакетов и статической таблицы маршрутизации в клиенте, как в предыдущем примере, нам нужно добавить в маршрутизатор несколько правил iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Первая команда добавляет правило в цепочку POSTROUTING в таблице nat (преобразование сетевых адресов), указывающее, что сетевой адаптер eth0 должен использоваться для исходящих пакетов.

MASQUERADE указывает, что этот сетевой адаптер имеет динамический IP-адрес и что перед отправкой пакета в «дикий мир» Интернета необходимо указать частный адрес источника пакета. изменен на общедоступный IP-адрес маршрутизатора.

В локальной сети с множеством хостов маршрутизатор отслеживает установленные соединения в /proc/net/ip_conntrack, чтобы знать, куда возвращать ответ из Интернета.

Только часть вывода:

cat /proc/net/ip_conntrack

показано на следующем снимке экрана.

Где выделены источник (частный IP-адрес окна openSUSE) и пункт назначения (Google DNS) пакетов. Это был результат запуска:

curl linux-console.net

в коробке openSUSE.

Я уверен, вы уже догадались, что маршрутизатор использует Google 8.8.8.8 в качестве сервера имен, что объясняет, почему пункт назначения исходящих пакетов указывает на этот адрес.

Примечание. Входящие пакеты из Интернета принимаются только в том случае, если они являются частью уже установленного соединения (команда №2), а исходящие пакеты разрешены «свободный выход» (команда №3).

Не забудьте сделать ваши правила iptables постоянными, следуя инструкциям, описанным в Части 8 «Настройка брандмауэра Iptables» этой серии.

Динамическая маршрутизация с Quagga

В настоящее время для динамической маршрутизации в Linux чаще всего используется инструмент quagga. Это позволяет системным администраторам реализовать на относительно недорогом Linux-сервере ту же функциональность, которую обеспечивают мощные (и дорогостоящие) маршрутизаторы Cisco.

Сам инструмент не занимается маршрутизацией, а скорее изменяет таблицу маршрутизации ядра, изучая новые лучшие маршруты для обработки пакетов.

Поскольку это ответвление zebra, программы, разработка которой недавно прекратилась, по историческим причинам она сохраняет те же команды и структуру, что и zebra. Вот почему с этого момента вы увидите много упоминаний о зебре.

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

Установка Quagga в Linux

Чтобы установить Quagga в выбранный вами дистрибутив:

aptitude update && aptitude install quagga 				[On Ubuntu]
yum update && yum install quagga 					[CentOS/RHEL]
zypper refresh && zypper install quagga 				[openSUSE]

Мы будем использовать ту же среду, что и в примере №3, с той лишь разницей, что eth0 подключен к маршрутизатору основного шлюза с IP 192.168.0.1.

Затем отредактируйте /etc/quagga/daemons с помощью:

zebra=1
ripd=1

Теперь создайте следующие файлы конфигурации.

/etc/quagga/zebra.conf
/etc/quagga/ripd.conf

и добавьте эти строки (замените имя хоста и пароль по вашему выбору):

service quagga restart
hostname    	dev2
password    	quagga
service quagga restart

Примечание. ripd.conf — это файл конфигурации протокола информации о маршрутизации, который предоставляет маршрутизатору информацию о том, какие сети могут быть доступны. достигнуты и насколько далеко (с точки зрения количества прыжков) они находятся.

Обратите внимание, что это только один из протоколов, которые можно использовать вместе с Quagga, и я выбрал его для этого руководства из-за простоты использования и потому, что большинство сетевых устройств поддерживают его, хотя у него есть недостаток, связанный с передачей учетных данных в виде обычного текста. По этой причине вам необходимо назначить соответствующие разрешения для файла конфигурации:

chown quagga:quaggavty /etc/quagga/*.conf
chmod 640 /etc/quagga/*.conf 
Пример 5. Настройка Quagga для динамической маршрутизации IP-трафика.

В этом примере мы будем использовать следующую настройку с двумя маршрутизаторами (обязательно создайте файлы конфигурации для маршрутизатора №2, как описано ранее):

Важно! Не забудьте повторить следующую настройку для обоих маршрутизаторов.

Подключитесь к zebra (прослушиваем порт 2601), который является логическим посредником между маршрутизатором и ядром:

telnet localhost 2601

Введите пароль, установленный в файле /etc/quagga/zebra.conf, а затем включите настройку:

enable
configure terminal

Введите IP-адрес и маску сети каждого сетевого адаптера:

inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write

Теперь нам нужно подключиться к терминалу демона RIP (порт 2602):

telnet localhost 2602

Введите имя пользователя и пароль, настроенные в файле /etc/quagga/ripd.conf, а затем введите следующие команды, выделенные жирным шрифтом (комментарии добавлены для пояснения):

enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. 
exit
exit
write writes current configuration to configuration file.

Примечание. В обоих случаях конфигурация добавляется к строкам, которые мы добавили ранее (/etc/quagga/zebra.conf и < b>/etc/quagga/ripd.conf).

Наконец, снова подключитесь к службе zebra на обоих маршрутизаторах и обратите внимание, как каждый из них «изучил» маршрут к сети, которая находится за другим, и какой следующий переход к ней. сети, выполнив команду show ip Route:

show ip route

Если вы хотите попробовать разные протоколы или настройки, вы можете обратиться к сайту проекта Quagga для получения дополнительной документации.

Заключение

В этой статье мы объяснили, как настроить статическую и динамическую маршрутизацию с помощью маршрутизаторов Linux. Не стесняйтесь добавлять столько маршрутизаторов, сколько захотите, и экспериментируйте столько, сколько захотите. Не стесняйтесь обращаться к нам, используя контактную форму ниже, если у вас есть какие-либо комментарии или вопросы.