Теория работы сети в контексте RH Linux


Макаров Тихон

теория работы сетиЯ начинаю свой курс по сетям. Больший уклон я буду делать на администрирование, а в нем буду больше всего уделять внимание безопасности. Все, о чем я буду здесь рассказывать, будет относиться к linux (скорее всего Red Hat, т.к. пользуюсь именно им), хотя иногда я буду рассказывать и про Windows семейства NT.

Базовый пакет протоколов, или "язык" интернета - TCP/IP

TCP - (transmission control protocol) отвечает за доставку запроса конкретному приложению.

IP - (internet protocol) отвечает за работу доставку запросов между компьютерами.

TCP/IP поддерживает следующую адресацию:

1) Mac-адреса
2) IP-адреса
3) Имена

IP-пакеты передаются по сети и состоят из запрошенного содержимого и заголовка (в котором указываются ip- адреса получателя и отправителя).

Пакет выглядит примерно следующим образом:

заголовок Ethernet --- Заголовок IP --- Заголовок UDP --- Прикладные данные --- Контрольная сумма
14 байт --- 20 байт --- 8 байт --- 100 байт --- 4 байта

IP-адрес нужен для определения компьютера в сети. Представляется он следующим образом: ХХХ.ХХХ.ХХХ.ХХХ , где х - некоторая цифра (то есть всего 4 байта). Первые 2 байта - адрес сети. Последние два - адрес компьютера в ней. В данное время происходит переход от IP к IPv6 (для Linux Red Hat он используется начиная с ядра 2.2), т.к. у IP есть несколько существенных недостатков. Так, например, угроза того, что IP адреса будут все исчерпаны и заняты, появилась еще в середине 1995, однако данный кризис удалось избежать благодаря разделению IP адресов на сети, которые делятся на подсети:

1-126 Самые ранние компьютеры сети. (Сеть А)
128-191 Крупные компании (Сеть В)
192-223 Мелкие организации (Сеть С)
224-239 Постоянно меняющиеся IP адреса компьютеров.
240-255 Эксперимент.
* Цифры - первый байт IP адреса.

Для распределения одного байта сети между компаниями используется маска /хх, где хх - число битов в сетевой части адреса (эту запись еще называют нотацией CIDR (Classes Inter-Domain Routing)). Тогда для сети 193.156.89.170/25 позволяется использовать 7 битов (32 бита всего - 25 битов маски = 7) для указания компьютеров сети, то есть 2^7 компьютеров.

Под локальные IP адресса отведены 10.0.0.0 для сети А, 172.16.0.0 - 172.31.255.255 для сети В, 192.168.0.0 - 192.168.255.255 для сети С. Поскольку тогда получается, что мы не можем обратиться в локальному компьютеру из internet, т.к. нужный нам IP адрес будет стоять у сотен компьютеров разных компаний, используется система NAT, которая стоит на ограничивающем маршрутизаторе (компьютер, через который проходят вся пакеты из локальной сети в internet и обратно). NAT изменяет локальные IP на "фальшивый" IP компьютера для internet. Она ведет таблицу преобразований между такими преобразованиями для того, чтобы обработать пакет, пришедший к ней извне и отправить нужному компьютеру интрасети.

Как же устроены локальные сети? Как передаются по ним данные? Ответом на этот вопрос является рассказ о DHCP (протокол динамического конфигурирования узлов). Поскольку ручная настройка при добавлении Linux-узла утомительна, то появился этот протокол, автоматизирующий работу. Если на компьютере установлен DHCP-клиент, то компьютер ищет нужный ему сервер (клиент отсылает широковещательный запрос типа: "Кто знает, кто я такой и где лежит нужный мне сервер?", после чего следует по ответам, приходящим к нему), у которого получает свой IP-адрес, адрес DNS-серверов, адреса шлюзов, адреса серверов. Периодически клиент повторно обращается к серверу для продления "лицензии", которая позволяет ему использовать IP-адрес и др. адреса. В составе Red Hat DHCP-клиент лежит в директориях /usr/sbin/dhcpcd и /sbin/pump, а DHCP-сервер не поставляется. Сервер можно скачать по адресу www.isc.org.

Установка DHCP ISC:

а) Распаковка файла tar.gz
б) Запуск ./configure, а потом make и make install
в) Файл /server/dhcpd.conf необходимо переписать в /etc/ и настроить, а так же создать файл /var/db/dhcp.leases

Пример правильно настроенного файла dhcpd.conf:

option domain-name "nsk.su";
option domain-name-servers green.iis.nsk.su;
option subnet-mask 255.255.255.0
default-lease-time 1000;
max-lease-time 10000;
subnet 194.226.177.0 netmask 255.255.255.0 {
range 194.226.177.1 194.226.177.164
option broadcast-address 194.226.177.255
option routers green.iis.nsk.su
}
subnet 156.178.96.0 netmak 255.255.255.0 { }

Раз уж я заговорил о динамическом протоколе (DHCP), то расскажу еще и о каталоге динамической настройки: в директории /proc/sys/net/ipv4 находятся очень важные файлы с настройками. Причем файлы, в имени которых присутствует "max" или "rate" служат для предотвращения DoS-атак. Именно ради этого я и рассказываю об этом каталоге. Итак о DoS...

Атаки такие действуют методом "в лоб". Компьютер отсылает много пакетов на удаленный сервер, пока тот не отправит все свои ресурсы на "разгребание" такой атаки. Обычно в адресе "from:" указывают тот же сервер, что и для получателя. Таким образом организуется цикл, что и приводит к отказу в обслуживании.

Я так же хочу упомянуть о том, что существует атака - smurf (для нее очень часто используют программу nemesis): компьютер отправляет запрос на несколько крупных серверов с подложным адресом отправителя (адрес жертвы), после чего каждый компьютер отправляет ответ жертве. Легко понять, что таким образом жертву очень легко вывести из строя.

Итак, как Вы уже поняли, надо отключить поддержку echo-запросов (считайте пока, что эти запросы - обычная команда ping). Для закрытия атаки smurf необходимо запретить широковещательные ICMP (протокол управления сообщений в сети) - пакеты. Делается это командой: echo 1 > icmp_echo_ignore_broadcasts в каталоге /proc/sys/net.

Так же в /etc/inetd.conf (это конфиг. файл сетевого демона, подробнее о нем позже). Закомментируйте строки:

echo stream ...
echo dgram ...

От атаки DoS (DDoS - то же DoS, но отправляемое со многих компьютеров) защититься сложнее, хотя она и менее вредна. Сложно ведь определить, когда к серверу пытаются подключиться, а когда его пытаются "положить". Лучшими средствами являются: постоянное обновление ОП, увеличение буфера под них (про это читайте мануал к каждой службе), улучшить "железо", поставленное на компьютере, а главное - запретить с одного IP адреса несколько обращений за короткий срок.

Хочу привести пример опасности атаки на отказ в обслуживании: существует известная Вам Заочная школа программистов. Практически на ее любую службу на 1 марта 2004 года можно было провести атаку, что приводило к "молчанию" сервера следующие 5-10 минут.

Протокол PPP - Point-to-point Protocol (протокол "точка-точка"). Это протокол кодирования пакетов (хотя при синхронной форме это не так), позволяющий передавать данные по медленным и/или ненадежным каналам. За кодирование и декодирование пакетов отвечает драйвер РРР. РРР позволяет передавать множество пакетов по одному каналу, чем заслужил свою большую популярность относительно его предшественника CSLIP - протокол управления последовательным каналом со включенным сжатием данных. Но, несмотря на то, что РРР удовлетворяет всем возможностям сетей Ethernet, он чрезвычайно медленен.

В Linux он является подгружаемым модулем ядра, который просто "гоняет" пакеты через порты ввода/вывода интернет устройств, и устроен по типу сетевого интерфейса. Для соединения двух точек сети необходимо просто на обе из них поставить ОП, обеспечивающее работу РРР. Каждому интрефейсу РРР должен быть присвоен свой IP-адрес (хотя бывают типы подключений, когда ip и не нужен). Соединение РРР, установленное между 2-мя компьютерами уже можно считать отдельной сетью.

Ближе к делу. В Red Hat протокол РРР поставляется автоматически в виде демона pppd (узнать какая именно версия pppd у Вас установлена можно командой pppd -version). Почти все конфиги хранятся в /etc/ppp, а сам он в директориях:

+ /usr/sbin/
|- pppd // собственно, сам протокол
|- chat // работа с модемом
|- pppdump // type пакетов РРР
|- pppstats // статистика
+ /etc/ppp/options // настройки

Хотя в файлах настройки и могут находиться данные о РРР соединениях, обычно в Red Hat'e они лежат в /etc/sysconfig/network-scripts/ipcfg.* Вот пример:

PERSIST=YES
DEFROUTE=YES
ONBOOT=YES
INITSTRING=ATZ
MODEMPORT=/DEV/MODEM001
LINESPEED=56600
ESCAPECHARS=^]
DEFABORT=NO
HARDFLOWCTL=YES
DEVICE=PPP1
PPPOPTIONS=
DEBUG=YES
PAPNAME=REMOTE
REMIP=
IPADDR=
BOOTPROTO=NONE
MTU=
MRU=
DISCONNECTTIMOUT=100
RETRYTIMEOT=100
USERCTL=YES

Для каждого ifcfg* файла существует свой chat.* в одноименном каталоге, который выглядит примерно так:

'ABORT' 'ERROR'
...
'TIMEOUT' '100'

что показывает, что при получении сигнала Error, необходимо отключиться и т.п.

Связь между такими двумя файлами происходит благодаря ifup, которая запускается вместе с ядром при загрузке.

*** И одно задание для разминки: создать файл для DHCP-сервера, который:
а) дает IP адреса сети 222.100.189.х, где 100

б) компьютер с конкретным IP всегда получает определенный IP.