Unix2017b/Сетевые возможности

Материал из iRunner Wiki

Устройства и интерфейсы

Посмотреть сетевые устройства

Для настроек вам обязательно потребуется имя вашего сетевого адаптера. В 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

[2]

Служба доменных имён (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).

Викиучебник по iptables

Функционирование фаервола определяется набором правил, каждое из которых состоит из критерия и действия, применяемого к пакетам, подпадающим под этот критерий. Цепочка — это независимый список правил. Были введены отдельные цепочки для фильтрации входящих (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. Эти сети могут и не быть связаны с Интернетом. Но если они с ним связаны — то только благодаря механизмам трансляции сетевых адресов.

Программирование сетевых приложений

Beej's Guide to Network Programming