Лаборатория Как работает сеть во время тренировок SiBears

dmitrisimus
, 04 December 2014

В данном документе описывается устройство сети во время тренировок SiBears. Это не единственный вариант настройки сети, и даже не самый простой, но зато очень наглядный.

1 Работа сети в обычном режиме

В обычном режиме работы сеть кафедры работает так, как показано на рис. 1: все компьютеры находятся в сети 192.168.0.0/16, адрес маршрутизатора — 192.168.43.102. Можно для простоты считать, что все компьютеры на кафедре, включая подключенные по WiFi ноутбуки, соединены одним коммутатором (хотя это не так).

isc network

Допустим, что вы подключены к кафедральной сети на компьютере с Linux, вам видны другие компьютеры сети (ping 192.168.43.102) и компьютеры за пределами сети (ping tsu.ru).

Если вы выполните команду «ip a», чтобы посмотреть текущие настройки сетевых интерфейсов, то увидите приблизительно следующее:

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    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
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:9f:f3:8f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.130/16 brd 10.10.10.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe9f:f38f/64 scope link
       valid_lft forever preferred_lft forever

Если вы выполните команду «ip r», чтобы посмотреть текущие маршруты, то увидите приблизительно следующее:

$ ip r
default via 192.168.43.102 dev eth0
192.168.0.0/16 dev eth0  proto kernel  scope link  src 192.168.0.130

В данной таблице слева указано правило, с которым сравнивается адрес назначения исходящих пакетов компьютера. 192.168.0.0/16 означает правило для всех адресов назначения, у которых первые два байта (16 бит) — это 192.168. Слово default — это псевдоним для правила 0.0.0.0/0, т.е. правило, соответствующее любому пакету. Вообще, оба правила соответствуют пакету, отправляемому, например, на 192.168.204.1, но всегда берётся правило, более точно совпадающее с адресом назначения. Т.е. в этом случае будет выбрано второе правило из таблицы выше.

Из этих данных выводы следующие:

  • к сети подключен интерфейс eth0
  • интерфейсу eth0 назначен адрес 192.168.0.130/16
  • если компьютер хочет отправить данные в сеть 192.168.0.0/16, то он это делает через интерфейс eth0
  • если компьютер хочет отправить данные в любую другую сеть, то он просит компьютер с адресом 192.168.43.102 сделать это за него

Есть ещё одна настройка — это адрес DNS-сервера, используемого компьютером для замены доменных адресов вида sibears.ru на IP-адреса вида 92.63.71.187. Во многих вариантах Linux эта настройка хранится в файле /etc/resolv.conf:

$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.109.100

Кстати, в большинстве случаев подойдёт 8.8.8.8 в качестве DNS-сервера.

1.1 Как настроить компьютер для работы в сети

Когда не проводятся тренировки, компьютер можно настроить одним из двух способов:

  • использовать сервис DHCP для автоматической настройки сети
  • настроить всё вручную

Автоматически настроить сеть в данном случае можно, например, следующей командой:

$ sudo dhclient eth0

Ещё, если у вас Debian или Ubuntu, можно написать в файле /etc/network/interfaces следующее:

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

После этого нужно выполнить команду «sudo ifup eth0».

Вручную сеть можно настроить либо следующей последовательностью команд:

$ sudo ip a add 192.168.0.130/16 dev eth0 # адрес компьютера в сети
$ sudo ip r add default via 192.168.43.102 # маршрут по умолчанию
$ sudo sh -c 'echo "nameserver 192.168.109.100" > /etc/resolv.conf' # DNS-сервер

Также можно настроить это с помощью файла /etc/network/interfaces:

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.0.130
    netmask 255.255.0.0
    gateway 192.168.43.102
    dns-nameservers 192.168.109.100

Замечания:

  • адрес 192.168.0.130 приводится просто для демонстрации, вам нужно придумать какой-нибудь незанятый адрес для ввода параметров вручную
  • в качестве DNS-сервера всегда можно использовать 8.8.8.8 вместо 192.168.109.100, если последний, по какой-то причине не доступен
  • имя интерфейса у вас может отличаться (например, на виртуальных машинах при многократном копировании появляютя eth1, eth2 и т.д.)
  • для WiFi всё похоже, но там перед настройками параметров сети нужно ещё настроить интерфейс и подключить его к нужной WiFi сети

2 Работа сети во время тренировок

Во время тренировок конфигурация сети меняется. Каждая команда должна находиться в своём собственном сегменте сети, например, как на рис. 2.

trainings network

Машины 10.0.204.3/24 и 10.0.203.3/24 настраиваются аналогично тому, как настраивается компьютер для работы в сети в нормальных условиях, со следующими изменениями:

  • в ауд. 203 адреса компьютеров нужно брать из диапазона 10.0.203.0/24, в ауд. 204 — из диапазона 10.0.204.0/24
  • первый компьютер в каждой игровой подсети — маршрутизатор (10.0.203.1/24 и 10.0.204.1/24)
  • третий компьютер в каждой игровой подсети — игровой образ (10.0.203.3/24 и 10.0.204.3/24)
  • обычно маршрутизаторы игровых подсетей обеспечивают маршрутизацию в сеть кафедры и в интернет, поэтому можно устанавливать их маршрутами по умолчанию

Соответственно, настройка вручную будет выглядеть следующим образом (для ауд. 203):

$ sudo ip a add 10.0.203.141/24 dev eth0
$ sudo ip r add default via 10.0.203.1
$ sudo sh -c 'echo "nameserver 192.168.109.100" > /etc/resolv.conf'

Чаще всего на машртутизаторах игровых подсетей будет настроен DHCP-сервер, что позволит настраивать сеть автоматически:

$ sudo dhclient eth0

Более интересная задача — настройка маршрутизаторов игровых подсетей (которые, по совместительству, являются DHCP-серверами). Основные задачи при этом такие:

  1. Настроить адреса сетевых интерфейсов маршрутизаторов. У каждого маршрутизатора два интерфейса. Настраивать нужно статически (без использования DHCP), т.к. маршруты нужно будет указывать статические, и важно, чтобы адреса не поменялись.
  2. Настроить маршрут по умолчанию и маршрут в другую игровую сеть (для маршрутизатора A это 10.0.203.0/24, для B — 10.0.204.0/24).
  3. Разрешить маршрутизацию трафика через этот компьютер.
  4. Настроить NAT для доступа в сеть 192.168.0.0/16 и в интернет.
  5. Настроить DHCP-сервер для компьютеров в соответствующих игровых подсетях.

Для примера рассмотрим машину A и будем предполагать, что интерфейс eth0 подключен к кафедральной сети, а eth1 — к игровой подсети (для маршрутизатора B действия будут аналогичными с точностью до адресов).

2.1 Настройка адресов

Изменяем файл /etc/network/interfaces:

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.204.1
    netmask 255.255.0.0
    gateway 192.168.43.102
    dns-nameservers 192.168.109.100

auto eth1
iface eth1 inet static
    address 10.0.204.1
    netmask 255.255.255.0

Здесь всё должно быть понятно из предыдущих объяснений.

2.2 Настройка маршрутов

Машрут по умолчанию уже указан в файле /etc/network/interface, а маршруты в кафедральную сеть и игровую подсеть будут автоматически добавлены после назначения адресов интерфейсам. Соответственно, осталось только добавить маршрут в другую игровую сеть:

$ ip r add 10.0.203.0/24 via 192.168.203.1

Чтобы сделать так, чтобы этот маршрут был настроен при выключении или перезагрузке компьютера, можно добавить одну строчку в /etc/network/interfaces, в секцию для интерфейса eth0, например. После обновления она будет выглядеть следующим образом:

$ cat /etc/network/interfaces
...
auto eth0
iface eth0 inet static
    address 192.168.204.1
    netmask 255.255.0.0
    gateway 192.168.43.102
    dns-nameservers 192.168.109.100
    post-up ip r add 10.0.203.0/24 via 192.168.203.1
...

Данная строчка (post-up) выполняет действие после включения интерфейса eth0. В данном случае это действие — добавление маршрута. У одного интерфейса может быть несколько post-up действий.

2.3 Разрешение маршрутизации

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

$ cat /proc/sys/net/ipv4/ip_forward

Если в файле лежит 0, маршрутизация запрещена, 1 — разрешена.

Включить маршрутизацию можно, например, командой:

$ sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

Альтернативно, можно изменить этот параметр в конфигурационном файле /etc/sysctl.conf. Для этого нужно раскомментировать строку

$ sudo cat /etc/sysctl.conf
...
#net.ipv4.ip_forward=1
...

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

$ sudo sysctl -p /etc/sysctl.conf

Она перечитает файл с параметрами ядра и соответственно изменит их.

2.4 Настройка NAT

Технология NAT нужна, чтобы маскировать трафик из внутренних сетей с помощью адреса маршрутизатора. С её помощью весь исходящий трафик из кафедральной сети представляется трафиком с адреса 92.63.71.186 (внешнего адреса маршрутизатора).

В нашем случае NAT необходим также, чтобы из игровых подсетей можно было обращаться к хостам кафедральной сети. Допустим, с адреса 10.0.204.133 отправляется пакет на 192.168.109.100. В принципе, он маршрутизируется A к нужному компьютеру, но, поскольку 192.168.109.100 ничего не знает про сеть 10.0.204.0/24, он не знает, через какой маршрутизатор отправить ответ. Если используется NAT, то, после выбора маршрута, A заменит адрес источника в IP-заголовке и порт источника в TCP-заголовке на свой внешний адрес и свободный порт (например, 10.0.204.133:tcp44121 на 192.168.204.1:tcp51411) и запомнит это соответствие. В свою очередь, 192.168.109.100 и 192.168.204.1 находятся в одной сети, и 192.168.109.100 знает, как ответить 192.168.204.1. После этого A заменяет в пакете, полученном в ответ, свои адрес и порт (192.168.204.1:tcp51411) на те, которые находятся в соответствии с ними и запомнены ранее (10.0.204.133:tcp44121) и после этого отдаёт этот пакет в процедуру маршрутизации. Таким образом, 10.0.204.133 получит ответ от 192.168.109.100, правда, он не знает, что этот пакет был отослан от имени 192.168.204.1, а 192.168.109.100 не знает, что он отвечал, на самом деле, не 192.168.204.1, а 10.0.204.133.

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

$ sudo iptables -t nat -A POSTROUTING -s 10.0.204.0/24 ! -d 10.0.0.0/16 -j SNAT --to-source 192.168.204.1

Эта команда будет производить замену адресов и портов в пакетах, идущих с адресов в диапазоне 10.0.204.0/24 и не на адреса из диапазона 10.0.0.0/16 (т.е. не в игровую сеть).

Чтобы сделать эту настройку постоянной (т.е. восстанавливающейся после перезагрузки и переключения), можно воспользоваться командами iptables-save и iptables-restore. Первая из них выводит на стандартный вывод всё состояние iptables, а вторая принимает такое состояние на стандартный вход и изменяет iptables в соответствии с ним.

Восстанавливающаяся настройка iptables будет выглядеть так:

$ sudo iptables -t nat -A POSTROUTING -s 10.0.204.0/24 ! -d 10.0.0.0/16 -j SNAT --to-source 192.168.204.1
$ sudo sh -c 'iptables-save > /etc/network/iptables.save'

Нужно добавить в /etc/network/interfaces pre-up действие по восстановлению настроек iptables с помощью iptables-restore. Секция eth0 после добавления указанного pre-up действия будет выглядеть следующим образом:

$ cat /etc/network/interfaces
...
auto eth0
iface eth0 inet static
    address 192.168.204.1
    netmask 255.255.0.0
    gateway 192.168.43.102
    dns-nameservers 192.168.109.100
    post-up ip r add 10.0.203.0/24 via 192.168.203.1
    pre-up iptables-restore < /etc/network/iptables.save
...

2.5 Настройка DHCP-сервера

Во-первых, нужно убедиться, что установлен пакет isc-dhcp-server (в случае Debian или Ubuntu).

Во-вторых, нужно отредактировать два файла: /etc/default/isc-dhcp-server и /etc/dhcp/dhcpd.conf.

В-третьих, нужно перезапустить DHCP-сервер: sudo service isc-dhcp-server restart.

Главная настройка в /etc/default/isc-dhcp-server — переменная INTERFACES. Она содержит имена интерфейсов, с которых будут приниматься DHCP-запросы. Эта переменная важна, т.к. на кафедре уже есть DHCP-сервер, и важно не вступить с ним в конфликт. Т.к. в игровую подсеть на каждом маршрутизаторе смотрит интерфейс eth1, настройка в файле /etc/default/isc-dhcp-server должна выглядеть следующим образом:

$ cat /etc/default/isc-dhcp-server
...
INTERFACES="eth1"
...

В файле /etc/dhcp/dhcp.conf указываются прочие параметры DHCP-сервера. Минимальная рабочая конфигурация для машины A может выглядеть следующим образом:

$ cat /etc/dhcp/dhcp.conf
option domain-name-servers 192.168.109.100;
default-lease-time 3600;
max-lease-time 7200; 
authoritative;
log-facility local7;
subnet 10.0.204.0 netmask 255.255.255.0 {
  range 10.0.204.128 10.0.204.254;
  option routers 10.0.204.1;
}

Данный конфигурационный файл указывает серверу отвечать клиентам, что DNS-сервером является 192.168.109.100, время аренды адреса по умолчанию (по истечении которого клиентом должен быть отправлен повторный запрос) — 3600 секунд, максимальное время аренды (в течение которого адрес удерживается за конкретным клиентом без перезапроса) — 7200 секунд. Адреса будут раздаваться из сети 10.0.204.0/24, но из верхней половины (с 10.0.204.128 по 10.0.204.254), т.к. в нижней половине, как правило, находятся зарезервированные для ЦТФ адреса. Также DHCP-сервер сообщает клиентам, что маршрутизатор по умолчанию для них — 10.0.204.1.