Unix2017b/Сетевые возможности
Содержание
Устройства и интерфейсы
Посмотреть сетевые устройства
Для настроек вам обязательно потребуется имя вашего сетевого адаптера. В Ubuntu его можно узнать из вывода команды:
$ sudo lshw -C network
Она позволяет посмотреть подключенные сетевые устройства.
Сетевые интерфейсы
Интерфейсы не представлены в /dev/ как устройства
Классическое наименование — ethN.
После внедрения SystemD (в Ubuntu начиная с 15.04) сетевые интерфейсы могут иметь другие имена. Сделано это для того, что бы имена сетевых устройств не менялись при подключении к машине новых адаптеров (в последнее время, некоторые USB модемы выступают в роли сетевого адаптера). В результате eth0 может называться например enp0s4 или eno1, или даже enx78e7d1ea46da. Именно это имя сетевого адаптера и нужно использовать в настройке сети.
Как получить список сетевых интерфейсов? [1]
ifconfig -a
ls /sys/class/net
/proc/net/dev
Инструменты настройки сети
GUI vs command line
На десктопных дистрибутивах Ubuntu:
- NetworkManager
- консольные утилиты (ifconfig, ifup, ...)
По умолчанию они несовместимы.
NetworkManager — демон, позволяющий нескольким пользователям редактировать настройки сети, что удобно на десктопе или ноутбуке. В некотором смысле NetworkManager является фронтендом для iproute, dhclient, wpa_supplicant и ppp.
ifconfig и ip
ifconfig — общая утилита для настройки сетевых интерфейсов. Не читает никакие конфиги и делает ровно то, что попросили.
Часто пишут, что ifconfig устарел. Эта программа практически не развивается с 2001 года. Сейчас на Linux нужно использовать iproute2 (команда ip). У этой утилиты больше возможностей, хотя иногда команды получаются длиннее...
Показать список устройств и конфигурацию:
$ ifconfig $ ip addr show $ ip link show
Включить сетевой интерфейс:
$ ifconfig eth0 up $ ip link set eth0 up
Выключить сетевой интерфейс:
$ ifconfig eth0 down $ ip link set eth0 down
ifup и ifdown
Вспомогательные программы, используют конфиг из /etc/network/interfaces.
dhclient
Клиент протокола DHCP.
wpa_supplicant
Утилита для настройки шифрования в беспроводных сетях.
Прикладные программы для работы с сетью
nc
Утилита Unix, позволяющая устанавливать соединения TCP и UDP, принимать оттуда данные и передавать их. Несмотря на свою полезность и простоту, данная утилита не входит ни в какой стандарт (например, POSIX).
На сервере (192.168.1.1):
nc -l 17083
На клиенте:
nc 192.168.1.1 17083
telnet
TELNET (сокр. от англ. teletype network) — сетевой протокол для реализации текстового интерфейса по сети (в современной форме — при помощи транспорта TCP). Название telnet имеет утилита, реализующая клиентскую часть протокола.
Исторически Telnet служил для удалённого доступа к интерфейсу командной строки операционных систем. В протоколе не предусмотрено использование ни шифрования, ни проверки подлинности данных. Поэтому он уязвим для любого вида атак, к которым уязвим его транспорт, то есть протокол TCP. Для функциональности удалённого доступа к системе в настоящее время применяется сетевой протокол SSH (особенно его версия 2), при создании которого упор делался именно на вопросы безопасности.
Использует по умолчанию порт 23.
Клиент Telnet иногда используется для осуществления ручного доступа (например, в целях отладки) к таким протоколам прикладного уровня, как HTTP, IRC, SMTP, POP3 и прочим текст-ориентированным протоколам на основе транспорта TCP. Однако, использование клиента telnet в качестве клиента TCP может вызывать следующие нежелательные эффекты:
- Клиент может передать данные, которые вы не вводили (опции Telnet);
- Клиент не будет принимать байт 0xFF;
- Клиент будет искажать 0xFF при передаче.
Удобно проверять, есть ли доступ к порту X (не важно, что именно там за сервер работает, главное, чтобы принимал TCP-соединения).
Есть доступ:
$ telnet bsu.by 80 Trying 217.21.43.3... Connected to bsu.by. Escape character is '^]'.
Нет доступа:
$ telnet bsu.by 22 Trying 217.21.43.3... telnet: Unable to connect to remote host: Connection refused
Ручное задание HTTP-запросов:
$ telnet example.com 80 Trying 93.184.216.34... Connected to example.com. Escape character is '^]'. GET / HTTP/1.0 Host: example.com HTTP/1.1 200 OK
wget
wget (GNU Wget) — свободная консольная программа для загрузки файлов по сети. Поддерживает протоколы HTTP, FTP и HTTPS, а также поддерживает работу через HTTP-прокси-сервер.
wget является неинтерактивной программой. Это означает, что после её запуска пользователь может повлиять на её работу только с помощью средств управления процессами операционной системы. Как правило, для этого используются сочетания клавиш Ctrl+C при необходимости прерывания работы программы и Ctrl+Z для помещения текущего задания в фон.
Файлы можно скачивать рекурсивно по ссылкам в HTML страницах, как с одного сайта с определённой глубиной следования по ссылкам, так и с нескольких.
wget поддерживает докачку файла в случае обрыва соединения.
curl
GET, POST
Специальные отдельные команды, имеют названия как у HTTP-методов.
Реализованы на языке perl через утилиту lwp-request. На Debian-дистрибутивах она входит в состав пакета libwww-perl.
Linux как сервер в локальной сети
ОС Linux часто используется на серверах.
- Высокая стабильность. Система может работать годами без перезагрузок.
- Гибкость настройки. Можно выключить всё лишнее, например GUI. Можно выбрать любую ФС в зависимости от задач.
- Производительность. Можно перекомпилировать ядро под конкретное железо, чтобы использовать все оптимизации под имеющийся процессор. Можно тюнить параметры TCP/IP-стека...
- Безопасность. Исходники открыты, теоретически это должно способствовать тому, что сообщество будет находить и исправлять ошибки. На практике можно вспомнить уязвимость Heartbleed (CVE-2014-0160) в библиотеке OpenSSL, которая существовала в коде с конца 2011 и была публично объявлена в апреле 2014.
- Малое количество вирусов и прочего malware. Для серверов это не столь актуально, если администратор следит, какой софт выполняется на сервере, и не запускает неизвестное ПО.
- Бесплатность. Становится особенно важно, если в компании много серверов. Так, цена лицензии Windows Server 2016 Standard для 16-ядерного сервера составляет $882.
- Большое количество разнообразного серверного ПО также бесплатно. Windows-версии того же софта если и есть, то хуже оптимизированы (например nginx).
- Популярность. На серверах большая доля, значит, много документации, инструкций, ответов на Stackoverflow, баги репортятся и исправляются...
- Удобство удалённого администрирования через шелл.
Установить статический IP
sudo ifconfig enp0s8 192.168.1.1 netmask 255.255.255.0
Этот адрес слетит при перезагрузке... Чтобы зафиксировать, надо прописать в конфиге:
sudoedit /etc/network/interfaces
auto enp0s8 iface enp0s8 inet static address 192.168.1.1 netmask 255.255.255.0
Теперь запустить интерфейс:
sudo ifup enp0s8
Если выдаёт что-то вроде "RTNETLINK answers: File exists", сбросить устройство:
sudo ip addr flush dev enp0s8
Настройка ssh
sudo apt-get install openssh-server
Установка nginx
sudo apt-get install nginx
Настройка DNS
Служба доменных имён (Domain Name Service, DNS) — это служба интернета, которая ставит в соответствие друг с другом IP-адреса и полные доменные имена (Fully Qualified Domain Names, FQDN). Таким образом, DNS избавляет от необходимости запоминать IP-адреса. Компьютеры, на которых запущен сервер DNS, называются серверами имён. Ubuntu включает в себя BIND (Berkley Internet Naming Daemon), наиболее распространенную программу для обслуживания серверов имён в Linux.
sudo apt-get install bind9
По умолчанию работает как кеширующий DNS-прокси.
Редактируем /etc/bind/named.conf.local:
zone "yandex.ru" { type master; file "/etc/bind/db.yandex.ru"; }; //reverse zone zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192"; };
sudo cp /etc/bind/db.{local,yandex.ru}
$TTL 604800 @ IN SOA yandex.ru. root.yandex.ru. ( 3 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns.yandex.ru. @ IN A 192.168.1.1 ns IN A 192.168.1.1
sudo cp /etc/bind/db.{127,192}
$TTL 604800 @ IN SOA yandex.ru. root.yandex.ru. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns. 1 IN PTR ns.yandex.ru.
DHCP
DHCP (англ. Dynamic Host Configuration Protocol — протокол динамической настройки узла) — сетевой протокол, позволяющий компьютерам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к так называемому серверу DHCP и получает от него нужные параметры. Сетевой администратор может задать диапазон адресов, распределяемых сервером среди компьютеров. Это позволяет избежать ручной настройки компьютеров сети и уменьшает количество ошибок. Протокол DHCP используется в большинстве сетей TCP/IP.
sudo apt-get install isc-dhcp-server
sudoedit /etc/default/isc-dhcp-server
sudoedit /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.10 192.168.1.254; option domain-name-servers 192.168.1.1; option routers 192.168.1.1; }
Настройка шлюза
Нам нужно обеспечить доступ в интернет с компьютеров локальной сети. Пусть наш сервер будет выступать шлюзом.
Итак, есть два сетевых интерфейса:
- enp0s3 — доступ к NAT VirtualBox и далее к интернету
- enp0s8 — доступ к локальной сети (для простоты, пусть это сеть 192.168.1.0/24, интерфейс имеет статический IP 192.168.1.1).
Вначале нужно включить IP forwarding в ядре, то есть разрешить пересылку пакетов между сетевыми интерфейсами. По умолчанию в большинстве дистрибутивов оно выключено из соображений безопасности.
echo 1 > /proc/sys/net/ipv4/ip_forward
Если сделать так, то настройка «слетит» после перезагрузки. Для того чтобы настройка сохранялась, нужно прописать её в /etc/sysctl.conf:
net.ipv4.ip_forward=1
Затем применить изменения
sudo sysctl -p /etc/sysctl.conf
Будем использовать iptables. Это утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для Linux. Для использования утилиты iptables требуются привилегии суперпользователя (root).
Функционирование фаервола определяется набором правил, каждое из которых состоит из критерия и действия, применяемого к пакетам, подпадающим под этот критерий. Цепочка — это независимый список правил. Были введены отдельные цепочки для фильтрации входящих (INPUT), исходящих (OUTPUT) и транзитных (FORWARD) пакетов. Таблицы — независимые группы цепочек. Каждая таблица решает свою задачу — цепочки таблицы filter отвечали за фильтрацию, цепочки таблицы nat — за преобразование сетевых адресов (NAT), к задачам таблицы mangle относились прочие модификации заголовков пакетов (например, изменение TTL или TOS).
iptables при обработке отдельных пакетов использует информацию о соединениях в целом. iptables может отслеживать состояние соединения и перенаправлять, изменять или отфильтровывать пакеты, основываясь не только на данных из их заголовков (источник, получатель) или содержимом пакетов, но и на основании данных о соединении. Такая возможность фаервола называется stateful-фильтрацией. Можно сказать, что iptables анализирует не только передаваемые данные, но и контекст их передачи.
Выполним следующие команды:
iptables -F FORWARD # На всякий случай очистим цепочку FORWARD # Разрешаем проходить пакетам по уже установленным соединениям iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Разрешаем исходящие соединения из локальной сети к интернет-хостам iptables -A FORWARD -m conntrack --ctstate NEW -i enp0s8 -s 192.168.1.0/24 -j ACCEPT iptables -P FORWARD DROP # Весь остальной транзитный трафик — запрещаем. iptables -t nat -F POSTROUTING # На всякий случай очистим цепочку POSTROUTING таблицы nat # Маскарадим весь трафик, идущий через enp0s3 iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
Вкратце рассмотрим, что они делают.
Таблица nat предназначена для операций stateful-преобразования сетевых адресов и портов обрабатываемых пакетов. Действие MASQUERADE подменяет адрес источника для исходящих пакетов адресом того интерфейса, с которого они исходят, то есть осуществляет маскарадинг. Такая операция позволяет, например, предоставлять доступ в Интернет целым локальным сетям через один шлюз.
Если один из хостов локальной сети, например, 192.168.1.2, попытается связаться с одним из интернет-хостов, например, 199.204.44.194 (kernel.org), при проходе его пакетов через шлюз их исходный адрес будет подменяться на внешний адрес шлюза. С точки зрения удаленного хоста (kernel.org) это будет выглядеть, как будто с ним связывается непосредственно сам шлюз. Когда же удаленный хост начнет ответную передачу данных, он будет адресовать их именно шлюзу. Однако, на шлюзе адрес назначения этих пакетов будет подменяться на 192.168.1.2, после чего пакеты будут передаваться настоящему получателю. Для такого обратного преобразования никаких дополнительных правил указывать не нужно — это будет делать все та же операция MASQUERADE. Простота трансляции сетевых адресов является одним из важнейших достоинств stateful-фильтрации.
Если же такой трансляции не производить, удаленный хост просто не сможет ответить на адрес 192.168.1.2, так как адресные пространства локальных сетей изолировано от адресного пространства Интернета. В мире могут существовать миллионы локальных сетей 192.168.1.0/255.255.255.0, и в каждой может быть свой хост 192.168.1.2. Эти сети могут и не быть связаны с Интернетом. Но если они с ним связаны — то только благодаря механизмам трансляции сетевых адресов.