Настройка сетей в Linux на виртуальных машинах.
💡 Нажми сюда, чтобы поделиться с нами обратной связью на этот проект. Это анонимно и поможет нашей команде сделать обучение лучше. Рекомендуем заполнить опрос сразу после выполнения проекта.
- Chapter I
- Chapter II
2.1. Стек протоколов TCP IP
2.2. Адресация
2.3. Маршрутизация - Chapter III
3.1. Инструмент ipcalc
3.2. Статическая маршрутизация между двумя машинами
3.3. Утилита iperf3
3.4. Сетевой экран
3.5. Статическая маршрутизация сети
3.6. Динамическая настройка IP с помощью DHCP
3.7. NAT
3.8. Допополнительно. Знакомство с SSH Tunnels - Chapter IV
Планета Земля, джаз-клуб Seb's, наши дни.
> В баре играет новая джаз-группа. Их музыка чуть энергичнее, чем ты привык, но в таланте им не откажешь.
— Себастьян, ты просидел уже неделю за столом в офисе. Как считаешь, ты научился работать в Linux? Впрочем, учитывая, что ты опять мне позвонил посреди недели, думаю, я и так знаю ответ...
— Постепенно разбираюсь, но явно не так быстро, как хотелось бы.
— Готов ли ты завтра выйти на работу?
— Я не понимаю, не понимаю, дружище. Мне говорят: займись настройкой сетей. Но для меня это просто слова. Мне хочется встретиться с прошлым собой, тем глупым юнцом, который согласился на работу сисадмина, и отговорить его, объяснить, что к чему, но я уже не могу. Что же делать, друг?
— Ну-ну, не отчаивайся. Настройка сетей не так уж и страшна. Я с радостью расскажу тебе о ней, если ответишь на один вопрос: почему твой отец вообще устроил тебя именно сисадмином? Мы ведь в его баре сидим, почему не сюда? Это куда уж легче.
— Понятия не имею, кто ж разберет старика. Болтает что-то про самостоятельность и расширение кругозора...
— Хорошо, тогда продолжим расширять твой кругозор. Доставай ноутбук, поднимай виртуальную машину, покажу, что да как.
> Новичков сменяют постоянные музыканты бара, музыка замедляется, официант все никак не несет ваш заказ.
> Пока Себастьян неуверенно поднимает виртуальную машину, ты решаешь поделиться основной информацией о сетях на Linux.
Собственно, что есть сеть? Сеть — это соединение как минимум двух компьютеров с помощью каких-либо каналов связи или, в более сложных случаях, с помощью некоторого сетевого оборудования. Обмен данными между ними осуществляется по определенным правилам, и эти правила «диктуются» стеком протоколов TCP/IP.
Transmission Control Protocol/Internet Protocol (Стек протоколов TCP/IP) — если говорить простым языком, это набор взаимодействующих протоколов разных уровней (каждый уровень взаимодействует с соседним, то есть состыковывается, поэтому и стек), согласно которым происходит обмен данными в сети. Итого, стек протоколов TCP/IP — это набор наборов правил :) Тут может возникнуть резонный вопрос: а зачем же иметь много протоколов? Неужели нельзя обмениваться всем по одному протоколу?
Все дело в том, что каждый протокол описывает строго отведенные ему правила. Кроме того, протоколы разделены по уровням функциональности, что позволяет работе сетевого оборудования и программного обеспечения становиться гораздо проще, прозрачнее и выполнять «свой» круг задач. Для разделения данного набора протоколов по уровням была разработана модель сетевого взаимодействия OSI (англ. Open Systems Interconnection Basic Reference Model, 1978 года, она же — базовая эталонная модель взаимодействия открытых систем). Модель OSI состоит из семи различных уровней. Уровень отвечает за отдельный участок в работе коммуникационных систем, не зависит от рядом стоящих уровней – он только предоставляет определённые услуги. Каждый уровень выполняет свою задачу в соответствии с набором правил, называемым протоколом.
В сети, построенной на стеке протоколов TCP/IP, каждому хосту (компьютеру или устройству подключенному к сети) присвоен IP-адрес. IP-адрес представляет собой 32-битовое двоичное число. Удобной формой записи IP-адреса (IPv4) является запись в виде четырёх десятичных чисел (от 0 до 255), разделённых точками, например, 192.168.0.1. В общем случае, IP-адрес делится на две части: адрес сети (подсети) и адрес хоста:
Как видно из иллюстрации, есть такое понятие, как сеть и подсеть. Думаю, из значений слов понятно, что IP-адреса делятся на сети, а сети, в свою очередь, делятся на подсети с помощью маски подсети (корректнее будет сказать: адрес хоста может быть разбит на подсети).
Кроме адреса хоста в сети TCP/IP есть такое понятие, как порт. Порт является числовой характеристикой какого-то системного ресурса. Порт выделяется приложению, выполняемому на некотором сетевом хосте, для связи с приложениями, выполняемыми на других сетевых хостах (в том числе с другими приложениями на этом же хосте). С программной точки зрения, порт — это область памяти, которая контролируется каким-либо сервисом.
IP-протокол находится ниже TCP и UDP в иерархии протоколов и отвечает за передачу и маршрутизацию информации в сети. Для этого протокол IP заключает каждый блок информации (пакет TCP или UDP) в другой пакет — IP-пакет или дейтаграмма IP, который хранит заголовок об источнике, получателе и маршруте.
Если провести аналогию с реальным миром, то сеть TCP/IP — это город. Названия улиц и проулков — это сети и подсети. Номера строений — это адреса хостов. В строениях, номера кабинетов/квартир — это порты. Точнее, порты — это почтовые ящики, в которые ожидают прихода корреспонденции получатели (службы). Соответственно, номера портов кабинетов 1,2 и т. п. обычно отдаются директорам и руководителям, как привилегированным, а рядовым сотрудникам достаются номера кабинетов с большими цифрами. При отправке и доставке корреспонденции, информация упаковывается в конверты (ip-пакеты), на которых указывается адрес отправителя (IP и порт) и адрес получателя (IP и порт).
Следует отметить, что протокол IP не имеет представления о портах, за интерпретацию портов отвечает TCP и UDP, по аналогии TCP и UDP не обрабатывают IP-адреса.
Может возникнуть вопрос, а как же один компьютер соединится с другим? Откуда он знает, куда посылать пакеты?
Для разрешения этого вопроса сети между собой соединены шлюзами (маршрутизаторами). Шлюз — это тот же хост, но имеющий соединение с двумя и более сетями, который может передавать информацию между сетями и направлять пакеты в другую сеть. На рисунке роль шлюза выполняет pineapple и papaya, имеющих по 2 интерфейса, подключенные к разным сетям.
Чтобы определить маршрут передачи пакетов, IP использует сетевую часть адреса (маску подсети). Для определения маршрута, на каждой машине в сети имеется таблица маршрутизации (routing table), которая хранит список сетей и шлюзов для этих сетей. IP «просматривает» сетевую часть адреса назначения в проходящем пакете и, если для этой сети есть запись в таблице маршрутизации, то пакет отправляется на соответствующий шлюз.
В Linux ядро операционной системы хранит таблицу маршрутизации в файле /proc/net/route.
Просмотреть текущую таблицу маршрутизации можно командой netstat -rn (r — routing table, n — не преобразовывать IP в имена), route или ip r.
Пример таблицы маршрутизации для хоста eggplant:
[root@eggplant ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
128.17.75.0 128.17.75.20 255.255.255.0 UN 1500 0 0 eth0
default 128.17.75.98 0.0.0.0 UGN 1500 0 0 eth0
127.0.0.1 127.0.0.1 255.0.0.0 UH 3584 0 0 lo
128.17.75.20 127.0.0.1 255.255.255.0 UH 3584 0 0 lo
Значения колонок:
- Destination — адреса сетей (хостов) назначения. При этом, при указании сети, адрес обычно заканчивается на ноль;
- Gateway — адрес шлюза для указанного в первой колонке хоста/сети. Третья колонка — маска подсети, для которой работает данный маршрут;
- Flags — информация об адресе назначения (U — маршрут работает, N — маршрут для сети, H — маршрут для хоста и т. п.);
- MSS — число байтов, которое может быть отправлено за 1 раз;
- Window — количество фреймов, которое может быть отправлено до получения подтверждения;
- irtt — статистика использования маршрута;
- Iface — указывает сетевой интерфейс, используемый для маршрута (eth0, eth1 и т. п.).
> Как и в прошлый раз, ещё больше полезной информации ты найдешь в папке materials.
В качестве результата работы ты должен представить отчет по выполненным задачам. В каждой части задания указано, что должно быть помещено в отчёт после её выполнения. Это могут быть ответы на вопросы, скриншоты и т. д.
- В репозиторий, в папку src, должен быть загружен отчёт с расширением .md.
- В отчёте должны быть выделены все части задания как заголовки 2-го уровня.
- В рамках одной части задания всё, что помещается в отчёт, должно быть оформлено в виде списка.
- Каждый скриншот в отчёте должен быть кратко подписан (что показано на скриншоте).
- Все скриншоты обрезаны так, чтобы была видна только нужная часть экрана.
- На одном скриншоте допускается отображение сразу нескольких пунктов задания, но они все должны быть описаны в подписи к скриншоту.
- На все виртуальные машины, созданные в процессе выполнения задания, устанавливай Ubuntu 20.04 Server LTS.
Список утилит: ipcalc, ip, netplan, netstat, iperf3, iptables, ping, nmap, sysctl, tcpdump, traceroute, systemctl, telnet, dhclient.
- Итак, начнём наше погружение в удивительный мир сетей со знакомства с IP-адресами. А использовать для этого мы будем инструмент ipcalc.
== Задание ==
2) Перевод маски 255.255.255.0 в префиксную и двоичную запись, /15 в обычную и двоичную, 11111111.11111111.11111111.11110000 в обычную и префиксную
3) Минимальный и максимальный хост в сети 12.167.38.4 при масках: /8, 11111111.11111111.00000000.00000000, 255.255.254.0 и /4
Определи и запиши в отчёт, можно ли обратиться к приложению, работающему на localhost, со следующими IP: 194.34.23.100, 127.0.0.2, 127.1.0.1, 128.0.0.1
1) Какие из перечисленных IP можно использовать в качестве публичного, а какие только в качестве частных: 10.0.0.45, 134.43.0.2, 192.168.4.2, 172.20.250.4, 172.0.2.1, 192.172.0.1, 172.68.0.2, 172.16.255.255, 10.10.10.10, 192.169.168.1
2) Какие из перечисленных IP-адресов шлюза возможны у сети 10.10.0.0/18: 10.0.0.1, 10.10.0.2, 10.10.10.10, 10.10.100.1, 10.10.1.255
- Теперь разберёмся, как связать две машины, используя статическую маршрутизацию.
== Задание ==
- В отчёт помести скрин с вызовом и выводом использованной команды.
Опиши сетевой интерфейс, соответствующий внутренней сети, на обеих машинах и задай следующие адреса и маски: ws1 — 192.168.100.10, маска /16, ws2 — 172.24.116.8, маска /12.
- В отчёт помести скрины с содержанием изменённого файла etc/netplan/00-installer-config.yaml для каждой машины.
- В отчёт помести скрин с вызовом и выводом использованной команды.
- В отчёт помести скрин с вызовом и выводом использованных команд.
Добавь статический маршрут от одной машины до другой с помощью файла /etc/netplan/00-installer-config.yaml.
- В отчёт помести скрин с содержанием изменённого файла /etc/netplan/00-installer-config.yaml.
- В отчёт помести скрин с вызовом и выводом использованной команды.
- Теперь, когда мы связали две машины, ответь мне: что самое важное при передаче информации между машинами?
- Скорость соединения?
- Всё верно. Будем её проверять с помощью утилиты iperf3.
== Задание ==
В данном задании используются виртуальные машины ws1 и ws2 из Части 2
- В отчёт помести скрины с вызовом и выводом использованных команд.
- После соединения машин перед нами стоит следующая задача: контролировать информацию, проходящую по соединению. Для этого используются сетевые экраны.
== Задание ==
В данном задании используются виртуальные машины ws1 и ws2 из Части 2
#!/bin/sh
# Удаление всех правил в таблице «filter» (по умолчанию).
iptables -F
iptables -X1) На ws1 примени стратегию, когда в начале пишется запрещающее правило, а в конце пишется разрешающее правило (это касается пунктов 4 и 5).
2) На ws2 примени стратегию, когда в начале пишется разрешающее правило, а в конце пишется запрещающее правило (это касается пунктов 4 и 5).
- В отчёт помести скрины с содержанием файла /etc/firewall для каждой машины.
- В отчёт помести скрины с запуском обоих файлов.
- В отчёте опиши разницу между стратегиями, применёнными в первом и втором файлах.
Командой ping найди машину, которая не «пингуется», после чего утилитой nmap покажи, что хост машины запущен.
Проверка: в выводе nmap должно быть сказано: Host is up.
- В отчёт помести скрины с вызовом и выводом использованных команд ping и nmap.
P.S. Ни в коем случае не сохраняй дампы в гит!
- Пока что мы соединяли всего две машины, но теперь пришло время для статической маршрутизации целой сети.
== Задание ==
- В отчёт помести скрины с содержанием файла etc/netplan/00-installer-config.yaml для каждой машины.
Перезапусти сервис сети. Если ошибок нет, командой ip -4 a проверь, что адрес машины задан верно. Также пропингуй ws22 с ws21. Аналогично пропингуй r1 с ws11.
- В отчёт помести скрины с вызовом и выводом использованных команд.
sysctl -w net.ipv4.ip_forward=1
При таком подходе переадресация не будет работать после перезагрузки системы.
- В отчёт помести скрин с вызовом и выводом использованной команды.
net.ipv4.ip_forward = 1
При использовании этого подхода, IP-переадресация включена на постоянной основе.
- В отчёт помести скрин с содержанием изменённого файла /etc/sysctl.conf.
Пример вывода команды ip r после добавления шлюза:
default via 10.10.0.1 dev eth0
10.10.0.0/18 dev eth0 proto kernel scope link src 10.10.0.2
Настрой маршрут по умолчанию (шлюз) для рабочих станций. Для этого добавь default перед IP-роутера в файле конфигураций.
- В отчёт помести скрин с содержанием файла etc/netplan/00-installer-config.yaml;
- В отчёт помести скрин с вызовом и выводом использованной команды.
tcpdump -tn -i eth0
- В отчёт помести скрин с вызовом и выводом использованных команд.
Добавь в роутеры r1 и r2 статические маршруты в файле конфигураций. Пример для r1 маршрута в сетку 10.20.0.0/26:
# Добавь в конец описания сетевого интерфейса eth1:
- to: 10.20.0.0
via: 10.100.0.12- В отчёт помести скрины с содержанием изменённого файла etc/netplan/00-installer-config.yaml для каждого роутера.
10.100.0.0/16 dev eth1 proto kernel scope link src 10.100.0.11
10.20.0.0/26 via 10.100.0.12 dev eth1
10.10.0.0/18 dev eth0 proto kernel scope link src 10.10.0.1
- В отчёт помести скрин с вызовом и выводом использованной команды.
ip r list 10.10.0.0/[маска сети] и ip r list 0.0.0.0/0
- В отчёт помести скрин с вызовом и выводом использованных команд;
- В отчёте объясни, почему для адреса 10.10.0.0/[маска сети] был выбран маршрут, отличный от 0.0.0.0/0, хотя он попадает под маршрут по умолчанию.
Пример вывода утилиты traceroute после добавления шлюза:
1 10.10.0.1 0 ms 1 ms 0 ms
2 10.100.0.12 1 ms 0 ms 1 ms
3 10.20.0.10 12 ms 1 ms 3 ms
tcpdump -tnv -i eth0
- В отчёт помести скрины с вызовом и выводом использованных команд (tcpdump и traceroute);
- В отчёте, опираясь на вывод, полученный из дампа на r1, объясни принцип работы построения пути при помощи traceroute.
tcpdump -n -i eth0 icmp
ping -c 1 10.30.0.111
- В отчёт помести скрин с вызовом и выводом использованных команд.
P.S. Ни в коем случае не сохраняй дампы в гит!
- Следующим нашим шагом будет более подробное знакомство со службой DHCP, которую ты уже знаешь.
== Задание ==
В данном задании используются виртуальные машины из Части 5.
1) Укажи адрес маршрутизатора по умолчанию, DNS-сервер и адрес внутренней сети. Пример файла для r2:
subnet 10.100.0.0 netmask 255.255.0.0 {}
subnet 10.20.0.0 netmask 255.255.255.192
{
range 10.20.0.2 10.20.0.50;
option routers 10.20.0.1;
option domain-name-servers 10.20.0.1;
}- В отчёт помести скрины с содержанием изменённых файлов.
Перезагрузи службу DHCP командой systemctl restart isc-dhcp-server. Машину ws21 перезагрузи при помощи reboot и через ip a покажи, что она получила адрес. Также пропингуй ws22 с ws21.
- В отчёт помести скрины с вызовом и выводом использованных команд.
Укажи MAC-адрес у ws11, для этого в etc/netplan/00-installer-config.yaml надо добавить строки: macaddress: 10:10:10:10:10:BA, dhcp4: true.
- В отчёт помести скрин с содержанием изменённого файла etc/netplan/00-installer-config.yaml.
Для r1 настрой аналогично r2, но сделай выдачу адресов с жесткой привязкой к MAC-адресу (ws11). Проведи аналогичные тесты.
- В отчёте этот пункт опиши аналогично настройке для r2.
- В отчёте помести скрины IP до и после обновления.
- В отчёте опиши, какими опциями DHCP сервера пользовался в данном пункте.
P.S. Ни в коем случае не сохраняй дампы в гит!
- Ну и в конце в качестве вишенки на торте я расскажу тебе про механизм преобразования адресов.
== Задание ==
В данном задании используются виртуальные машины из Части 5.
В файле /etc/apache2/ports.conf на ws22 и r1 измени строку Listen 80 на Listen 0.0.0.0:80, то есть сделай сервер Apache2 общедоступным.
- В отчёт помести скрин с содержанием изменённого файла.
- В отчёт помести скрины с вызовом и выводом использованной команды.
При запуске файла с этими правилами, ws22 не должна «пинговаться» с r1.
- В отчёт помести скрины с вызовом и выводом использованной команды.
При запуске файла с этими правилами, ws22 должна «пинговаться» с r1.
- В отчёт помести скрины с вызовом и выводом использованной команды.
5) Включи SNAT, а именно маскирование всех локальных IPиз локальной сети, находящейся за r2 (по обозначениям из Части 5 — сеть 10.20.0.0).
Совет: стоит подумать о маршрутизации внутренних пакетов, а также внешних пакетов с установленным соединением.
6) Включи DNAT на 8080 порт машины r2 и добавить к веб-серверу Apache, запущенному на ws22, доступ извне сети.
Совет: стоит учесть, что при попытке подключения возникнет новое tcp-соединение, предназначенное ws22 и 80 порту.
- В отчёт помести скрин с содержанием изменённого файла.
Перед тестированием рекомендуется отключить сетевой интерфейс NAT (его наличие можно проверить командой ip a) в VirtualBox, если он включен.
telnet [адрес] [порт]
Проверь соединение по TCP для DNAT: для этого с r1 подключиться к серверу Apache на ws22 командой telnet (обращаться по адресу r2 и порту 8080).
- В отчёт помести скрины с вызовом и выводом использованных команд.
P.S. Ни в коем случае не сохраняй дампы в гит!
- Пожалуй, на этом у меня всё. Может, у тебя появились ещё какие-то вопросы?
- Да, я хотел спросить ещё об одной вещи. На работе я краем уха услышал, что в моей компании есть некие проекты по обучению. Подробностей я не знаю, но очень хочется взглянуть... Вдруг будет полезно.
- Действительно интересно, но как в этом помогу тебе я?
- Дело в том, что, чтобы добраться до этих проектов, нужно получить доступ к закрытой сети. Можешь посоветовать что-нибудь по этому поводу?
- Ну ты, конечно, даёшь... Не уверен на все сто, что это поможет, но могу рассказать тебе про SSH Tunnels.
== Задание ==
В данном задании используются виртуальные машины из Части 5.
Запусти веб-сервер Apache на ws22 только на localhost (то есть в файле /etc/apache2/ports.conf измени строку Listen 80 на Listen localhost:80).
Воспользуйся Local TCP forwarding с ws21 до ws22, чтобы получить доступ к веб-серверу на ws22 с ws21.
Воспользуйся Remote TCP forwarding c ws11 до ws22, чтобы получить доступ к веб-серверу на ws22 с ws11.
Для проверки, сработало ли подключение в обоих предыдущих пунктах, перейди во второй терминал (например, клавишами Alt + F2) и выполни команду:
telnet 127.0.0.1 [локальный порт]
- В отчёте опиши команды, необходимые для выполнения этих четырёх пунктов, а также приложи скриншоты с их вызовом и выводом.
P.S. Ни в коем случае не сохраняй дампы в гит!
- Спасибо тебе большое за помощь!
- Всегда пожалуйста! Мне тоже было не лишним вспомнить основы администрирования. Я решил освоить что-нибудь новое и заняться DevOps'ом.
- Ого! Уже нашёл, куда устроиться?
- Да, правда, придётся переехать. Так что в следующий раз тебе придётся осваивать все самому.
- Рано или поздно мне всё равно пришлось бы начать, так что, может, это только к лучшему. Потом обязательно созвонимся — расскажешь о своих успехах!
- А ты о своих!
> Ты ещё какое-то время болтаешь с Себастьяном на отвлеченные темы, слушая приятную музыку и допивая заказанный напиток, после чего прощаешься...



