@ Карта сайта News Автора!

Bog BOS: Настройка TCP/IP в Linux

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)

Последнее изменение файла: 2019.04.30
Скопировано с www.bog.pp.ru: 2024.04.19

Bog BOS: Настройка TCP/IP в Linux

В статье описываются средства настройки TCP/IP в Linux для "старой" реализации (NET-3/4, ядро 2.0/2.2) и "новой" (iproute2, ядро 2.4/2.6). В частности, приводятся команды управления интерфейсами (NET-4, iproute2), адресами (iproute2), маршрутизацией (NET-4, iproute2), правилами маршрутизации, туннелями, утилиты, параметры ядра (NET-4, iproute2), примеры настройки (назначение нескольких адресов на интерфейс в ядре 2.2; 2 канала выхода в Интернет). Управление таблицами разрешения адресов вынесено в отдельную статью об ARP.

Архитектура NET-4

Команды управления сетью "в старом стиле" (до ядра 2.4) содержатся в пакете net-tools: ifconfig (управление интерфейсами), route (управление маршрутами), arp (управление таблицей соседей), netstat (получение статистики и информации о состоянии интерфейсов, маршрутов, соединений), hostname (установить или вывести DNS имя узла - gethostname(2), читается при загрузке из /etc/hostname или устанавливается dhcp клиентом), dnsdomainname (установить или вывести DNS имя узла - getdomainname(2), определяется DNS клиентом; внимание: domainname выдаёт имя NIS домена!).

ifconfig (управление интерфейсами в NET-4)

Каждое физическое соединение компьютера рассматривается как сетевой интерфейс. Обычно интерфейсы ethernet именуются как eth0, eth1 и т.д., модемные интерфейсы - ppp0, локальный интерфейс - lo (127.0.0.1), тунель в светлое будущее (IP6) - sit0, FDDI - fddi0, безпроводная сеть - wlan0, некоторые изготовители хотят видеть свои имена устройств. Имена интерфейсов не имеют прямого соответствия с именами устройств в /dev. Управление физическим уровнем смотри в статьях: Ethernet. Каждый ethernet интерфейс имеет один MAC адрес и не менее одного IP адреса (а вместе с ним сетевую маску, широковещательный адрес и множество параметров).

Программа ifconfig без параметров выводит список активных интерфейсов и их параметры (MAC адрес, номер прерывания, адрес памяти, IP адрес, сетевую маску, широковещательный адрес, активность, обслуживаются ли широковещательные и групповые пакеты, MTU, метрика), статистику полученных (общее количество, ошибочных, брошенных из-за недостатка места в ОЗУ, брошенных из-за недостатка времени на обработку прерывания, ошибки в формате кадра) и переданных (общее количество, ошибочных, брошенных из-за недостатка места в ОЗУ, брошенных из-за недостатка времени на обработку прерывания, ошибки несущей) пакетах, количество коллизий, размер очереди передачи, количество полученных и переданных байт. Ключ -a позволяет получить информацию обо всех интерфейсах

Настройка интерфейса: ifconfig имя-интерфейса [inet] параметры-через-пробел. Параметры:

route (управление маршрутами в NET-4)

Программа route без параметров выводит список маршрутов (аналогично netstat --route): сеть назначения, шлюз, маска сети, флаги (U - up, H - Host, G - шлюз, D - установлен ICMP Redirect, M - изменён ICMP Redirect, ! - сеть заблокирована, C - кеш, A - addrconf?), метрика, зависимых маршрутов, использований (кеш сокетов не учитывается), интерфейс. Параметры:

Добавление маршрута в таблицу: route add [-net | -host] [ адрес-сети | default] параметры-через-пробел. Параметры:

Удаление маршрута из таблицы: route del [-net | -host] [ адрес-сети | default] параметры-через-пробел. Параметры:

При наличии нескольких подходящих маршрутов выбирается маршрут с самой длинной маской сети. Сообщение ICMP Network Redirect в Linux интерпретируется как Host Redirect (имеет смысл запретить его совсем).

Утилиты

Получение информации (имя, MTU, статистика переданных и принятых пакетов с ошибками и без, флаги) об активных интерфейсах с помощью netstat (обо всех: -a): netstat -i.

Получение списка активных соединений (получение дополнительной информации о владельце: -e; не преобразовывать адреса в имена: -n; выдавать "слушающие" соединения: -a; состояние таймеров: -o):
netstat [--ip] [--unix] [--raw] [--tcp] [--udp] [--netlink]
(протокол, пакетов во входной и выходной очередях, местный и другой адреса и порты, состояние).

lsof с ключом -i позволяет увидеть установленные соединения с привязкой к владельцу и программе (порты, не привязанные к процессам, не показываются - nfs, lockd).

Параметры ядра (NET-4)

Управление параметрами стека TCP/IP в ядре осуществляется через файлы каталога /proc/sys/net/ipv4 (посмотреть - cat имя; изменить - echo параметр... > имя). Смысл имен описан в ip-sysctl.txt. В частности, для старых дистрибутивов необходимо сделать следующее (для установки во время загрузки надо поменять /etc/rc.d/init.d/network)

В RH 6.2 для управления параметрами стека (и любыми другими переменными из /proc/sys) используется
sysctl -p /etc/sysctl.conf
в котором записаны операторы присваивания соответствующим переменным (имена переменных совпадают с именами файлов из /proc/sys  с заменой слешей на точки):

Однако похоже, что sysctl не работает с двумя параметрами (ip_local_port_range), так что этот параметр приходится устанавливать руками

В новых версиях ядра именно такие значения устанавливаются по умолчанию, если имеется более 128 МБ оперативной памяти.

Несколько IP-адресов на одном интерфейсе (aliasing в NET-4)

Архитектура iproute2

В системах с новым ядром (2.4/2.6) следует отдавать предпочтение команде ip вместо устаревших ifconfig, route, arp (сравните вывод route и ip route list table all) и ss вместо netstat. Для работы требует наличия netlink в ядре, RTNETLINK и CONFIG_IP_ADVANCED_ROUTER, CONFIG_IP_MULTIPLE_TABLE и CONFIG_IP_ROUTE_FWMARK для работы с правилами. Старые команды (ifconfig, arp, route) по-прежнему находятся в пакете net-tools, однако являются лишь надстройкой над новой системой, находящейся в пакете iproute. Команда ip позволяет управлять интерфейсами (link), адресами (address), таблицей соседей (neighbour), маршрутами (route), правилами маршрутизации (rule), групповыми адресами (maddress), групповой маршрутизацией (mroute), и тунелями (tunnel) в зависимости от указанного в команде типа объекта управления. Формат параметров: ip ключи тип-объекта команда аргументы.

Общеупотребительные ключи:

Для любого типа объектов реализована команда help. Имена типов, команд, параметров можно сокращать.

Ядро использует несколько таблиц маршрутизации с номера от 1 до 255 (соответствие номеров именам таблиц находится в файле /etc/iproute2/rt_tables). По умолчанию, используется таблица main (254). Также ядро самостоятельно ведёт таблицу local (255) для локальных и широковещательных адресов. Ключом доступа в таблице является адрес сети, длина маски сети и TOS. Поиск в таблице считается успешным, если старшие биты адреса назначения совпадают с префиксом маршрута не менее длины маски сети и TOS маршрута равен нулю или TOS пакета. Если нашлось несколько подходящих маршрутов, то выбираются маршруты с максимальным префиксом, из них выбираются маршруты с подходящим TOS, из них выбираются маршруты с наибольшим приоритетом, из оставшихся маршрутов выбирается первый в таблице. Типы маршрутов:

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

iptables -A PREROUTING -t mangle селектор -j MARK --set-mark маркер

Для принятия решения используется RPDB (Routing Policy Data Base), состоящая из списка правил (rules), упорядоченных в соответствии с заданными администратором приоритетами (0 - высший, каждое правило должно иметь уникальный приоритет). Каждое правило состоит из "селектора" и "действия". Селектор используется для проверки необходимости применения действия из данного правила. Действие может завершить процесс выбора выдав маршрут или сообщение об ошибке. Типы действий:

При инициализации создаются 3 правила:

Определение обратного адреса при отправке пакета:

  1. адрес задан явно с помощью bind(2)
  2. таблица маршрутизации может содержать "подсказку" для определения обратного адреса для указанного адреса назначения (параметр src команды ip route)
  3. ядро просматривает список адресов интерфейса, через который будет послан пакет; для IPv4 ищется первый подходящий адрес с областью действия (параметр scope команды ip address) шире, чем область действия адреса назначения (параметр scope команды ip route), но предпочтительно в той же подсети, что и следующий узел на маршруте
  4. если область действия адреса назначения link или host, то 0.0.0.0
  5. просматриваются все интерфейсы, начиная с lo, в поисках адреса с подходящей областью действия

Тунели позволяют встраивать пакеты внутрь IPv4 пакетов. Поддерживаются режимы ipip (IP в IP, позволяет соединить между собой 2 сетки IPv4, не передаются широковещательные пакеты, нет защиты от прослушивания и изменения), sit (инкапсуляция IPv6 в IPv4) и gre (протокол Cisco, позволяет встроить IPv4 и IPv6, включая широковещательные пакеты, имеется возможность шифрования и защиты от изменения). Подробнее в ip-tunnels.ps.

Область (realm) используется для объединения адресов в группы для учёта (rtacct), администрирования, шейпинга трафика (tc). Определяются отдельные области происхождения и назначения.

Управление интерфейсами в iproute2

Тип объекта - link. Каждый интерфейс имеет уникальный индекс, который можно узнать по команде "ip link show dev имя", и имя, которое можно изменить командой "ip link set dev старое-имя name новое-имя". Интерфейс может быть привязан к другому интерфейсу (к имени добавляется "@имя-головного-интерфейса"), пакеты посылаемые по этому интерфейсу инкапсулируются в пакеты головного интерфейса. Для каждого интерфейса действует определённый алгоритм обработки очереди (qdisc): pfifo_fast, noqueue (отсутствие очереди), noop (интерфейс является "чёрной дырой").

Можно установить (команда set) параметры интерфейса (сетевого устройства) или посмотреть текущие настройки (команда show, list, ls, l).

ip link set аргументы:

ip [-statistics] [-statistics] link show аргументы:

Флаги:

Управление адресами в iproute2

Тип объекта - address. Каждый интерфейс должен иметь по крайней мере один IP адрес. Все адреса интерфейса равнозначны.

Добавление адреса - команда add, параметры:

Удаление адреса - команда delete. Параметры те же, что для команды add. Указание имени интерфейса обязательно. Если остальные аргументы не указаны, то удаляется первый попавшийся адрес. Смотри ниже про удаление primary адреса.

Вывод списка адресов и их свойств - команда show (sh, list, ls, l). Параметры:

Удаление группы адресов - команда flush (f). Параметры те же, что для команды show. С ключом -statistics выводит число удалённых адресов. Двойное использование ключа -statistics выводит список удалённых адресов. Например, удаление всех адресов IPv6:
ip -6 addr flush dev eth0

Управление маршрутами в iproute2

Тип объекта - route. Управляет таблицами маршрутизации ядра (пути доступа к другим узлам сети).

Добавление, изменение, замена маршрута:
ip [общие-опции] route {add | change | replace | append | prepend} параметры

Удаление маршрута:
ip [общие-опции] route delete параметры

Вывод списка маршрутов и их свойств - команда show (sh, list, ls, l). Параметры:

Для маршрутов из кеша выдаётся также предполагаемый входной интерфейс, число текущих пользователей, число использований и время последнего использования (с опцией -statistics), а также атрибуты (в угловых скобках):

Сброс группы маршрутов производится командой flush, имеющей те же параметры, что и команда show. С ключом -statistics выводит число удалённых маршрутов. Двойное использование ключа -statistics выводит список удалённых маршрутов.

Тестирование маршрута прохождения пакета:
ip route get параметры

Управление правилами маршрутизации в iproute2

Тип объекта - rule. Управляет правилами маршрутизации (выбор таблиц маршрутизации в зависимости от параметров).

Добавление, удаление правила (после внесения изменений требуется сбросить кеш маршрутов - "ip route flush cache"):
ip [общие-опции] rule {add | delete} параметры

Вывод списка правил и их свойств - команда show (sh, list, ls, l).

Управление групповыми адресами

Тип объекта - maddress. Управляет групповыми адресами (только адрес канального уровня, добавлять и удалять группы нельзя).

Вывод списка групповых адресов и их свойств - команда show (sh, list, ls, l). Параметр: имя интерфейса.

Добавление, удаление группового адреса:
ip [общие-опции] maddress {add | delete} параметры

Управление групповыми маршрутами

Тип объекта - mroute. Позволяет посмотреть кеш групповых маршрутов:
ip [общие-опции] mroute show параметры

Управление туннелями

Тип объекта - tunnel. Управляет тунелями.

Добавление, изменение, удаление туннеля (удалить sit0 не удалось):
ip [общие-опции] tunnel {add | change | delete} параметры

Вывод списка туннелей и их свойств - команда show (sh, list, ls, l). Параметр: имя интерфейса.

Мониторинг состояния интерфейсов, адресов и маршрутов

Команда monitor позволяет вести непрерывное слежение за изменениями в состоянии устройств, адресов и маршрутов (файл создаётся утилитой rtmon):
ip monitor [file имя-файла] [all | link | address | route]

Управление трафиком

Управление трафиком - задание полосы пропускания для определённого вида исходящего трафика (shaping, задержка пакетов), планирование (scheduling, переупорядочивание) передачи пакетов, обрезание как исходящего, так и входящего трафика (policing). Очередь характеризуется максимальной длиной и дисциплиной (методом, алгоритмом) обработки пакетов перед отправкой. Дисциплина может разбивать трафик на классы с помощью классификатора (classifier), в простом случае с помощью фильтров, и распределять полосу пропускания между классами. Фильтры tc позволяют классифицировать по TOS, IP адресу, типу протокола, номеру порта или маркеру iptables (очень удобно, чтобы не изучать новый синтаксис; таблица mangle, цепочка PREROUTING). Для каждого класса задаётся отдельная дисциплина обработки (может в свою очередь производить классификацию), Дисциплина, применяемая к устройству целиком, называется корневой.

Дисциплины обработки очереди (qdisc) отправления (egress) и получения (ingress, входящая дисциплина):

IMQ (Intermediate queueing device) - псевдоустройство, на которое можно "ответвить" часть входящего или исходящего трафика, чтобы использовать дисциплину обработки очереди для входящего потока и/или нескольких реальных устройств:

ip link set imq0 up
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0
tc qdisc add dev imq0 root ...
...
ip link set imq1 up
iptables -t mangle -A POSTROUTING -o eth1 -j IMQ -todev 0
iptables -t mangle -A POSTROUTING -o eth2 -j IMQ -todev 0
tc qdisc add dev imq1 root ...
...

TEQL (True/Trivial link Equalizer) - псевдоустройство, которое позволяет распределять исходящий трафик между двумя компьютерами по нескольким каналам (не забыть прописать маршруты, отключить /proc/sys/net/ipv4/conf/eth1/rp_filter):

tc qdisc add dev eth1 root teql0
tc qdisc add dev eth2 root teql0
ip link set dev teql0 up

Подробности смотри в tc(8) и далее, lartc содержит примеры использования.

Пример. Добавление второго канала выхода в Интернет

Итак. Имеется внешний маршрутизатор, сделанный на базе Linux, ядро 2.4 или 2.6. Интерфейс eth0 обслуживает локальную сеть 192.168.0.0/24 (параметры описаны в ifcfg-eth0, собственный адрес - 192.168.0.1, static, onboot), интерфейс eth1 - первый канал в Интернет 193.232.1.0 (параметры описаны в ifcfg-eth1, собственный адрес - 193.232.1.34, адрес шлюза - 193.232.1.33, static, onboot). Сетка описана в /etc/sysconfig/network:

NETWORKING=yes
HOSTNAME=имя-хоста
GATEWAY=193.232.1.33
GATEWAYDEV=eth1

Добавляем настройки ethernet для второго канала (собственный адрес - 193.232.2.50, адрес шлюза - 193.232.2.49). Провайдер поставил ненормальный медиаконвертор , который не умеет делать автосогласование, но работает в режиме полного дуплекса, так что предварительно необходимо настроить модуль сетевой карты на 10FD:

alias eth2 tulip
options tulip options=10

При использовании любого дистрибутива предпочтительно использовать принятые в нём традиции, в данном случае настраивать сеть, создав файл /etc/sysconfig/network-scripts/ifcfg-eth2 и выполнив "ifup eth2" (явное задание MAC адреса может пригодиться, если ядро поименует интерфейсы в неправильном порядке):

DEVICE=eth2
BOOTPROTO=static
IPADDR=193.232.2.50
NETMASK=255.255.255.240
NETWORK=193.232.2.48
ONBOOT=no
#HWADDR=00:0E:0C:XX:XX:XX

Создаём таблицу маршрутизации ISP2 для использования второго канала:

echo "200 ISP2" >> /etc/iproute2/rt_tables
ip route add default via 193.232.2.49 dev eth2 table ISP2

Добавляем правила для использования этой таблицы для трафика с одного из компьютеров локальной сети и собственного интерфейса eth2 (для более интересных случаев необходимо использовать маркировку пакетов средствами iptables):

ip rule add from 193.232.2.50 table ISP2
ip rule add from 192.168.0.3 table ISP2
ip route flush cache

Симметричный вариант. Создаём таблицы маршрутизации для обоих каналов:

echo "100 ISP1" >> /etc/iproute2/rt_tables
ip route add 193.232.1.32/30 dev eth1 src 193.232.1.34 table ISP1
ip route add default via 193.232.1.33 dev eth1 table ISP1
ip route add 127.0.0.0/8 dev lo table ISP1
ip route add 192.168.0.0/24 dev eth0 table ISP1
echo "200 ISP2" >> /etc/iproute2/rt_tables
ip route add 193.232.2.48/28 dev eth1 src 193.232.2.50 table ISP2
ip route add default via 193.232.2.49 dev eth2 table ISP2
ip route add 127.0.0.0/8 dev lo table ISP2
ip route add 192.168.0.0/24 dev eth0 table ISP2

Правила выбора нужной таблицы и задание исходящих адресов

ip rule add from 193.232.1.34 table ISP1
ip route change 193.232.1.32/30 dev eth1 src 193.232.1.34
ip rule add from 193.232.2.50 table ISP2
ip route change 193.232.2.48/28 dev eth2 src 193.232.2.50
ip rule add from 192.168.0.3 table ISP2
ip route flush cache

Для распределения нагрузки между каналами надо заменить маршрут по умолчанию в главной таблице (балансируются маршруты, а не байты!):

ip route add default scope global nexthop via 193.232.1.33 dev eth1 weight 1 \
   nexthop via 193.232.2.49 dev eth2 weight 5

Параметры ядра 2.4/2.6

Включение /proc/sys/net/ipv4/conf/имя-интерфейса/rp_filter (в RH включён) позволяет ядру проверять входящие пакеты на правильность исходящего адреса (ответ на пакет должен посылаться на тот же самый интерфейс), так что правила сетевого экрана на подделку локальных адресов в приходящих из Интернет пакетов не нужны. В сложных случаях (ассиметричная маршрутизация, балансировка каналов) необходимо отключить (если отключение не помогло, то отключить и в all).

Параметр /proc/sys/net/ipv4/conf/имя-интерфейса/log_martians задаёт необходимость записи в журнал сообщений об отброшенных пакетах.

Дополнительную информацию (довольно старую) можно получить в документации по ядру (например, ip-sysctl.txt и proc.txt) или ipsysctl tutorial (2003), перевод компиляции ip-sysctl.txt и ipsysctl tutorial:

IPv6

Разработчики так гордятся реализацией IPv6, что от неё нелегко избавиться. Попытки вставить NETWORKING_IPV6=no в /etc/sysconfig/network и IPV6INIT=no (IPV6TO4INIT=no) в /etc/sysconfig/network-scripts/ifcfg-eth0 не помогают. Частично помогает команда "ip -6 addr flush dev eth0" в /etc/rc.local ("install ipv6 /bin/false" в /etc/modprobe.conf?). Более тщательный способ.

Ссылки

@ Карта сайта News Автора!

Bog BOS: Настройка TCP/IP в Linux

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru