Перейти к основному содержанию
Рецепты Linux

Main navigation

  • Основы
  • Система
  • Команды
  • Программы
  • Дистро
  • Интерфейсы
  • Устройства
  • Доки
User account menu
  • Войти

Строка навигации

  1. Главная
  2. Linux: Введение
  3. Сетевые и серверные возможности

Настройка сети

Итак, с работой сети в Linux Мефодий немного познакомился, однако то, как эту сеть использовать для личных нужд, понятнее не стало. Предже всего: как приучить имеющийся компьютер пользоваться имеющейся локальной сетью?

Настройка вручную

Первая мысль — настроить сетевые интерфейсы вручную. Это довольно просто, если знать полагающиеся при настройке данные: IP-адрес самого компьютера, IP-адрес маршрутизатора по умолчанию и адрес сервера доменных имён. Задать IP-адреса интерфейсам eth0 и lo можно уже известной командой ifconfig:

[root@sakura root]# ifconfig 
[root@sakura root]# ifconfig eth0 inet 192.168.102.125 netmask 255.255.255.0\
 broadcast 192.168.102.255 
[root@sakura root]# ifconfig lo inet 127.0.0.1 netmask 255.0.0.0\
 broadcast 127.255.255.255
[root@sakura root]# ifconfig 
 eth0     Link encap:Ethernet  HWaddr 00:0C:29:56:C1:36  
          inet addr:192.168.102.125  Bcast:192.168.102.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:34 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6765 (6.6 Kb)  TX bytes:8753 (8.5 Kb)
          Interrupt:17 Base address:0x1080 

 lo       Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
[root@sakura root]# ping -c1 192.168.102.1
 PING 192.168.102.1 (192.168.102.1) 56(84) bytes of data.
 64 bytes from 192.168.102.1: icmp_seq=1 ttl=64 time=0.613 ms

 --- 192.168.102.1 ping statistics ---
 1 packets transmitted, 1 received, 0% packet loss, time 0ms
 rtt min/avg/max/mdev = 0.613/0.613/0.613/0.000 ms

Пример 1. Настройка сетевых интерфейсов

Заметим, что вместе с IP-адресом необходимо указывать и сетевую маску, и широковещетельный адрес сети. Теперь пакеты доходят до любого абонента локальной сети, но не дальше, поскольку не задан ни один маршрутизатор. Добавить маршрутизатор можно командой route add:

[root@sakura root]# route
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 192.168.102.0   *               255.255.255.0   U     0      0        0 eth0
 127.0.0.0       *               255.0.0.0       U     0      0        0 lo
[root@sakura root]# ping 209.173.53.26
 connect: Network is unreachable
[root@sakura root]# route add default gw 192.168.102.1
[root@sakura root]# route
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 192.168.102.0   *               255.255.255.0   U     0      0        0 eth0
 127.0.0.0       *               255.0.0.0       U     0      0        0 lo
 default         192.168.102.1   0.0.0.0         UG    0      0        0 eth0
[root@sakura root]# ping 209.173.53.26
 64 bytes from 209.173.53.26: icmp_seq=1 ttl=114 time=166 ms

Пример 2. Добавление маршрутизатора по умолчанию

Мефодий заметил, что две записи в таблице маршрутизации уже были до выполнения команды route add: относительно локальных сетей 192.168.102.0/24 и 127.0.0.0/8. Эти записи появилась там в результате настройки сетевых интерфейсов: для пополнения таблицы достаточно было адреса и сетевой маски. Не хватало только явного указания маршрутизатора. Ключевое слово default заменило параметр -net 0.0.0.0 (из предыдущей лекции известно, что сети 0.0.0.0/0 в таблице маршрутизации принадлежит любой адрес), а параметр gw означает «gateway», т. е. маршрутизатор. Тем не менее служба доменных имён пока не работает: необходимо заполнить файл /etc/resolv.conf:

[root@sakura root]# ping www.ru
 ping: unknown host www.ru
[root@sakura root]# cat /etc/resolv.conf
[root@sakura root]# cat > /etc/resolv.conf
 domain nipponman.ru
 nameserver 192.168.102.1
[root@sakura root]# ping www.ru
 PING www.ru (194.87.0.50) 56(84) bytes of data.
 64 bytes from www.ru (194.87.0.50): icmp_seq=1 ttl=55 time=84.3 ms
  . . .
[root@sakura root]# update_chrooted conf

Пример 3. Определение домена и DNS-сервера

Последнюю команду присоветовал Гуревич. Дело в том, что подсистему, работающую с DNS, нередко «сажают в песочницу», то есть переносят в отдельный каталог, в котором выполняется chroot. Как сказано в лекции Конфигурационные файлы, в такой «песочнице» должны быть все нужные для работы файлы — и уж конечно процедурам DNS нужен свой файл-копия /etc/resolv.conf. Информация о том, кому что нужно копировать при изменении профиля системы, обычно хранится централизованно и управляется несложными сценариями. В данном дистрибутиве комнда update_chrooted conf как раз и копирует все изменившиеся конфигурационные файлы по песочницам.

Настройка при установке или загрузке системы

Мефодий очень обрадовался заработавшей сети и немедленно принялся сочинять простейший стартовый сценарий, который выполнял бы все нужные команды автоматически. Выяснилось, что такой сценарий уже есть в любом дистрибутиве Linux, хотя называться он может по-разному, как правило, /etc/init.d/network или networking. Как и полагается стартовому сценарию, с параметром start он настраивает сеть, а с пареметром stop — «выключает» сетевые настройки.

Безусловно, ни список сетевых интерфейсов, ни параметры их настройки не указаны в самом стартовом сценарии, как то хотел сделать Мефодий. Всевозможные сетевые настройки хранятся в /etc отдельно, как правило, в специальном подкаталоге. В разных дистрибутивах Linux применяются различные схемы размещения настроек. Система, установленная на компьютере Мефодия, использует общий подкаталог /etc/sysconfig для хранения большинства настроек, используемых не службами, а самими стартовыми сценариями, в том числе и network:

[root@sakura root]# ls -F /etc/sysconfig/
 acpi          framebuffer  init             network-scripts/  vlan
 apmd          harddisk/    keyboard*        nfs               xfs
 autologin*    harddisks    keyboard.rpmnew  pcmcia*           xinetd
 bootsplash    hotplug      klogd            rawdevices        xinitrc
 clock*        hwconf       kudzu            syslogd
 console/      i18n*        mouse*           system*
 consolefont*  i18n.rpmnew  network*         usb

Пример 4. Каталог /etc/sysconfig

Как видно из примера, в этом каталоге содержатся и конфигурационные файлы, и дополнительные сценарии, и вложенные подкаталоги для отдельных видов настроек. За сеть непоседствено отвечают файл /etc/sysconfig/network и содержимое подкаталога /etc/sysconfig/network-scripts:

[root@sakura root]# cat /etc/sysconfig/network
 NETWORKING=yes
 HOSTNAME=sakura.nipponman.ru
 DOMAINNAME=nipponman.ru
 GATEWAY=192.168.102.1

Пример 5. Настройка сети по умолчанию

Файл network оказался очень простым: в нём в формате shell определяются основные настройки сети: имя компьютера и домена, а также маршрутизатор по умолчанию. По-видимому, этот файл «втягивается» командой «.» из самого сценария network.

[root@sakura root]# ls  -F /etc/sysconfig/network-scripts/
 README@          ifdown-ppp*    ifup-ipv6*    ifup-sl*
 ifcfg-eth0*      ifdown-pre*    ifup-ipx*     net_cnx_pg*
 ifcfg-lo*        ifdown-sit*    ifup-plip*    net_prog.default*
 ifdown@          ifdown-sl*     ifup-plusb*   net_resolv.default
 ifdown-aliases*  ifup@          ifup-post*    network-functions*
 ifdown-iptun*    ifup-aliases*  ifup-ppp*     network-functions-ipv6*
 ifdown-ipv6*     ifup-ctc*      ifup-routes*
 ifdown-post*     ifup-iptun*    ifup-sit*

Пример 6. Каталог network-scripts

Каталог network-scripts содержит множество сценариев на все случаи сетевой жизни. В файле README описано, для чего какой сценарий нужен и что означают поля в каждом из них (часто этот файл хранится в /usr/share/doc/net-scripts, а не в /etc).

[root@sakura root]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
 DEVICE=eth0
 BOOTPROTO=static
 IPADDR=192.168.102.125
 NETMASK=255.255.255.0
 NETWORK=192.168.102.0
 BROADCAST=192.168.102.255
 ONBOOT=yes

Пример 7. Настройка интерфейса по умолчанию

А вот и настройки интерфейса eth0, которые Мефодию приходилось применять вручную. Таким образом, стоит только подать команду service network stop, как все сетевые интерфейсы «пропадут» (деактивизируются), а после service network start — снова появятся. Как правило, пользователю вообще не обязательно редактировать эти файлы. С каждым дистрибутивом поставляется программа-конфигуратор, которая позволяет «настроить сеть», не вспоминая, какие данные, в каком формате и куда нужно записывать. Обычно такая программа оформляется в стиле мастера, «кудесника», задающего только вопросы по существу, с её помощью и формируются более или менее подходящие конфигурационные файлы. Результатов работы мастера в большинстве случаев бывает достаточно, а в тех случаях, когда его искусственный интеллект пасует, администратор применяет свой естественный интеллект и редактор Vim. С другой стороны, изменить несколько значений в трёх конфигурационных файлах не так уж сложно. Когда настройщик действительно необходим — это во время установки системы на компьютер или непосредственно после неё. Настраивать приходится сразу всё в системе, так что любая экономия времени при этом существенна. В некоторых дистрибутивах используется схема ifupdown, основанная на технологии «. d»:

debian!shogun$ ls -F /etc/network
 if-down.d/       if-pre-up.d/  ifstate.hotplug  interfaces
 if-post-down.d/  ifstate       if-up.d/         options

Пример 8. Настройка сети с применением схемы «. d»

Настройка сетевых интерфейсов и маршрутизатора по умолчанию хранится одном файле (считается, что редактировать его автоматически — просто). Тонкая настройка сети — в файле options. Каталоги if-pre-up.d, if-up.d, if-down.d и if-post-down.d предназначены для служб, которые хотят производить какие-то действия, соответственно, перед тем, как сетевой интерфейс будет активизирован («поднят»), после успешной активизации интерфейса, перед тем как сетевой интерфейс будет деактивизирован («опущен») и после этого.

Автоматическая настройка

Программа-настройщик регулярно предлагала Мефодию «настроить сеть автоматически». В режиме автоматической настройки практически не запрашивается данных у пользователя. Это значит, что данные система должна брать откуда-то ещё, видимо, со специального сервера в локальной сети.

Запрашивать сетевые настройки с сервера вместо того, чтобы хранить их на каждом компьютере, довольно удобно. В самом деле: один сервер, один администратор, один файл с общими настройками. Более того, можно вообще не хранить персональных настроек для каждого компьютера в сети, а ограничиться настройками групповыми, лишь бы IP-адреса внутри группы различались. Одним из первых был разработан протокол RARP (reverse ARP), который, как следует из названия, занимается преобразованием, обратным ARP: по интерфейсному адресу компьютер узнаёт у сервера сетевой. В ethernet-сетях для этого посылается широковещательный ethernet-фрейм типа «RARP-запрос», который означает «Вот мой MAC-адрес. Кто-нибудь, дайте мне IP!». На что специальная программа-сервер отвечает RARP-ответом «Вот тебе IP!» — фреймом, содержащим IP-адрес, который сервер нашёл в своей таблице. Если в сети нет ни одного RARP-сервера или ни в одном из них не зарегистрирован интерфейсный адрес компьютера-клиента, тот останется без IP. Похожую схему использует и протокол BOOTP, применяющийся для сетевой загрузки компьютеров. Предполагается, что, получив IP-адрес, клиент заберёт с сервера (по протоколу TFTP, trivial FTP) некий файл, загрузит его в память и передаст управление. Поэтому в BOOTP передаётся не только IP-адрес клиента, но и IP-адреса TFTP-сервера и маршрутизатора по умолчанию и имя файла-загрузчика.

В современных сетях чаще всего используется протокол DHCP (Dynamic Host Configure Protocol, протокол динамической настройки сетевых абонентов). Он имеет очень широкие возможности: с сервера можно получить IP-адрес, сетевую маску и широковещательный адрес, имя домена, адреса маршрутизатора и серверов доменных имён, а также великое множество других параметров, вплоть до не предусмотренных в DHCP явно, так что их тип задаётся обычным числом, а интерпретация значения целиком определяется клиентом. Урезанную часть DHCP поддерживают «умные» сетевые устройства (те, что снабжены BootROM, т. е. ПЗУ с загрузочной программой). Но полностью обрабатывать все поля DHCP умеет специальный демон-клиент. В Linux этот демон называется dhcpcd (DHCPclient daemon). В его ведение, как минимум, входит настройка сетевого интерфейса, маршрута по умочанию и resolv.conf. Так что всё, что Мефодий делал вручную или вписывал в настроечный файл, можно получить «за просто так», если в сети работает DHCP-сервер: 

[root@sakura root]# ifconfig 
 lo      Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
  . . .
[root@sakura root]# cat /etc/resolv.conf 
[root@sakura root]# /sbin/dhcpcd -h sakura -N eth0
 dhcpcd.exe: interface eth0 has been configured with new IP=192.168.102.124
[root@sakura root]# ps gax | grep "dhcpcd"
 1011 ?        S      0:00 /sbin/dhcpcd -h sakura -N eth0
[root@sakura root]# cat /etc/resolv.conf
 nameserver 192.168.102.1
 search nipponman.ru
[root@sakura root]# ifconfig 
 eth0    Link encap:Ethernet  HWaddr 00:0C:29:56:C1:36  
         inet addr:192.168.102.124  Bcast:192.168.102.255  Mask:255.255.255.0

Пример 9. Использование dhcpcd

Протокол DHCP даже позволяет передавать серверу желаемое имя и адрес компьютера. Впрочем, выдача IP-адреса привязана, как правило, к MAC-адресу. Здесь есть особая хитрость. DHCP может неплохо работать, когда IP-адресов не хватает на всех: компьютеров с разными NAC-адресами в сети больше, чем выделенных IP, но эти компьютеры никогда не включаются все одновременно. Компьютер, определяемый в DHCP по MAC-адресу, не «присваивает» выданный IP навсегда: адрес сдаётся в «аренду» (lease) на некоторое время. Если до истечения срока аренды бывший владелец не подтвердил желание пользоваться адресом и дальше (не послал повторный DHCP-запрос), адрес считается незанятым. Но когда компьютер подключается к сети после долгого перерыва, сервер DHCP сначала просматривает «арендную историю» на предмет того, какой IP этому абоненту уже выдавался. Если этот IP не занят, то будет выдан именно он. И только когда к сети подключится совсем новый абонент, а все адреса уже когда-нибудь кому-то выдавались, среди них будет выбран и отдан в аренду новичку тот, что дольше всех оставался невостребованным. Наконец, чтобы избавиться и от этой ручной работы, можно перенастроить ifcfg-eth0 на использование DHCPD:

[root@sakura root]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
 DEVICE=eth0
 BOOTPROTO=dhcp
 NETMASK=255.255.255.0
 ONBOOT=yes

Пример 10. Настройка интерфейса на DHCP по умолчанию

Настройка соединений «точка–точка»

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

Соединение между двумя устройствами, вообще говоря, не сетевыми, а только способными передавать данные, описывается несколькими протоколами. Самый распространённый из них — PPP (Point-to-Point Protocol, протокол «точка–точка») — решает задачи, возникающие в силу особенностей соединений «точка–точка».

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

Во-вторых, нет необходимости поддерживать часть интерфейсного протокола: абонента на среде передачи данных два, никакой идентификации не требуется, потому что каждый может отличить себя от не-себя. Так, виртуальный сетевой интерфейс ppp0, соответствующий устройству, обменивающемуся данными по протоколу PPP, не обладает MAC-адресом.

В-третьих, оттого, что соединение не постоянное, а среда за время, пока абоненты не были связаны, могла измениться до неузнаваемости, обеим сторонам приходится при каждом дозвоне идентифицировать себя. Обычно идентифицируется только сторона, которой предоставляется доступ в сеть, но проверять, до правильного ли места мы дозвонились, тоже не мешает. При установлении соединения «точка–точка» процедуры идентификации проходят после того, как появляется возможность передавать данные, но до всякой сетевой настройки. Мало того, данные по настройке сети (аналогичные тем, что используются в DHCP) также передаются на этом этапе взаимодействия по протоколу PPP.

В силу того, что дозвон нужен пользователям самого разного уровня знаний, для PPP написано множество программ-«звонилок», использующих графическую подсистему, со звуками и прочими не относящимися к делу украшениями. Пример такой программы — kppp, утилита модемного доступа для рабочего стола KDE. Всё, что требуется от пользователя — это указать модем, список телефонов, куда звонить и тип идентификации. Впрочем, и здесь пользователь не освобождается от «тяжёлой» мыслительной работы: некоторые провайдеры (организации, предоставляющие выход в Internet) после дозвона требуют идентификацию не по протоколу PPP, а открытым текстом, на манер «login–password» в Linux. Иногда это и есть самый настоящий login: пользователю предоставляется терминальный доступ, а дальше пускай делает, что хочет. В этом случае приходится писать сценарий-диалог (chat script) в стиле «Дождаться строки «login:» — ввести входное имя. Дождаться строки «Password:» — ввести пароль. Дождаться подсказки командного интерпретатора — ввести «pppd» с параметрами».

Что совсем уже просто для пользователя, так это утилита wvdial, описанная в лекции Конфигурационные файлы. Она и модем сама определяет, и тип идентификации, и pppd настраивает и запускает тоже сама. В действительности же сетью занимается демон pppd, чьи конфигурационные файлы находятся в каталоге /etc/ppp:

[root@sakura root]# ls /etc/ppp
 callback-client  chap-secrets  ip-up    options.dialin   peers
 callback-server  ip-down       ip-up.d  options.dialout
 callback-users   ip-down.d     options  pap-secrets
[root@sakura root]# ls -l /etc/ppp/*secrets
 -rw-------    1 root     root           78 Jun 23  1995 /etc/ppp/chap-secrets
 -rw-------    1 root     root           77 Jun 23  1995 /etc/ppp/pap-secrets

Пример 11. Каталог с настройками PPP

Большинство из этих файлов по умолчанию не используются. Следует помнить, что идетификационная информация, используемая в PPP (в зависимости от особенностей соединения и пристрастий провайдера могут применяться протоколы идентификации PAP или CHAP), хранится в файлах pap-secrets и chap-secrets в текстовом виде. Хранить не пароль, а ключ, как это сделано в /etc/shadow нельзя, так что остаётся либо надеяться на права доступа к этим файлам, либо запускать pppd вручную (или с помощью тех же wvdial и kppp) и каждый раз этот пароль вводить.

Установить PPP-соединение можно поверх любой среды передачи данных, в том числе и поверх локальной сети. В этом случае pppd обменивается данными (посредством псевдотерминальной пары pty -- tty или ptmx -- pts/, описанной в лекции Работа с внешними устройствами) с демоном pppoe, выполняющим роль «модема». При этом передаваемые данные можно сжимать или шифровать, а главное, связь «точка–точка» устанавливается с конкретным пользователем, который ввёл одному ему известный пароль, поэтому часто выход в Internet, требующий строгого учёта трафика, делают именно с помощью пары pppd/pppoe. Наконец, в сети может быть настоящий модем, преобразующий эти данные в формат, пригодный для передачи по цифровым телефонным линиям (DSL). Кстати сказать, такой модем легко собирается из маленького компьютера с низким энергопотреблением, ядра Linux и доработанного стартового виртуального диска. Некоторые современные DSL-модемы устроены именно так, причём ядро и initrd записываются в перепрограммируемое ПЗУ.

Межсетевой экран

В Linux существует мощный механизм анализа сетевых и транспортных пакетов, позволяющий избавляться от нежелательной сетевой активности, манипулировать потоками данных и даже преобразовывать служебную информацию в них. Обычно такие средства носят название «firewall» («fire wall» — противопожарная стена, брандмауэр), общепринятый русский термин — межсетевой экран. В более старых версиях межсетевого экрана Linux использовался вариант межсетевого экрана ipchains, который впоследствии был заменён на более мощный, iptables.

Суть iptables в следующем. Обработка сетевого пакета системой представляется как его конвейерная обработка. Пакет нужно получить из сетевого интерфейса или от системного процесса, затем следует выяснить предполагаемый маршрут этого пакета, затем отослать через сетевой интерфейс либо отдать какому-нибудь процессу, если пакет предназначался нашему компьютеру. Налицо три конвейера обработки пакетов: «получить — маршрутизировать — отослать» (действие маршрутизатора), «получить — маршрутизировать — отдать» (действие при получении пакета процессом) и «взять — маршрутизировать — отослать» (действие при отсылке пакета процессом).

Между каждыми из этих действий системы помещается модуль межсетевого экрана, именуемый цепочкой. Цепочка обрабатывает пакет, исследуя, изменяя и даже, возможно, уничтожая его. Если пакет уцелел, она передаёт его дальше по конвейеру. В этой стройной схеме есть два исключения. Во-первых, ядро Linux даёт доступ к исходящему пакету только после принятия решения о его маршрутизации, поэтому связка «взять — маршрутизировать» остаётся необработанной, а цепочка, обрабатывющая исходящие пакеты (она называется OUTPUT) вставляется после маршрутизации. Во-вторых, ограничения на «чужие» пакеты, исходящие не от нас и не нам предназначенные, существенно отличаются от ограничений на пакеты «свои», поэтому после маршрутизации транзитные пакеты обрабатываются ещё одной цепочкой (она называется FORWARD). Цепочка, обслуживающая связку «получить — маршрутизировать», называется PREROUTING, цепочка, обслуживающая свазку «маршрутизировать — отдать» — INPUT, а цепочка, стоящая непосредственно перед отсылкой пакета — POPSTROUTING:

Обработка пакетов цепочками iptables
Иллюстрация 1. Обработка пакетов цепочками iptables

В варианте ipchains каждая цепочка представляла собой таблицу правил. В правиле задаются свойства пакета и действие, которое нужно выполнять со всеми пакетами, обладающими указанными свойствами. Когда пакет попадает в таблицу, к нему начинают последовательно применяться правила. Если пакет не имеет свойств, требуемых первым правилом, к нему применяется второе, если второе также не подходит — третье, и так вплоть до последнего, правила по умолчанию, которое применяется к любому пакету. Если свойства пакета удовлетворяют правилу, над ним совершается действие. Действие DROP уничтожает пакет, а действие ACCEPT немедленно выпускает его из таблицы, после чего пакет движется дальше по конвейеру. Некоторые действия, например LOG, никак не влияют на судьбу пакета, после их выполнения он остаётся в таблице: к нему применяется следующее правило, и т. д. до ACCEPT или DROP.

Из сказанного выше следует, что действия ACCEPT или DROP в каждой таблице могут примениться к пакету лишь однократно. Для большей гибкости цепочки iptables состоят из нескольких (двух-трёх) таблиц. Выходя живым из одной таблицы, пакет попадает в следующую, а уж последняя передаёт его, если завершается действием ACCEPT, на конвейер. Хотя таблицы функционально одинаковы, принято использовать их по разному назначению. Таблицу mangle используют для внесения исправлений в служебную информацию пакета, таблицу filter — для определния того, не стоит ли пакет уничтожить, а таблицу nat — для подмены сетевых адресов. В приведённой выше диаграмме буквами M, N и F отмечено, какие именно таблицы есть в цепочках и в каком порядке их проходит пакет.

Для просмотра правил во всех таблицах всех цепочек iptables можно воспользоваться командой iptables-save:

[root@sakura root]# iptables-save
 # Generated by iptables-save v1.2.11 on Fri Dec 24 21:06:12 2004
 *nat
 :PREROUTING ACCEPT [1:261]
 :POSTROUTING ACCEPT [3:220]
 :OUTPUT ACCEPT [3:220]
 COMMIT
 # Completed on Fri Dec 24 21:06:12 2004
 # Generated by iptables-save v1.2.11 on Fri Dec 24 21:06:12 2004
 *filter
 :INPUT ACCEPT [7:1077]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [5:355]
 COMMIT
 # Completed on Fri Dec 24 21:06:12 2004
 # Generated by iptables-save v1.2.11 on Fri Dec 24 21:06:12 2004
 *mangle
 :PREROUTING ACCEPT [7:1077]
 :INPUT ACCEPT [7:1077]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [5:355]
 :POSTROUTING ACCEPT [5:355]
 COMMIT
 # Completed on Fri Dec 24 21:06:12 2004

Пример 12. Пустые цепочки iptables

Команда группирует одинаковые таблицы каждой цепочки. В пустой таблице присутствует только правило по умолчанию (policy), в этом примере все умолчания равны ACCEPT (пропускать пакет).

Фильтрация

Мефодий озаботился судьбой «календарного сервера», изобретённого им на прошлой лекции. Как уже было замечено, он запустил этот сервис на порту 26000, используемом популярной сетевой компьютерной игрой, что может помешать игрокам. Поэтому Мефодий решил запретить обращение к 26000-му порту отовсюду, кроме самой машины, то есть со всех интерфейсов, кроме lo. С этой задачей справлялась настройка only_from = 127.0.0.1 метадемона, но её пришлось выключить, так как она автоматически запрещала доступ из сети ко всем сервисам компьютера:

[root@sakura root]# iptables --append INPUT --in-interface lo --protocol tcp --destination-port quake --jump ACCEPT
[root@sakura root]# iptables --append INPUT --protocol tcp --destination-port quake --jump REJECT
[root@sakura root]# iptables-save 
  . . .
 *filter
 :INPUT ACCEPT [1030:72984]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [730:69581]
 -A INPUT -i lo -p tcp -m tcp --dport 26000 -j ACCEPT 
 -A INPUT -p tcp -m tcp --dport 26000 -j REJECT --reject-with icmp-port-unreachable 
 COMMIT
  . . .
[root@sakura root]# service iptables save
 saving current rules to /etc/sysconfig/iptables: [ DONE ]

Пример 13. Фильтрация TCP-запросов из сети

Команды iptables получаются довольно длинными: нужно аккуратно описать свойства каждого фильтруемого пакета. В примере Мефодий добавил два правила в таблицу filter цепочки INPUT (таблица filter выбирается по умолчанию, если не оказан ключ «-t таблица»). Первое правило разрешает принимать TCP-пакеты, адресуемые на порт 26000, если они пришли из интерфейса lo. Проверка таких пакетов не дойдёт до второго правила: по действию ACCEPT они немедленно отправятся дольше по конвейеру. Второе правило не просто уничтожает пакет, пришедший на 26000 порт, но и, как то предписывает действие REJECT, посылает отправителю ICMP-пакет, сообщающий о том, что такие запросы не обслуживаются (при обычном действии DROP клиент некоторое время дожидается подтвержения). Из примера видно, что полнословные ключи iptables можно заменять на однобуквенные. Кроме того, пример показывает, что стартовый сценарий iptables (в этом дистрибутиве) обрабатывает параметр save, который делает изменения, внесённые вручную, постоянными (service iptables start, выполняемый при загрузке системы, использует /etc/sysconfig/iptables).

Подмена адресов

Если в некоторой сети используются адреса из описанного стандартом RFC1918 внутреннего диапазона (например, из сети 10.0.0.0/8), без дополнительных действий абоненты этой сети доступа к Internet иметь не будут. Пакеты с такими адресами запрещено передавать в Internet, а даже если они туда просочатся через маршрутизатор, соединяющий «внутреннюю» и «внешнюю» сети, следующий же маршрутизатор откажется их пересылать. Простая, казалось бы, мысль научить межсетевой экран, установленный на маршрутизаторе, подменять IP-адреса в пакетах, приходящих из внутренней сети, своим внешним IP-адресом наталкивается на серьёзное препятствие.

Допустим, абоненты с адресом 10.0.0.3 и 10.0.0.7 устанавливают TCP-соединение с адресом в Internet (скажем, 209.173.53.26). Специально обученный маршрутизатор подменяет 10.0.0.3 и 10.0.0.7 на адрес своего сетевого интерфейса, подключенного к внешней сети (допустим, 194.87.0.50). Пакеты уходят адресату, как если бы и тот, и другой были отправлены самим маршрутизатором. 209.173.53.26 отвечает на два запроса двумя пакетами, оба — на адрес 194.87.0.50. Что делать дальше? Как отличить пакет, предназначенны для 10.0.0.3 от такового же для 10.0.0.7?

На помощь приходит знание TCP! Как известно, TCP-соединение идентифицируется шестью параметрами: IP-адресами отправителя и получателя, портами на отправителе и получателе и номерами последовательности (SEQN) входящего и исходящего потока данных. В нашей схеме межсетевой экран обязательно заменяет IP-адреса одним, поэтому у двух принятых пакетов они совпадают. А вот с четырьмя оставшимися параметрами он волен поступать, как заблагорассудится: в любом случае каждому из сеансов должны соответствовать разные SEQN и разные номера исходящих портов. Осталось только держать в памяти таблицу соответствия TCP-соединений из внутренней сети TCP-соединениям во внешнюю сеть.

Этот механизм носит название «преобразование сетевых адресов» (Network Adress Translation, NAT). Следует помнить, что чем больше транспортных соединений отслеживается межсетевым экраном, тем больше требуется оперативной памяти ядру Linux и тем медленнее работает процедура сопоставления проходящих пакетов таблице. Впрочем, мощности современных компьютеров позволяют без каких-либо затруднений обслуживать преобразование адресов для сети с пропускной способностью 100Мбит/с и даже выше. В iptables есть специальный модуль для NAT и соответствующие действия в правиле. Такие правила принято помещать в таблиы типа nat:

[root@fuji root]# route -n
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 83.237.29.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
 192.168.102.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
 10.13.0.0       0.0.0.0         255.255.0.0     U     0      0        0 eth0
 127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
 0.0.0.0         83.237.29.1     0.0.0.0         UG    0      0        0 ppp0
[root@fuji root]# iptables-save
 # Generated by iptables-save v1.2.11 on Sat Dec 25 14:02:44 2004
 *nat
 :PREROUTING ACCEPT [216:12356]
 :POSTROUTING ACCEPT [242:27148]
 :OUTPUT ACCEPT [1428:91596]
 -A POSTROUTING -o ppp+ -j MASQUERADE 
 COMMIT
  . . .

Пример 14. Использование простейшего преобразования адресов

На том самом маршрутизаторе, где, по словам Гуревича, «всего один настоящий адрес, да и тот — PPP», как раз и настроено преобразование адресов. Делается это всего одним правилом, добавленным в таблицу nat цепочки POSTROUTING. Действие MASQUERADE отличается от действия SNAT (Source NAT) только тем, что может быть использовано на интерфейсах с изменяемым IP-адресом, таких как ppp или настраиваемый по DHCP eth. Если в процессе работы IP-адрес интерфейса поменяется, правило SNAT продолжит подменять адреса на старый, заданный во время настройки iptables. Зато MASQUERADE вынуждено спрашивать у системы IP-адрес указанного интерфейса для каждого преобразуемого пакета, что может быть неудобно на очень медленных или очень загруженных разнообразными службами компьютерах.

Преобразование адресов работает не только для TCP-соединений, но и для многих других протоколов, где возможно отследить либо настоящего адресата на внутренней сети, либо идентификатор сеанса связи. Например, ICMP-пакет команды ping содержат уникальный идентификатор, который используется в ответе на него, поэтому не составляет труда отследить, на чей именно ping пришёл ICMP-ответ. Таблица отслеживаемых соединений отражается в файле net/ip_conntrack виртуальной файловой системы /proc:

[root@fuji root]# cat /proc/net/ip_conntrack
  . . .
 icmp     1 30 src=192.168.102.125 dst=209.173.53.26 type=8 code=0 id=50179 [UNREPLIED] src=209.173.53.26 dst=83.237.29.65 type=0 code=0 id=50179 use=1
 tcp      6 431981 ESTABLISHED src=192.168.102.125 dst=194.87.0.50 sport=1027 dport=80 src=194.87.0.50 dst=83.237.29.65 sport=80 dport=1027 [ASSURED] use=1

Пример 15. Просмотр таблицы подменяемых адресов

Так и есть: во-первых, Мефодий (скорее всего) что-то рассматривает на сайте www.ru (он же 194.87.0.50), а во-вторых, он зачем-то запустил ping www.us: команда cat подана как раз между ICMP-запросом по адресу 209.173.53.26 и ответом на него. Левая часть таблицы описывает соединение до подмены адресов, а правая — после. Точно так же можно «ловить» и UDP-запросы к службе доменных имён, и многое другое.

Конечно, фильтрацией и маскарадом функции iptables не исчерпываются. Можно, например, задать статическую таблицу подмены адресов, тогда появится возможность принимать из Internet соединения, предназначенные для внутренних серверов. Того же можно добиться, используя подмену адреса только для соединений по определённым портам и т. д.

Перекрёстные ссылки книги для Настройка сети

  • Сетевые и серверные возможности
  • Вверх
  • Сетевые службы

Book navigation

  • Предисловие
  • Сеанс работы в Linux
  • Терминал и командная строка
  • Структура файловой системы
  • Работа с файловой системой
  • Доступ процессов к файлам и каталогам
  • Права доступа
  • Работа с текстовыми данными
  • Возможности командной оболочки
  • Текстовые редакторы
  • Этапы загрузки системы
  • Работа с внешними устройствами
  • Конфигурационные файлы
  • Управление пакетами
  • Сеть TCP/IP в Linux
  • Сетевые и серверные возможности
    • Настройка сети
    • Сетевые службы
  • Графический интерфейс (X11)
  • Прикладные программы
  • Политика свободного лицензирования

Последние материалы

  • Файл sudoers
    4 hours ago
  • Утилита visudo
    1 day 11 hours ago
  • Файловый менеджер Thunar
    1 week 4 days ago
  • Эмулятор терминала Terminator
    2 weeks 2 days ago
  • Приложение scanimage
    3 weeks 1 day ago
RSS feed

Secondary menu

  • О проекте

© 2008–2025 Олег Меньшенин mensh@yandex.ru