Эта статья поможет изучить базовую
настройку сетевого интерфейса и маршрутов в Linux. После изучения статьи
вы сможете администрировать сетевой интерфейс в, добавлять статичные
маршруты и создавать шлюзы на Linux.
Сетевой интерфейс Linux
Сетевой интерфейс – это точка присутствия
сервера в локальной сети. В свою очередь, локальная сеть скорее всего
будет иметь доступ в глобальные сети.
Настройка сетевого интерфейса это типичная задача при установке сервер на colocation и в ней нет нечего сложного.
Какие файлы влияют на работу сетевого интерфейса в Linux CentOS 5:
/etc/modprobe.conf – здесь загружаются модули ядра для различных устройств:
alias eth0 pcnet32
alias eth1 pcnet32
...
/etc/hosts – здесь находится список ip-адресов и назначенных им имен.
Удобно в отсутствие DNS-сервера или когда нет необходимости сообщать эти имена на всю сеть.
/etc/resolv.conf – в этом файле указываются DNS сервера. DNS-сервер задается директивой nameserver
# cat /etc/resolv.conf
nameserver 192.168.146.2
/etc/host.conf – файл указывает
последовательность использования механизмов разрешения имени. В нашем
случае сначала используем /etc/hosts а только потом DNS-сервер.
# cat /etc/host.conf
order hosts,bind
/etc/init.d/network – скрипт останавливающий и запускающий работу сети
/proc/sys/net/ipv4/ip_forward – включение
маршрутизации для своих интерфейсов, если у вас два или более
интерфейсов её нужно включить. Включение осуществляется передачей "1” в
этот файл.
# echo '1' > /proc/sys/net/ipv4/ip_forward
/etc/sysconfig/network — здесь мы
указываем, является ли наш сервер доступным по сети, если да то по каким
протоколам и указываем наш hostname, то есть имя сервера. Default
gateway рекомендуется указывать здесь.
# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=centos52
NETWORKING=yes — будет ли наш сервер работать в сети, наверно 99% случаев ответ будет — да, то есть yes Эта директива для Ipv4
NETWORKING_IPV6=no — Ipv6 уже где-то используется но не настолько чтобы переводить сервера на его использование. Пока я не буду его включать.
HOSTNAME=centos52 — имя нашего сервера
В /etc/sysconfig/network-scripts/ находятся различные скрипты влияющие на работу сетевого интерфейса:
# ls -l /etc/sysconfig/network-scripts/
-rw-r--r-- 1 root root 140 Feb 14 19:23 ifcfg-eth0
-rw-r--r-- 1 root root 254 Mar 3 2008 ifcfg-lo
...
/etc/sysconfig/network-scripts/ifcfg-*
Для нас самое большое значение имеют
скрипты ifcfg-*. Именно в них описываются настройки сетевых интерфейсов
присутствующих в сервере.
Давайте посмотрим что у них внутри.
DHCP iface
Данный интерфейс работает с использованием службы DHCP.
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:0C:29:43:5B:3D
ONBOOT=yes
Мой компьютер работает по DHCP, что
отчетливо видно по директиве BOOTPROTO=dhcp. То есть сетевые настройки
мы получаем у dhcp-сервера при загрузке нашего сервера. Другие директивы
означают следующее:
DEVICE=eth0 — как будет называться наш интерфейс, принято первый интерфейс называть как eth0, второй eth1 и так далее
HWADDR=00:0C:29:43:5B:3D — MAC-адрес
нашей сетевой карты. Media Access Control — это уникальный идентификатор
сетевой карты. У каждой сетевой карты свой MAC-адрес и в идеале он не
повторяется больше ни с каким в мире. Иногда MAC-адрес пытаются
подменить чтобы выдать свой компьютер за чужой, по каким либо
соображениям, обычно враждебным.
Длина MAC-адреса составляет 48 бит что позволяет иметь 281 474 976 710
656 уникальных комбинаций. У каждого
производителя сетевых плат есть свой диапазон в котором он назначает
MAC-адреса своим платам. MAC-адрес пишется в шестнадцатеричной форме
счисления.
ONBOOT=yes — включать ли этот интерфейс автоматически при включение сервера. Думаю, что скорее всего это и нужно.
Loopback iface
loopback-интерфейс необходим для нормальной работы ОС.
# cat /etc/sysconfig/network-scripts/ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
DEVICE=lo — это loopback интерфейс. Интерфейс есть в любой системе и всегда поднят. Он нужен для нормальной работы ОС.
IPADDR=127.0.0.1 — ip-адрес loopback интерфейса. Он всегда такой.
NETMASK=255.0.0.0 — сетевая маска
NETWORK=127.0.0.0 — сеть в которой находится наш ip-адрес
BROADCAST=127.255.255.255 — адрес широковещательной рассылки
ONBOOT=yes — включать ли интерфейс при загрузке сервера, конечно да!
NAME=loopback — имя сетевого интерфейса. Вывод команды ifconfig будет показывать значение указанное именно в DEVICE.
Custom iface
Выше мы рассмотрели интерфейс работающий
по протолу dhcp. Но как правило придется работать именно с
custom-интерфейсами, то есть вручную задавать параметры и маршрутизацию о
которой мы поговорим немного позже.
Вот custom-интерфейс
DEVICE=eth0
IPADDR=192.168.0.2
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=255.255.255.255
GATEWAY=192.168.0.1
ONBOOT=yes
BOOTPROTO=dhcp здесь отсутствует но есть другие директивы.
IPADDR=192.168.0.2 — здесь мы задаем ip-адрес нашего интерфейса
NETMASK=255.255.255.0 — сетевая маска
NETWORK=192.168.0.0 — сеть в которой находится наш ip-адрес
BROADCAST=255.255.255.255 — адрес широковещательной рассылки
GATEWAY=192.168.0.1 — шлюз через который мы попадаем в другие сети
ONBOOT=yes — включать ли интерфейс при загрузке сервера
Практика
Настроим сетевой интерфейс в Linux. Мы знаем что lo всегда включен и его не нужно вообще трогать.
Редактируем /etc/sysconfig/network-scripts/ifcfg-eth0
Мой конфигурационный файл выглядит так:
DEVICE=eth0
HWADDR=00:0C:29:43:5B:3D
IPADDR=192.168.146.130
NETMASK=255.255.255.0
BROADCAST=192.168.146.255
GATEWAY=192.168.146.2
ONBOOT=yes
Далее нужно перезагрузить сетевой интерфейс чтобы прочитались новые настройки
# service network restart
или
# /etc/init.d/network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]
Проверим все ли поднялось
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:43:5B:3D
inet addr:192.168.146.130 Bcast:192.168.146.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff :fe43:5b3d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1327 errors:0 dropped:0 overruns:0 frame:0
TX packets:1340 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:149547 (146.0 KiB) TX bytes:232486 (227.0 KiB)
Interrupt:59 Base address:0x2000
...
Жирным выделены особенно интересные нам
участки в выводе команды ifconfig. Как видим все похоже на правду и
интерфейс «поднят», то есть находится в рабочем режиме.
Для большей ясности разберем и некоторые другие параметры сетевого интерфейса:
- MTU:1500 — это Maximum Transfer Unit. Различные сети и каналы
передачи имеют разные скорости обмена. Это определяет максимальную длину
пакета, пересылка которого с высокой вероятностью произойдет без
ошибок. Для Ethernet — сетей значение MTU составляет 1500 байт.
- Metric:1 — чем меньше это значение тем лучше считается маршрут до
этой сети. На серверах скорее всего это менять не придется. Этот
параметр играет большую роль в работе протоколов маршрутизации.
- Сollisions:0 — нулевое значение говорит о том, что с сетевым интерфейсом все в порядке на физическом уровне.
- RX bytes — сколько данных принято
- TX bytes — сколько данных отослано
Так идем дальше. В примере выше, после
настройки сетевого интерфейса мы полностью перезагружали службу network.
Когда на сервере только один интерфейс это не страшно, но если их
несколько и какие-то уже работают и выполняют свои функции прерывать их
работу нежелательно. Тут нам на помощь приходит скрипт ifup/ifdown. Он
нужен для перезагрузки какого либо одного сетевого интерфейса. Короткий
пример.
Шаг 1. Вносим изменения в /etc/sysconfig/network-scripts/ifcfg-eth0
Шаг 2. # ifdown eth0
Шаг 3. # ifup eth0
Маршрутизация
Маршрутизация — это процесс поиска
наилучшего пути от источника к получателю. Это набор правил по которым
будет передаваться трафик. Мы вроде бы с ней еще нечего не делали, но
она уже у вас работает. Не верите ? Сейчас проверим.
netstat – команда позволяющая отслеживать сетевые подключения сервера
# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.146.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.146.2 0.0.0.0 UG 0 0 0 eth0
В выводе мы увидим список сетей и как до
них добраться. То есть какой шлюз использовать для достижения пункта
назначения. Помните, когда мы настраивали сетевой интерфейс eth0 мы
указали директиву GATEWAY в ifcfg-eth0 ? Этот gateway был помечен как
default, то есть шлюз по умолчанию.
Весь трафик в сети, которые явно не
описаны в таблице маршрутизации, отправляются через шлюз по умолчанию. В
нашем случае default gateway —192.168.146.2
Вывод команды "netstat -r” нам говорит следующее:
Первая строка. Чтобы попасть в подсеть 192.168.146.0 нам не нужен никакой шлюз (*), поскольку мы и так находимся в этой сети
Вторая строка — это default, то есть
маршрут по умолчанию. Весь трафик предназначенный по все остальные сети
будет уходить через этот шлюз.
Genmask — это сетевая маска, благодаря маске можно отделить сетевую часть адреса от адреса хоста
Flags: U — это UP, то есть маршрут поднят и функционирует сейчас
Flags: UG — UP, Gateway. Маршрут поднят и использует gateway в своей работе
MSS – Maximum Segment Size, определяет максимальный размер пакета для этого маршрута.
Window – размер окна. Максимальный размер пакета, который система готова принять.
irtt — initial round trip time, задает
значение которое используется при установке соединения. Round trip time –
представляет из себя отрезок времени, если в течение которого от
удаленного хоста не пришло подтверждение о получение пакета, пакет будет
выслан снова.
Iface – показывает к какому интерфейсу относится маршрут
Прописываем маршруты
Если на сервере несколько сетевых интерфейсов то скорее всего понадобится вручную составить таблицу маршрутизации.
Приведу пример. У нас два сетевых
интерфейса eth0 и eth1. Через eth0 мы получаем доступ во внешние сети и
по умолчанию весь трафик направляется через него. Через eth1 мы получаем
доступ ко внутренней сети 192.168.147.0/24 но что еще важнее, в этой
сети есть сервер 192.168.147.1 у которого есть сетевой интерфейс в
подсеть 192.168.148.0/24 и мы очень хотим туда попадать. А для того что
туда попадать необходимо прописать правильные маршруты у себя в ОС.
Так выглядит таблица маршрутизации в нашем случае
# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.147.0 * 255.255.255.0 U 0 0 0 eth1
192.168.146.0 * 255.255.255.0 U 0 0 0 eth0
192.168.148.0 192.168.147.1 255.255.255.0 UG 0 0 0 eth1
192.168.146.2 0.0.0.0 UG 0 0 0 eth0 default
То есть в подсеть 192.168.148.0/24
(внутренняя подсеть) мы попадаем через eth1 -> 192.168.147.1, сервер
выполняющий роль шлюза в эту подсеть. Все остальное идет через default
шлюз. Все очень просто. Ну и собственно как привести настройки к этому.
Шлюз по умолчанию
# cat /etc/sysconfig/network
...
GATEWAY=192.168.146.2
...
eth0
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:43:5B:3D
IPADDR=192.168.146.130
NETMASK=255.255.255.0
BROADCAST=192.168.146.255
ONBOOT=yes
eth1
# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
HWADDR=00:0c:29:43:5b:47
IPADDR=192.168.147.2
NETMASK=255.255.255.0
И самое главное, файл в котором мы прописываем статический маршрут для eth1.
# cat /etc/sysconfig/network-scripts/route-eth1
192.168.148.0/24 via 192.168.147.1
Для того чтобы прописать маршруты для
какого либо интерфейса, необходимо создать файл route-<название
интерфейса> в каталоге /etc/sysconfig/network-scripts/ После того как
все готово к работе, мы перезагружаем сетевой сервис.
# service network restart
Теперь подведем итоги, что и как мы сделали.
Есть три вида маршрутов. Динамические –
которые динамически назначаются сетевому интерфейсу, например сервером
DHCP. Статические – которые вы вручную прописываете и они остаются в
настройках после перезагрузки сервера. И маршруты по умолчанию – когда
никакие другие маршруты не подходят для того, чтобы отослать по ним
пакеты.
Мы могли добавить маршрут в подсеть 192.168.148.0/24 командой route
# route add -net 192.168.148.0/24 gw 192.168.147.1
Но после перезагрузки сервера информация о
маршруте пропала бы. Чтобы такого не произошло используется специальный
механизм. А именно создание файла вида route-<имя интерфейса> в
/etc/sysconfig/network-scripts В него мы вносим список сетей и как до
них добраться. Каждая новая запись начинается с новой строки.
Про шлюз
Чтобы сервер был шлюзом для других компьютеров необходимо удовлетворить ряд условий:
- На сервере корректная таблица маршрутизации благодаря которой он поймет что делать с пакетами дальше;
- Включена передача пакетов между интерфейсами;
- Включен маскарадинг (или установлен прокси)
для нужной нам сети, например вот так
(перенаправлять пакеты для хостов из подсети
192.168.146.0/24):
# iptables -t nat -A POSTROUTING -s 192.168.146.0/24 -j MASQUERADE
Полезные ключи netstat
- r – показывает таблицу маршрутизации
- n – выводит статистику по ip-адресу, не пытается определить имя
хоста. Это работает несколько быстрее и обычно, вывод команды удобнее
читать
- a – показывает состояние всех сокетов на сервере. Сокет – это
конечная точка сетевых коммуникаций. Каждый сокет имеет тип и
ассоциированный с ним процесс.
- t – протокол tcp
- u – протокол udp
- i – отображает таблицу сетевых интерфейсов
- l – отображает сокеты в режиме LISTEN, то есть ожидающие соединения
- p – показать PID (process ID) и имя программы с которой взаимодействует сокет
netstat на практике
Параметров выше вполне достаточно, чтобы многое узнать из жизни сетевых служб.
Слушает ли кто нибудь 25-й порт ?
# netstat -nlp | grep :25
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2710/sendmail:
Видим что 25-й порт слушает процесс sendmail с PID 2710
# ps ux | grep 2710
root 2710 0.0 0.7 8992 1836 ? Ss 11:17 0:00 sendmail: accepting connections
Посмотрим текущие ESTABLISHED-соединения по tcp, то есть с кем у нас есть подключение и по какому порту
# netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 ::ffff :192.168.146.130:22 ::ffff :192.168.146.1:2642 ESTABLISHED
tcp 0 132 ::ffff :192.168.146.130:22 ::ffff :192.168.146.1:2027 ESTABLISHED
Как видим это только соединения по ssh
Также, будет полезно знать какие состояния бывают у сокетов:
- ESTABLISHED – сокет с установленным соединением;
- SYN_SENT – сокет в процессе установки соединения;
- SYN_RECV – был принят запрос установки соединения из сети;
- FIN_WAIT1 – сокет закрыт и соединение закрывается;
- FIN_WAIT2 – сокет закрыт и сокет ждет закрытия соединения с удаленного хоста;
- TIME_WAIT – сокет после своего закрытия, еще какое-то время принимает пакеты из сети;
- CLOSED – сокет не используется;
- CLOSE_WAIT – удаленный хост отключился, ожидаем закрытия сокета;
- LAST_ACK – удаленный хост отключился и сокет закрыт. Ожиданиепотдверждения;
- LISTEN – сокет ожидает входящие подключения;
- CLOSING – оба сокета отключились но еще не все наши данные отосланы;
- UNKNOWN – статус сокета неизвестен.
Мы научились настраивать один и более
сетевых интерфейсов. Разобрались с маршрутизацией. Узнали какие файлы и
как влияют на работу сети в Linux CentOS 5. Сейчас мы познакомимся с
двумя программами которые играют существенную роль в работе сети. Это
программа nmap – которая сканирует порты удаленного хоста и сообщается
какие порты на нем открыты. И программа tcpdump, она переводит вашу
сетевую плату в режим promiscuous, что позволяет перехватывать весь
трафик проходящий через карту.
NMAP
Nmap позволяет сканировать удаленные
компьютеры на предмет открытых портов. С более агрессивными опциями
можно узнать версию ОС и некоторые другие вещи.
Устанавливаем программу
# yum -y install nmap
Просканируем удаленный хост. Как видим есть кое что интересное.
# nmap -A -T5 192.168.146.132
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-02-18 19:36 MSK
Interesting ports on unixbox (192.168.146.132):
Not shown: 1677 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.3 (protocol 2.0)
111/tcp open rpcbind 2 (rpc #100000)
935/tcp open status 1 (rpc #100024)
MAC Address: 00:0C:29:25:04:55 (VMware)
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.7 - 2.6.11
Uptime 0.195 days (since Wed Feb 18 14:55:10 2009)
Nmap finished: 1 IP address (1 host up) scanned in 14.239 seconds
У nmap много различных опций, подробнее о них можно прочитать в man nmap
tcpdump
Иногда в целях выявления неисправностей
нам нужно выяснить, какие пакеты передаются по сети. Это не сложно
сделать с помощью tcpdump.
Слушаем весь трафик для MAC-адреса 00:a0:80:00:2f:fe на интерфейсе eth1
# tcpdump -n -i eth1 «ether host 00:a0:80:00:2f:fe»
Слушаем трафик для определенного ip-адреса и порта
# tcpdump -nn host 192.168.146.130 and port 22
Сканируем диапазон портов
# nmap -sT -p 13722-13783 linuxbox
Надеюсь, что данной информации будет достаточно. Если возникли какие-то вопросы, то пишите их в комментарии.
Дата публикации: Среда, Сентябрь 23rd, 2009.
Источник: http://www.manageserver.ru/2009/09/23/%D0%BA%D0%B0%D0%BA-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-%D1%81%D |