Как работают сети: что такое свитч, роутер, DNS, DHCP, NAT, VPN и ещё с десяток необходимых вещей
Тема сетей, к сожалению, весьма скучна для большинства наших коллег. Всем основным задействованным технологиям, протоколам и лучшим практикам уже несколько десятков лет, они давно окружают нас и обеспечивают взаимодействие миллиардов устройств вокруг. Даже программисты чаще всего воспринимают сеть как данность и не задумываются о том, как же она работает.
Часто бывает у наших коллег: вроде бы слова IP и DNS используют каждый день, а понимания как это всё работает нет, и как это всё пощупать вживую тоже непонятно. Такое отношение не только некорректно, но и вредно для карьеры любого уважающего себя инженера из IT. Сколько бы JS-фреймворков ты не выучил, без знания основ сетей тебя никто всерьёз воспринимать не будет. Ни одна часть инфраструктуры не должна оставаться чёрной коробкой ни для разработчиков, ни для администраторов, ни уж тем более для тебя, будущего DevOps инженера.
Целью этой статьи не является дать исчерпывающее руководство по сетям. Внутри самой статьи и в её конце я приведу множество ссылок на ресурсы, которые помогут тебе углубить полученные знания. Не ленись и кликай по всем ссылкам и читай их все.
В этом же тексте мы сфокусируемся на структуре сети, основных её компонентах и рассмотрим как они используются на практике при помощи уже освоенных нами в предущей статье виртуальных машин и libvirt/KVM в частности.
Сетевая модель OSI
В первую очередь нам нужно познакомиться с сетевой моделью OSI. Эта модель стандартизирует взаимодействие сетевых протоколов.
OSI делит коммуникацию на 7 слоёв, на каждом слое есть свои протоколы. Ты часто будешь слышать вещи в духе «это происходит на Layer 3». Вот эти слои:
- Физический уровень (physical layer)
- Канальный уровень (data link layer)
- Сетевой уровень (network layer)
- Транспортный уровень (transport layer)
- Сеансовый уровень (session layer)
- Представительский уровень или уровень представления (presentation layer)
- Прикладной уровень (application layer)
Физический уровень (physical layer)
Протоколы этого уровня отвечают за связь между железками на самом низком уровне. Непосредственная передача данных по проводам (и без проводов) описывается как раз на физическом уровне. Примеры протоколов: Wi-Fi, Bluetooth, DSL.
Канальный уровень (data link layer)
Канальный уровень отвечает за передачу данных между устройствами одной сети. Данные передаются в виде кадров (frames), в кадре указан физический адрес получателя и отправителя. Этот адрес называется MAC-адрес.
Кто же выступает в роли отправителя и получателя?
Во-первых, у каждой машины (включая твой ноут) есть NIC — Network Interface Controller. Это железка (или виртуальная железка), которая отвечает за передачу и приём кадров. У NIC есть MAC-адрес — уникальный адрес, который обычно прошит в железке, или же генерируется системой виртуализации.
Само собой, у машины может быть несколько NIC. Посмотрим интерфейсы при помощи команды ip
:
[root@localhost ~]$ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 52:54:00:05:36:e6 brd ff:ff:ff:ff:ff:ff
В данном случае, интерфейс, использующийся для связи с внешним миром по сети, — это eth0, обладающий MAC-адресом 52:54:00:05:36:e6. Но что такое lo
?
lo
— это loopback device, специальный виртуальный интерфейс, который система использует, чтобы общаться самой с собой. Благодаря lo
даже без подключения к сети локальные приложения могут взаимодействовать друг с другом.
Ты уже заметил, что из твоего компьютера не вылазят миллиарды проводов, напрямую подключённые ко всем другим компьютерам мира. Для организации сети нужны дополнительные устройства.
Например, свитч (switch).
Свитч — это такое устройство, которое формирует сеть, и в которое подключаются наши машинки через порты. Задача свитча L2 (есть ещё более продвинутые, относящиеся к L3 и даже к L7) — перенаправлять кадры от MAC отправителя к MAC получателя. Множество машин, подключенных к одному свитчу формируют локальную сеть (LAN).
Конечно, пачка серверов подключенных к одному свитчу — это весьма тривиальный способ создать сеть. А что если мы хотим объединить в одну сеть сервера, находящиеся в разных физических локациях? Или, например, хотим логически разделить сервера подключенные к одному свитчу в одной локации в разные сети?
Для таких случаев создают VLAN (виртуальную локальную сеть), которую можно реализовать, например, при помощи свитча. Работает это достаточно просто: к кадрам добавляется дополнительный заголовок с VLAN-тегом, по которому и определяется к какой сети принадлежит кадр.
Другое устройство — мост (bridge). Мост L2 используют чтобы объединить две сети, сформированные при помощи свитчей, примерно таким образом:
И свитчи и мосты (а ещё хабы (hub), о которых почитай сам) помогают объединить несколько машин в одну сеть. А есть ещё маршрутизаторы (или роутеры, routers), которые соединяют сети между собой и работают уже на L3. Например, твой Wi-Fi роутер соединяет твою локальную сеть (в которой находятся твой ноутбук, телефон и планшет) с Интернетом.
Помимо LAN разделяют ещё несколько типов сетей. Например, WAN. Интернет можно считать за WAN, за тем исключением, что Интернет полностью стирает географические границы сети.
Как я уже упомянул, есть ещё свитчи L3, которые могут не просто перенаправлять кадры от одного устройства к другому, но и обладают более продвинутыми фишками, типа маршрутизации. Чем же отличается роутер от свитча L3, спросишь ты? Тут всё сложно (и скучно), но если тебе интересно, то прочитай статью Layer 3 Switches compared to Routers
Сетевой уровень (network layer)
На третьем, сетевом уровне используются не MAC, а IP адреса. Посмотрим IP адрес нашей машины при помощи той же самой команды ip
:
[root@localhost ~]$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 qlen 1000 link/ether 52:54:00:05:36:e6 brd ff:ff:ff:ff:ff:ff inet 192.168.122.212/24 brd 192.168.122.255 scope global dynamic eth0 valid_lft 2930sec preferred_lft 2930sec inet6 fe80::5054:ff:fe05:36e6/64 scope link valid_lft forever preferred_lft forever
Интерфейсу eth0
присвоен адрес 192.168.122.212/24.
Но что такое /24
? И почему у loopback интерфейса стоит /8
? Ты уже, наверное, слышал, что всего существует 4 294 967 296 IPv4 адресов. Интернет — это не одна большая сеть, а много сетей поменьше. При этом для отдельных типов сетей (например, частных, недоступных извне сетей) выделены отдельные блоки IP адресов.
IPv6 адресов гораздо больше. Но полный переход IPv6 ещё не произошёл 🙂
CIDR — это метод выделения блоков адресов отдельным сетям. А CIDR-нотация — это способ описать этот блок в виде 192.168.122.212/24
, где число /24
, называемое маской, как раз и позволяет понять, сколько адресов входит в этот блок.
IPv4 — это простое число длинной 32 бита, которое можно представить в двоичном виде. В двоичной форме IP адреса идут от 00000000000000000000000000000000
до
. Для удобства разобьём это число на 4 части по 8 цифр: 11111111.11111111.11111111.11111111
. В привычной нам десятеричной системе этот адрес выглядит так: 255.255.255.255
.
Маска /24
может быть представлена как 255.255.255.0
, или, в двоичной системе, 11111111.11111111.11111111.00000000
. Чтобы найти первый и последний адреса сети мы можем использовать один из адресов и маску сети, применив логическое побитовое И на их двоичном представлении:
11000000.10101000.01111010.11010100
&
11111111.11111111.11111111.00000000
=
11000000.10101000.01111010.00000000
И переведём результат в человеко-читаемую форму:
— начальный адрес нашей сети. Чтобы подсчитать число доступных адресов, нужно посчитать число нулей в маске. В нашем случае нулей, или разрядов, 8. Каждый может принимать значение 1 или 0, поэтому в сумме получаем 2^8 степени, или 256 адресов. Значит, последний адрес сети будет равен 192.168.122.255
.
Вручную всё считать необязательно, можно воспользоваться калькулятором.
ARP
Мы уже знаем, что на L2 используются MAC-адреса, а на L3 — IP адреса. Должен существовать какой-то механизм, который ассоциирует MAC-адрес сервера с его IP адресом. Этот механим называется ARP (Address Resolution Protocol).
В Линуксе есть одноимённая команда arp
, которая позволит посмотреть табличку известных машине MAC-адресов и соответствующих им IP адресов:
[root@localhost]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.178.1 ether 5c:49:79:99:f3:23 C wlp3s0
В данном случае, 192.168.178.1 — это IP адрес моего Wi-Fi роутера, к которому ноутбук подключен через интерфейс wlp3s0.
Команда
arp
считается deprecated и вместо неё рекомендуется использоватьip neigh
.
Один из видов кибер-атак связан с ARP и называется ARP spoofing. Цель такой атаки — подменить MAC-адрес, ассоциированный с определённым IP, на адрес машины хакера. Как страшно жить, да?
DHCP
Но как именно у сетевого интерфейса появляется IP адрес? Один из вариантов — задать его вручную. Недостаток: ручная работа. Если руки кривые, то можно настроить дублирующиеся адреса и получить конфликт 🙂
Другой вариант: Dynamic Host Configuration Protocol (DHCP), протокол, использующийся для автоматического выставления различной конфигурации, в том числе IP-адресов.
За детальным изучением DHCP обратись к документации в RFC: https://www.ietf.org/rfc/rfc2131.txt
Для работы DHCP нужен DHCP-сервер, раздающий IP-адреса и DHCP-клиент на твоей машине, который будет запрашивать адрес для этой машины. В домашних условиях чаще всего DHCP-сервер находится на роутере.
Чтобы понять как именно работает DHCP, нам нужно отвлечься на понятие «broadcasting». Это процесс, в котором наш сервер отправляет сообщение на все сервера в сети, так как он не знает где именно находится та информация, которая ему нужна. Ближе всего такое broadcast общение к радио вещанию.
Как это происходит в случае с DHCP:
- DHCP-клиент отправляет broadcast сообщение с вопросом «Хочу IP адрес»
- DHCP-сервер его ловит и в ответ отправляет так же broadcast сообщение «У меня есть адрес x.x.x.x, хочешь его?»
- DHCP-клиент получает это сообщение и отправляет ещё одно: «Да, я хочу адрес x.x.x.x»
- DHCP-сервер отвечает «Хорошо, тогда x.x.x.x принадлежит тебе»
Вот в этом видео чуть более наглядно показан весь процесс: https://www.youtube.com/watch?v=RUZohsAxPxQ
А где хранятся настройки соединений?
Настройки сетевых подключений хранятся в /etc/sysconfig/network-scripts
. Там ты можешь отредактировать такие вещи, как способ получения IP адреса (автоматический или статичный), стартовать ли соединение автоматически при загрузке системы и т.п. Например, вот так выглядит мой конфиг для Wi-Fi-соединения:
[root@localhost network-scripts]# cat ifcfg-FRITZ-Box_7490
HWADDR=4C:34:88:54:C1:2B
ESSID="FRITZ!Box 7490"
MODE=Managed
KEY_MGMT=WPA-PSK
TYPE=Wireless
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="FRITZ!Box 7490"
UUID=55ba9218-1d2f-407d-af13-51502d542edb
ONBOOT=yes
SECURITYMODE=open
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
Обрати внимание на BOOTPROTO=dhcp
— эта опция означает, что будет использован DHCP-сервер, в том числе для получения IP адреса. Для сравнения, конфиг соединения для loopback устройства:
[root@localhost network-scripts]# cat ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
Здесь прописан статичный адрес: IPADDR=127.0.0.1
. В домашнаних условиях вместо редактирования конфигов вручную можно использовать утилиту nmcli
, либо установить пакетик NetworkManager-tui
, который предоставит удобный текстовый интерфейс прямо в консоли. В боевых условиях на серверах лучше так не делать, а использовать систему конфигурации (Puppet, Chef, Salt).
Ещё одна важная часть конфигурации: роутинг. Как понять, куда именно побежит трафик? Всё просто: достаточно посмотреть локальную таблицу роутинга при помощи команды ip r
. На момент написания этих строк я сижу в кофейне с ноутбука, который использует телефон как роутер. Вот что мне выдаёт ip r
:
default via 172.20.10.1 dev wlp3s0 proto static metric 600
172.20.10.0/28 dev wlp3s0 proto kernel scope link src 172.20.10.3 metric 600
192.168.100.0/24 dev virbr2 proto kernel scope link src 192.168.100.1
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
Как видишь, весь трафик идёт по-умолчанию на машинку с адресом 172.20.10.1
. А если выполнить ip addr show
, то можно увидеть, что у сетевого интерфейса в ноутбуке так же есть IP адрес из этой сети:
4: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4c:34:88:54:c1:2b brd ff:ff:ff:ff:ff:ff
inet 172.20.10.3/28 brd 172.20.10.15 scope global dynamic wlp3s0
valid_lft 83892sec preferred_lft 83892sec
inet6 fe80::4e34:88ff:fe54:c12b/64 scope link
valid_lft forever preferred_lft forever
Командой ip r add
можно добавлять новые пути, а командой ip r del
— удалять.
DNS
Про DNS ты наверняка слышишь не в первый раз. Простая идея: обращаться к серверу не по IP адресу (тяжело запомнить для людей), а по нормальному имени.
Самый старый и популярный DNS-сервер (тот, что хранит информацию об адресах и отвечает на запросы) — это BIND. Альтернатив тоже много, но тебе в первую очередь рекомендуется развернуть локально именно BIND.
Обязателен к прочтению материал от Cisco DNS Best Practices, Network Protections, and Attack Identification — там узнаешь не только все основы DNS, но и кучу важных рекомендаций по созданию безопасного и устойчивого DNS-сервера.
Есть возможность обновлять записи в DNS-сервере динамически. Для этого почитай про nsupdate. Ниже найдёшь ссылку на отличное руководство по настройке, включая безопасное обновление записей. Одно из интересных применений — service discovery. Поищи в Интернете, о чём это, или дождись соответствующей статьи на mkdev 😉
До появления DNS всё, что у нас было — это файлик /etc/hosts. Он и сейчас часто используется.
Рубрика «Вирусы для чайников»! Открываем /etc/hosts на компьютера друга и добавляем туда строчку
52.28.20.212 vk.com
. Хватит другу сидеть вконтакте, пусть учится разработке!
Ещё очень интересен файлик /etc/nsswitch.conf. В нём определяется в каком порядке и где искать разную информацию, в том числе где искать хосты. По-умолчанию, сначала они ищутся в /etc/hosts, а уже потом отправляется запрос в DNS-сервер.
Используемый для разрешения DNS-имён сервер, кстати, указан в /etc/resolv.conf.
Дебажить DNS проблемы удобнее всего командой dig и nslookup. Например, чтобы запросить информацию о mkdev.me у nameserver 8.8.8.8 можно сделать так:
# dig mkdev.me @8.8.8.8
; <<>> DiG 9.10.3-P4-RedHat-9.10.3-12.P4.fc23 <<>> mkdev.me @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3320
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;mkdev.me. IN A
;; ANSWER SECTION:
mkdev.me. 299 IN A 52.28.20.212
;; Query time: 355 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri May 27 12:51:04 CEST 2016
;; MSG SIZE rcvd: 53
Виртуалки
До этого момента все примеры выполнялись на локальной машине. Это, конечно, полезно для восприятия, но не так интересно. Поэтому дальше мы укрепим только что прочитанное при помощи виртуальных машин и libvirt, а заодно познакомимся с ещё парой терминов.
В первую очередь, создадим виртуалку при помощи virt-install:
sudo virt-install --name mkdev-networking-basics-1 \
--location ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso \
--initrd-inject /path/to/ks.cfg \
--extra-args ks=file:/ks.cfg \
--memory=1024 --vcpus=1 --disk size=8
По-умолчанию libvirt создаёт одну сеть:
[root@localhost]# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
Блок 192.168.0.0/16
выделен для частных сетей. libvirt выделил для своей сети блок 192.168.122.212/24
, то есть все адреса от 192.168.122.0
до 192.168.122.255
.
Чтобы посмотреть подробную информацию о конкретной сети можно использовать либо virsh net-info
, либо virsh net-dumpxml
. Вторая команда вернёт гораздо больше деталей, поэтому используем её:
[root@CentOS-72-64-minimal ~]# virsh net-dumpxml default
<network connections='1'>
<name>default</name>
<uuid>f2ee9249-6bed-451f-a248-9cd223a80702</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:83:b4:74'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
connections
показывает количество машинок, подключённых к этой сети. Подробное описание всех возможных опций этого XML-файла можно прочитать в документации libvirt. Нас же сейчас интересуют два слова: bridge и dhcp.
bridge, или устройство virbr0
, или virtual network switch — это специальное устройство, в которое подсоединяются все виртуалки этой сети. Все запросы от одной виртуалки к другой в пределах одной сети идут через этот виртуальный свитч. Для каждой сети libvirt создаёт по одному виртуальному свитчу и каждый свитч распознаётся как отдельное устройство на хост машине:
[root@localhost]# ip link show
8: virbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
link/ether 52:54:00:a8:02:f2 brd ff:ff:ff:ff:ff:ff
Создание сети в libvirt по умолчанию приравнивается к созданию виртуального свитча, к которому цепляются все виртуалки, тем самым образую локальную сеть, LAN.
Реализован свитч virbr0 при помощи Linux Bridge — технологии, изначально предназначенной как раз для создания виртуальных локальных сетей. Выполнив команду brctl show
на хост-машине можно увидеть список всех свитчей.
Linux Bridge «слегка» отличается от типичного железного свитча L2. За годы его существования к нему прилепили множество дополнительных фич, например, фильтрацию трафика и файрвол. Корректнее всего назвать его свитчем L3, но здесь ваш покорный слуга не уверен до конца.
Теперь обратим внимание на следующую секцию:
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
Здесь указан блок адресов, использующихся для виртуальных машин в этой сети. 192.168.122.1
— IP-адрес хост-машины в пределах этой виртуальной сети.
Выполнив ip r
в виртуалке увидим:
[vagrant@localhost ~]$ ip r
default via 192.168.122.1 dev eth0 proto static metric 100
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.209 metric 100
По умолчанию трафик из виртуалки во внешний мир идёт через хост-машину. В качестве забавы можешь настроить, чтобы трафик к одной виртуалке шёл через другую.
Как мы уже знаем, за назначение IP адресов отвечает служба DHCP. Libvirt использует dnsmaq для DHCP и DNS и запускает по экземпляру dnsmasq для каждой сети.
`[root@CentOS-72-64-minimal ~]# ps aux | grep dns nobody 10600 0.0 0.0 15548 856 ? S Apr01 0:02 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper root 10601 0.0 0.0 15520 312 ? S Apr01 0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
Мы можем посмотреть табличку DHCP, которая покажет нам выданные адреса:
[root@loclahost]# virsh net-dhcp-leases default
Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-------------------------------------------------------------------------------------------------------------------
2016-04-29 16:31:19 52:54:00:05:36:e6 ipv4 192.168.122.212/24 - -
Обрати внимание, что 52:54:00:05:36:e6 это MAC-адрес интерфейса eth0 нашей виртуалки.
NAT
Читая ранее про CIDR тебя могло кое-что насторожить: даже если мы разделим сеть на много блоков, то общее количество IP адресов не увеличится. На самом деле, всегда используется комбинация из частных и публичных адресов. Обычно за одним публичным адресом прячется множество машин, у каждой из которых есть свой частный адрес.
Это так же и верно для наших виртуалок. У каждой есть частный IP-адрес из блока 192.168.122.0/24
, и все они скрываются за публичным адресом хост-машины.
Хост-машина, если мы продолжаем использовать для неё свой личный ноутбук у себя дома, прячется на Wi-Fi роутером и так же не обладает собственным публичным адресом.
На первый взгляд, то, что виртуалки имеют доступ к Интернету, кажется само собой разумеющимся. Но ведь у виртуалки есть только частный адрес, недоступный вне хост машины. Публичному серверу, к которому виртуалка обращается, нужно куда-то отправлять ответ и частный IP адрес виртуалки он просто-напросто не сможет найти (на то он и частный).
Эту проблему решает NAT (Network Address Translation) — механизм преобразования IP адресов в сетевых пакетах. Обычно в пакете указан IP, откуда пакет отправлен и IP, куда пакет идёт. NAT позволяет динамически менять эти адреса и сохранять таблицу подменённых адресов.
Существует SNAT (source NAT), который и используется для наших виртуалок для доступа в Интернет. Когда пакет отправляется, то его исходящий адрес заменяется на адрес хост машины. Когда ответ от сервера назначения идёт назад, то адрес меняется с адреса хост машины на адрес виртуалки. Меняет адрес роутер.
DNAT (destination NAT) занимается примерно тем же самым, но наоборот: это когда ты обращаешься к некоему публичному адресу, за которым скрываются частные, локальные адреса.
NAT — способ по умолчанию для общения виртуалок с внешним миром. Но libvirt штука гибкая. Можно, например, цеплять виртуалки напрямую к физическому интерфейсу хоста, вместо виртуального свитча. Вариантов создания сети, на самом деле, много.
Для NAT libvirt использует iptables. Если кратко, то это инструмент, отвечающий за фильтрацию сетевых пакетов. iptables настраиваются через специальные правила (rules), которые комбинируются в цепочки (chains). Вот путём добавления таких правил libvirt и добавляет нашим виртуалкам доступ в Интернет, используя NAT. Мы вернёмся к iptables когда будем говорить о безопасности в целом.
Ещё для того чтобы на хосте работало перенаправление пакетов в настройках ядра должна быть включена опция ipforward. Включается она просто: `echo 1 > /proc/sys/net/ipv4/ipforward`
tcpdump
Пожалуй, самый незаменимый инструмент для дебаггинга сетевых проблем, а, конкретнее, трафика, который проходит через нашу машину — это tcpdump. Уметь им пользоваться обязательно. Посмотрим, например, что происходит на нашем virbr0 при перезапуске виртуалки.
Открываем консоль на хост-машине и делаем tcpdump -i virbr0
.
Открываем отдельное окошко и делаем virsh reboot #{номер_виртуалки}
.
Смотрим результат в первом окошке и видимо откуда какие запросы пришли:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on virbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:57:31.339135 IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
12:57:31.397937 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 52:54:00:e0:06:54 (oui Unknown), length 300
12:57:31.398182 IP linux.fritz.box.bootps > 192.168.122.209.bootpc: BOOTP/DHCP, Reply, length 301
12:57:31.590332 ARP, Request who-has linux.fritz.box tell 192.168.122.209, length 28
12:57:31.590373 ARP, Reply linux.fritz.box is-at 52:54:00:7e:33:23 (oui Unknown), length 28
12:57:31.590409 IP 192.168.122.209.38438 > linux.fritz.box.domain: 61342+ A? 0.centos.pool.ntp.org. (39)
12:57:31.590458 IP 192.168.122.209.38438 > linux.fritz.box.domain: 25671+ AAAA? 0.centos.pool.ntp.org. (39)
12:57:31.590618 IP linux.fritz.box.domain > 192.168.122.209.38438: 25671 0/0/0 (39)
### И так далее
Вот, например, broadcast от виртуалки: 12:57:31.397937 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 52:54:00:e0:06:54 (oui Unknown), length 300
.
Ну и заодно глянем ARP табличку:
Address HWtype HWaddress Flags Mask Iface
# ...
192.168.122.209 ether 52:54:00:e0:06:54 C virbr0
# ...
VPN
Иногда (на самом деле, очень часто) необходимо сделать так, как будто и клиент и сервер находятся в одной частной сети. Например, когда все сервисы компании находятся в закрытой сети, доступной только в офисе, и нужно дать сотрудникам удалённый доступ. Или когда у компании несколько офисов или дата центров, которые нужно соединить друг с другом так, чтобы по-прежнему не открывать всю сеть всему интернету.
По сути VPN — это вложение одного tcp/ip пакета в другой и шифрование содержимого. Получается виртуальная сеть работающая внутри реальной сети. Для виртуальных сетей создаются виртуальные сетевые устройства (tun/tap) с виртуальными же IP адресами, видимыми только внутри нашей виртуальной зашифрованной сети.
Я оставлю настройку VPN за пределами этой статьи. На совести читателя останется попробовать это сделать самостоятельно при помощи OpenVPN или strongSwan.
Мы ещё вернёмся к тебе безопасности, но ты уже можешь почитать про IPsec — этот протокол использует strongSwan.
Для самостоятельного изучения
Мы только что пробежались по самым основам сетей, но, конечно же, есть ещё с десяток технологий, которые стоит посмотреть. Погугли самостоятельно VXLAN, изучи TCP и UDP (и разберись когда какой использовать), глянь что такое ICMP. Ты постоянно будешь сталкиваться с новыми терминами, но, как и всегда, главное — усвоить основы.
Мы не поднялись до более высоких уровней модели OSI, не посмотрели различные протоколы, с которыми работают веб-приложения: HTTP(S), FTP, SSH, NTP и многие другие.
Не забывай заглядывать в RFC. Это первая остановка в поиске нужной тебе информации по сетям.
Мы, скорее всего, вернёмся к этим темам в последующих статьях. Для меня лично сложнее всего было раньше понять именно то, как всё работает на уровнях ниже уровня приложения: все эти сети, подсети, непонятные проблемы с доступом от одного сервера к другому и т.п.
Надеюсь, ты теперь чуть больше знаешь о самых основных компонентах, задействованных в сетевой коммуникации и в будущем сможешь быстрее разбираться во возникающих проблемах — так как заранее будешь знать, где и что может пойти не так.
Что дальше?
Я знаю, что дорогой читатель ждёт-недождётся, когда я начну рассказывать про Chef, Puppet, Ansible и прочие модные штуки. Но рано, пока ещё рано. Нас ждёт ещё как минимум одна статья подобного рода, в которой мы рассмотрим все возможные способы аутенфицировать и авторизовывать пользователей и сервера, тем самым сильно копнув в сторону темы безопасности в целом.
Дополнительное чтение
Как я уже говорил, тема сетей сложная, глубокая и задействует множество различных частей. Ты наверняка чувствуешь лёгкую кашу в голове. Ничего страшного! Ссылки ниже помогут тебе ещё глубже усвоить всё, что тебе нужно знать о сетях.
Что такое виртуальные сети и как они работают? VPN, VLAN, VXLAN
Автор Исхаков Максим На чтение 4 мин. Просмотров 72 Опубликовано
Виртуальная сеть обеспечивает связь между несколькими компьютерами, виртуальными машинами (ВМ), виртуальными серверами или другими устройствами в различных офисах и центрах обработки данных. В то время как физическая сеть соединяет компьютеры через кабели и другое оборудование, виртуальная сеть расширяет эти возможности, используя программное обеспечение для подключения компьютеров и серверов через интернет. В ней используются виртуализированные версии традиционных сетевых инструментов, таких как коммутаторы и сетевые адаптеры, что обеспечивает более эффективную маршрутизацию и упрощает внесение изменений в конфигурацию сети.
Виртуальная сеть позволяет устройствам функционировать с теми же возможностями, что и традиционная физическая сеть. Это означает, что центры обработки данных могут распределяться по различным физическим местоположениям и предоставлять сетевым администраторам новые и более эффективные возможности, например, легко изменять сеть без необходимости переключения или покупки большего количества оборудования; большую гибкость в подготовке сети к конкретным потребностям и приложениям; и способность перемещать рабочие нагрузки по сетевой инфраструктуре без ущерба для служб, безопасности и доступности.
На видео: VLAN – Виртуальные локальные сети
Как работает виртуальная сеть?
Виртуальная сеть соединяет виртуальные машины и устройства, независимо от их местоположения, с помощью программного обеспечения. В физической сети, функции модели OSI (стек сетевых протоколов OSI/ISO) выполняются в пределах физических коммутаторов и маршрутизаторов. Кроме того, физические сетевые интерфейсные карты (NIC) и сетевые адаптеры используются для подключения компьютеров и серверов к сети. Виртуальная сеть переносит эти и другие действия на программное обеспечение. Программное приложение, называемое виртуальным коммутатором или vSwitch, управляет и направляет связь между существующей физической сетью и виртуальными частями сети, такими как виртуальные машины. А адаптер виртуальной сети позволяет компьютерам и виртуальным машинам подключаться к сети, в том числе позволяя всем машинам в локальной сети (LAN) подключаться к более крупной сети.
В физической сети, локальные сети создаются для подключения нескольких устройств к общим ресурсам, таким как сетевое хранилище, обычно через кабели Ethernet или Wi-Fi. Но виртуальная сеть создает возможность для виртуальных LAN (VLAN), где группировка настраивается с помощью программного обеспечения. Это означает, что компьютеры, подключенные к различным сетевым коммутаторам, могут вести себя так, как если бы все они были подключены к одному и тому же коммутатору, и, наоборот, компьютеры, совместно использующие кабели, могут храниться в отдельных сетях, а не физически подключаться к машинам с использованием кабельного оборудования и аппаратных средств.
Виртуальная сеть обеспечивает более централизованное управление и упрощенное сетевое управление. Разрозненные части сети могут быть доступны удаленно для необходимых обновлений и изменений, или даже тестирования, что делает сетевое управление проще. Виртуальная сеть является основой для облачных архитектур и приложений, так как она позволяет получать доступ, подключать, защищать и изменять облачные ресурсы.
Примеры виртуальных сетей:
1. Виртуальная сеть VPN
Одним из примеров виртуальной сети является виртуальная частная сеть VPN, которая создает безопасное соединение между одной сетью и другой через интернет. VPN позволяют пользователям подключаться к сетям, работая удаленно или дома, а также обычно используются для обхода интернет-цензуры и дают гарантии того, что история браузера не будет видна в публичных Wi-Fi сетях.
2. Виртуальная сеть VLAN
Еще одним примером виртуальной сети является виртуальная локальная сеть VLAN. VLAN – это подгруппа сети, которая объединяет несколько сетевых устройств в одну группу или домен и отделяет ее от остальных. VLAN повышают скорость и производительность сети за счет более эффективной маршрутизации трафика между этими подгруппами или доменами. Сети VLAN также обеспечивают значительно больший контроль над сетевыми устройствами и трафиком. Изоляция определенных данных в отдельной виртуальной локальной сети обеспечивает дополнительные преимущества в области безопасности, особенно для больших сетей, затрудняя несанкционированный мониторинг или вмешательство в сеть. В VLAN также нет необходимости прокладывать новые кабели или вносить большие изменения в сетевую инфраструктуру.
3. Виртуальная сеть VXLAN
Виртуальная расширяемая локальная сеть (VXLAN) – это еще один пример виртуальной сети. Помимо простого разделения сети на подгруппы, VXLAN могут виртуализировать всю сеть, обеспечивая крупномасштабные возможности. VXLAN значительно увеличивают пропускную способность и масштабируемость виртуальных сетей – это особенно важно для современных сложных архитектур облачных вычислений.
На видео: Подход компании Scaleway к фабрикам на основе VXLAN EVPN
Сеть. Что такое сеть? И для чего она нужна? | Обслуживание компьютеров
По-простому говоря сеть — это то, при помощи чего можно соединить между собой множество компьютеров. К примеру, если вы хотите, чтобы у вас на компьютере был интернет, то вы должны подключить его к сети.
Сеть нужна для того, чтобы ваши компьютеры имели связь друг с другом.
Интернет, к слову сказать, это тоже сеть, только очень огромная, всемирная мировая сеть. Кстати поэтому интернет называют всемирной паутиной.
Все компьютеры связаны между собой либо проводами, либо какими-то беспроводными соединениями. Для упрощения мы будем говорить про провода. Т.е. чтобы у вас в офисе была сеть, вам нужно объединить между собой компьютеры проводами.
Некоторое время назад сети были различных скоростей и различных соединений. Скорости были намного ниже сегодняшних.
Не будем вдаваться в подробности старых сетей, а лучше сосредоточимся на том какие используются сейчас. Сейчас основной метод построения офисной сети — это построение с использованием кабеля витая пара категории 5Е или категории 6.
Сейчас офисные сети как правило бывают 2-х скоростей. Эта скорость либо 100 Мбит/сек, либо 1000 Мбит/сек (1Гбит/сек).
Несколько лет назад гигабитные сети были достаточно дорогими. Сейчас же оборудование для их построения дешевое, и поскольку передаваемые в сети объемы значительно увеличились, то я рекомендую всем в офисе делать гигабитную сеть, поскольку по цене это будет не значительно отличаться от цены построения 100 Мегабитной сети.
Компоненты сети
Сеть состоит из следующих компонентов:
Построение сети на практике
Допустим у вас есть 10 компьютеров. Вы хотите их объединить в сеть. Для этого вы покупаете кабель витая пара категории 5е. Стандарт этих сетей называется Ethernet. Берется кабель категории 5е или 6, покупаются коннекторы (разъемы, которые подсоединяются на концах кабеля). Эти разъемы вставляются в сетевую карту на компьютере или же в разъем на оборудовании.
Также необходимо приобрести оборудование для построения сети. В частности, это коммутатор и маршрутизатор.
Все провода, идущие от компьютеров, подсоединяются к коммутатору (это объединяющее звено компьютеров или сети) и производятся все необходимые настройки.
Для чего нужна сеть?
Сеть нужна для объединения компьютеров. Т.е., допустим, если у вас в офисе 10 компьютеров и 1 сервер, и вы хотите, чтобы у всех была, например, общая база 1С, для этого нужна сеть.
Т.е. сеть — это средство связи между компьютерами.
Проектирование сети или почему важно заранее правильно спроектировать сеть
Проектирование сети достаточно непростое дело. Здесь нужно учесть множество вещей:
- какая будет нагрузка на сеть,
- где будут установлены серверы,
- какие расстояния между узлами,
- как будут прокладываться провода,
- какие объемы данных будут передаваться.
Также важно учесть некоторую избыточность, чтобы в дальнейшем была возможность увеличения количества подключаемых компьютеров.
Узкие места в сети
Важно спроектировать сеть, чтобы в ней не было узких мест. Чтобы не получилось так, что вы ставите скоростную сеть для быстрого доступа к данным на сервере, а сервер, например, подключен к медленному коммутатору (100 Мбит). Из-за таких ошибок быстрой скорости не будет, т.к. сервер будет передавать данные через медленный коммутатор.
Узкое место в сети — это как в пробке. Едете по большому скоростному шоссе из 6 полос, а потом въезжаете в 2-х полосную дорогу, на которой образовалась пробка. Тут тоже самое. Вот эти все моменты нужно учесть, чтобы их не было.
Смотрите также:
Кабель витая пара категории 5Е
Коннектор RJ-45
Коммутатор (Switch)
Маршрутизатор (Router)
Сетевая карта
Как работают компьютерные сети – роли сетевых устройств
Планета постепенно покрывается компьютерными сетями различных типов. Понимание основ работы этих сетей помогает узнать, как их лучше использовать, а также повышает нашу осведомленность об изменяющемся мире вокруг нас.
В этой статье рассматриваются устройства компьютерной сети – аппаратные системы, которые подключаются к сети и взаимодействуют друг с другом.
Что делает сетевое устройство
Не каждый компьютер, портативный гаджет или другое оборудование может подключаться к сети. Сетевое устройство обладает аппаратными средствами связи, чтобы осуществить физическое соединение с другими устройствами. Большинство современных сетевых устройств имеют встроенную коммуникационную электронику на своих платах.
Некоторые ПК, старые игровые приставки Xbox и другие старые устройства не имеют встроенного коммуникационного оборудования, но их можно настроить как сетевые устройства, подключив отдельные сетевые адаптеры в виде периферийных устройств USB. Очень старым настольным ПК потребуется физически подключить отдельные большие карты расширения в материнскую плату – NIC.
Новые поколения потребительских устройств и гаджетов создаются как сетевые устройства, а старые поколения – нет. Например, традиционные домашние термостаты не содержат какого-либо коммуникационного оборудования и не могут быть подключены к домашней сети через периферийные устройства.
Наконец, некоторые виды оборудования вообще не поддерживают работу в сети. К числу потребительских устройств, которые не имеют встроенного сетевого оборудования и не поддерживают периферийные устройства, относятся старые Apple iPod, многие телевизоры и тостеры.
Роли устройств в компьютерных сетях
Устройства в компьютерных сетях выполняют различные роли. Две наиболее распространенные роли – это клиенты и серверы. Примерами сетевых клиентов являются ПК, телефоны и планшеты, а также сетевые принтеры. Клиенты, как правило, делают запрос и используют данные, хранящиеся на серверах, то есть устройствах с большим объемом памяти и/или дискового пространства, и высокопроизводительными процессорами для лучшей поддержки клиентов.
Примеры сетевых серверов включают в себя веб-сервера и игровые сервера. Сети, как правило, поддерживают гораздо больше клиентов, чем серверов. И клиенты, и серверы иногда называют сетевыми узлами.
Сетевые устройства также могут функционировать и как клиенты, и как серверы. В одноранговой сети, например, пары устройств могут обмениваться файлами или другими данными друг с другом, одно из которых действует в качестве сервера, предоставляя некоторые данные, одновременно работая в качестве клиента и запрашивая различные данные от других устройств сети.
Сетевые устройства специального назначения
Клиентские и серверные узлы могут быть добавлены или удалены из сети, не блокируя связь других устройств, которые всё ещё остаются в сети. Однако, некоторые другие типы сетевого оборудования существуют с единственной целью – обеспечить работу сети:
- Сетевой концентратор позволяет любому узлу, подключенному к нему, напрямую отправлять данные другим устройствам
- Сетевые коммутаторы выполняют ту же функцию, что и концентраторы, но включают дополнительную аппаратную логику, которая открывает несколько каналов связи, позволяя нескольким подключенным узлам отправлять данные непосредственно друг другу, а не всем остальным в сети, как в концентраторах
- Сетевые маршрутизаторы ещё больше расширяют возможности сетевых коммутаторов, поддерживая соединения, исходящие от себя к другим сетям, соединяя их вместе, не нарушая функциональность каждой из них в отдельности.
- Сетевые повторители принимают физический сигнал, передаваемый по сетевому соединению и усиливает их мощность для того, чтобы сигнал мог достичь отдаленных устройств
- В настоящее время устройство менее распространенным типом устройств являются сетевые мосты, которые соединяют два разных типа физических сетевых соединений вместе, например, мосты позволяют беспроводным устройствам подключаться к проводной сети. (Современные мостовые технологии часто физически интегрированы в другие типы устройств.)
Маршрутизатор — Википедия
Маршрутизатор, использующийся на магистральных каналахМаршрутиза́тор (проф. жарг. рýтер или роутер транслитерация от англ. router /ˈɹu:tə(ɹ)/ или /ˈɹaʊtəɹ/[1], /ˈɹaʊtɚ/) — специализированный компьютер, который пересылает пакеты между различными сегментами сети на основе правил и таблиц маршрутизации[2]. Маршрутизатор может связывать разнородные сети различных архитектур. Для принятия решений о пересылке пакетов используется информация о топологии сети и определённые правила, заданные администратором.
Маршрутизаторы работают на «сетевом» (третьем) уровне сетевой модели OSI, в отличие от коммутаторов (свитчей) и концентраторов (хабов), которые работают соответственно на втором и первом уровнях модели OSI.
Avaya Маршрутизатор основной (ERS-8600)Обычно маршрутизатор использует адрес получателя, указанный в заголовке пакета, и определяет по таблице маршрутизации путь, по которому следует передать данные. Если в таблице маршрутизации для адреса нет описанного маршрута — пакет отбрасывается.
Существуют и другие способы определения маршрута пересылки пакетов, когда, например, используется адрес отправителя, используемые протоколы верхних уровней и другая информация, содержащаяся в заголовках пакетов сетевого уровня. Нередко маршрутизаторы могут осуществлять трансляцию адресов отправителя и получателя, фильтрацию транзитного потока данных на основе определённых правил с целью ограничения доступа, шифрование/расшифровывание передаваемых данных и т. д.
Таблица маршрутизации содержит информацию, на основе которой маршрутизатор принимает решение о дальнейшей пересылке пакетов. Таблица состоит из некоторого числа записей — маршрутов, в каждой из которых содержится идентификатор сети получателя (состоящий из адреса и маски сети), адрес следующего узла, которому следует передавать пакеты, административное расстояние — степень доверия к источнику маршрута и некоторый вес записи — метрика. Метрики записей в таблице играют роль в вычислении кратчайших маршрутов к различным получателям. В зависимости от модели маршрутизатора и используемых протоколов маршрутизации, в таблице может содержаться некоторая дополнительная служебная информация. Например:
192.168.64.0/18 [110/49] via 192.168.1.2, 00:34:34, FastEthernet0/0.1 где 192.168.64.0/18 — сеть назначения, 110/- административное расстояние /49 — метрика маршрута, 192.168.1.2 — адрес следующего маршрутизатора, которому следует передавать пакеты для сети 192.168.64.0/18, 00:34:34 — время, в течение которого был известен этот маршрут, FastEthernet0/0.1 — интерфейс маршрутизатора, через который можно достичь «соседа» 192.168.1.2.
Таблица маршрутизации может составляться двумя способами:
- статическая маршрутизация — когда записи в таблице вводятся и изменяются вручную. Такой способ требует вмешательства администратора каждый раз, когда происходят изменения в топологии сети. С другой стороны, он является наиболее стабильным и требующим минимума аппаратных ресурсов маршрутизатора для обслуживания таблицы.
- динамическая маршрутизация — когда записи в таблице обновляются автоматически при помощи одного или нескольких протоколов маршрутизации — RIP, OSPF, IGRP, EIGRP, IS-IS, BGP, и др. Кроме того, маршрутизатор строит таблицу оптимальных путей к сетям назначения на основе различных критериев — количества промежуточных узлов, пропускной способности каналов, задержки передачи данных и т. п. Критерии вычисления оптимальных маршрутов чаще всего зависят от протокола маршрутизации, а также задаются конфигурацией маршрутизатора. Такой способ построения таблицы позволяет автоматически держать таблицу маршрутизации в актуальном состоянии и вычислять оптимальные маршруты на основе текущей топологии сети. Однако динамическая маршрутизация оказывает дополнительную нагрузку на устройства, а высокая нестабильность сети может приводить к ситуациям, когда маршрутизаторы не успевают синхронизировать свои таблицы, что приводит к противоречивым сведениям о топологии сети в различных её частях и потере передаваемых данных.
Зачастую для построения таблиц маршрутизации используют теорию графов.
Маршрутизаторы помогают уменьшить загрузку сети благодаря её разделению на домены коллизий или широковещательные домены, а также благодаря фильтрации пакетов. В основном их применяют для объединения сетей разных типов, зачастую несовместимых по архитектуре и протоколам, например для объединения локальных сетей Ethernet и WAN-соединений, использующих протоколы xDSL, PPP, ATM, Frame relay и т. д. Нередко маршрутизатор используется для обеспечения доступа из локальной сети в глобальную сеть Интернет, осуществляя функции трансляции адресов и межсетевого экрана.
В качестве маршрутизатора может выступать как специализированное (аппаратное) устройство, так и обычный компьютер, выполняющий функции маршрутизатора. Существует несколько пакетов программного обеспечения (на основе ядра Linux, на основе операционных систем BSD) с помощью которого можно превратить ПК в высокопроизводительный и многофункциональный маршрутизатор, например, Quagga, IPFW или простой в применении PF.
Основы концепции заложил (1966) Дональд Дэвис, конструируя британскую сеть NPL. Технологии быстро переняли американцы, стремящиеся соорудить слаженную линию обороны. Плата IMP (процессор интерфейса сообщений) выступала узлом сети, занимающимся коммутацией сообщений. Конструкция просуществовала вплоть до развала СССР, упразднена в 1989 году, составив первое поколение шлюзов, ставшее эволюционно маршрутизаторами.
Первым маршрутизатором был мини-компьютер Honeywell DDP-516, дополненный особым внешним интерфейсом связи. Часть коммутирующих функций отдали программному обеспечению. Впоследствии роль коммутаторов отдали Honeywell 316, лишённым особой защиты. Новички тянули примерно две трети производительности, стоя вдвое дешевле. Соединение с хостами вели посредством последовательной шины передачи данных. Оборудование, программное обеспечение обсуждает открытый (ныне) документ RFC 1, первый из выпущенных IETF.
В бытовом секторе обычно используются маршрутизаторы, обеспечивающие подключение домашней сети компьютеров к каналу связи интернет-провайдера. Как правило, при этом маршрутизатор обеспечивает IP-адресацию устройств локальной сети по протоколу DHCP, а сам получает IP-адрес от внешнего провайдера. Обычно современный маршрутизатор имеет ряд вспомогательных функций и встроенных возможностей: беспроводная точка доступа Wi-Fi для подключения мобильных устройств, межсетевой экран для защиты сети от внешних атак, резервирование доступа в Интернет через каналы от нескольких провайдеров, веб-интерфейс для упрощения настройки устройства, USB-порт для подключения принтера или дискового хранилища и другие.
-
Маршрутизатор Cisco 71
-
Маршрутизатор Netgear DG834G с Wi-Fi интерфейсом
Маршрутизатор Asus RT-N10 с интерфейсом Wi-Fi и IPTV