OpenBSD FAQ - Сеть [FAQ - На главную]



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

Сеть в OpenBSD настраивается при помощи конфигурационных файлов в /etc. Как правило, процесс настройки проходит во время установки операционной системы.

Поиск и настройка сетевых интерфейсов

Сетевые интерфейсы называются по имени типа карты (используемого им драйвера), а не по типу соединения. Вот пример вывода команды dmesg(8) для сетевой карты Intel Fast Ethernet:
fxp0 at pci0 dev 10 function 0 "Intel 82557" rev 0x0c: irq 5, address 00:02:b3:2b:10:f7
inphy0 at fxp0 phy 1: i82555 10/100 media interface, rev. 4
Это устройство использует драйвер fxp(4), а соответствующий номер устройства тут 0.

Утилита ifconfig(8) покажет какие сетевые интерфейсы были найдены в системе.

$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33200
        index 3 priority 0 llprio 3
        groups: lo
        inet 127.0.0.1 netmask 0xff000000
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:02:b3:2b:10:f7
        index 1 priority 0 llprio 3
        media: Ethernet autoselect (100baseTX full-duplex)
        status: active
        inet 10.0.0.38 netmask 0xffffff00 broadcast 10.0.0.255
enc0: flags=0<>
        index 2 priority 0 llprio 3
        groups: enc
        status: active
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33200
        index 4 priority 0 llprio 3
        groups: pflog
Приведенный выше пример показывает, что в системе найден только один ethernet интерфейс: fxp0. Он уже настроен и ему присвоен IP, поэтому мы видим строчку inet 10.0.0.38 netmask 0xffffff00 broadcast 10.0.0.255. Флаги UP и RUNNING так же для него установленны.

Скрипт netstart(8) настраивает сетевые интерфейсы во время загрузки. Для этого он использует hostname.if(5) конфигурационные файлы, где "if" соответствует полному имени интерфеса, необходимого для настройки. Для примера выше использовался бы файл /etc/hostname.fxp0, содержащий следующее:

inet 10.0.0.38 255.255.255.0
Того же результата, который мы получим при помощи файла hostname.fxp0, можно добиться и в интерактивном режиме:
# ifconfig fxp0 10.0.0.38 255.255.255.0
Обратите внимание, что несколько других виртуальных интерфейсов включены по умолчанию. Информацию о них вы можете найти в man-страницах: Другие виртуальные интерфейсы могут быть добавленны при помощи команды create ifconfig(8).

Имя машины (Hostname) и шлюз (Gateway)

Файлы /etc/myname и /etc/mygate используются netstart(8) скриптом. Оба из них содержат единственную строчку, в которой указывается полное доменное имя системы (domain name) и адрес хоста шлюза (address of the gateway host) соответственно. Файл /etc/mygate не обязательно должен существовать в системе. Более подробную информацю можно найти в myname(5).

Информация о DNS

Информация об используемых DNS серверах находится в файле resolv.conf(5), который настраиватеся при помощи resolvd(8).
$ cat /etc/resolv.conf
search example.com
nameserver 125.2.3.4
nameserver 125.2.3.5
lookup file bind
В этом примере доменное имя по умолчанию example.com, имеются два сервера DNS (с адресами 125.2.3.4 и 125.2.3.5), файл hosts(5) будет использован до получения информации от DNS-серверов.

Применение изменений настроек

Для того, чтобы применить новые настройки (или, как ещё говорят, чтобы они "вошли в силу"), вы можете или перезагрузиться или запустить скрипт netstart(8). Это можно сделать просто выполнив от root:
# sh /etc/netstart
Обратите внимание, при запуске этого скрипта могут появиться предупреждения (warnings), если его запуск подразумевает переконфигурацию уже сконфигурированных интерфейсов. Убедитесь, что интерфейс был сконфигурирован правильно при помощи ifconfig(8).

Хотя в OpenBSD возможна полная переконфигурация сетевых настроек системы без перезагрузки, рестарт системы НАСТОЯТЕЛЬНО рекомендуется после значительного изменения конфигурации.

Проверка маршрутизации (Routes)

Настройку маршрутизации можно проверить при помощи netstat(1) или route(8).
$ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use    Mtu  Prio Iface
default            10.0.0.1           UGS         4       16      -    12 fxp0
224/4              127.0.0.1          URS         0        0  32768     8 lo0
127/8              127.0.0.1          UGRS        0        0  32768     8 lo0
127.0.0.1          127.0.0.1          UH          2       15  32768     1 lo0
10.0.0/24          link#1             UC          1        4      -     4 fxp0
10.0.0.1           aa:0:4:0:81:d      UHL         1       11      -     1 fxp0
10.0.0.38          127.0.0.1          UGHS        0        0      -     1 lo0

$ route show
Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use    Mtu  Prio Iface
default            10.0.0.1           UGS         4       16      -    12 fxp0
base-address.mcast localhost          URS         0        0  32768     8 lo0
loopback           localhost          UGRS        0        0  32768     8 lo0
localhost          localhost          UH          2       15  32768     1 lo0
10.0.0/24          link#1             UC          1        4      -     4 fxp0
10.0.0.1           aa:0:4:0:81:d      UHL         1       11      -     1 fxp0
10.0.0.38          localhost          UGHS        0        0      -     1 lo0

Настройка Aliases для интерфейсов

OpenBSD имеет простой механизм для установки IP псевдонимов (алиасов) для сетевых интерфейсов. Чтобы сделать это, просто отредактируйте файл hostname.if(5).

В этом примере два alias добавлены к интерфейсу dc0, который был сконфигурирован с адресом 192.168.0.2 и маской сети 255.255.255.0.

$ cat /etc/hostname.dc0
inet 192.168.0.2 255.255.255.0
inet alias 192.168.0.3 255.255.255.255
inet alias 192.168.0.4 255.255.255.255
Как только создали этот файл был создан, запустите netstart или просто перезагрузитесь, чтобы изменения вступили в силу. Чтобы просмотреть все псевдонимы в системе, используйте ifconfig -A.

Dynamic Host Configuration Protocol

Dynamic Host Configuration Protocol или протокол динамической настройки узла - способ "автоматической" настройки сетевых интерфейсов. OpenBSD может быть сервером DHCP (конфигурируя другие машины), клиентом DHCP (сконфигурированный другой машиной), а также сочетать оба случая.

DHCP клиент

Для того, чтобы использовать включенный в OpenBSD клиент DHCP dhcpleased(8), отредактируйте файл hostname.if(5) соответствующего сетевого интерфейса. Часть этой главы, посвященная беспроводным сетям, расскажет как настроить беспроводный интерфейс. Для ethernet интерфейса достаточно добавить в этот файл всего одну строчку:
inet autoconf
OpenBSD получит свои IP-адрес, имя шлюза, а также адреса DNS серверов от DHCP сервера во время загрузки системы. Информацию по конфигурации и остальные возможности настройки можно найти в dhcpleased.conf(5).

Для того, чтобы получить IP от DHCP сервера в интерактивном режиме, просто запустите клиент в консоли:

# ifconfig xl0 inet autoconf
Замените xl0 названием конфигурируемого интерфейса.

DHCP сервер

Для того, чтобы использовать OpenBSD в качестве DHCP сервера, добавьте демон dhcpd(8) в автозагрузку:
# rcctl enable dhcpd
Во время следующей загрузки, dhcpd будет запущен и им будут испрользоваться все сетевые карты, в соответствии с конфигурацией в dhcpd.conf(5). Вместо этого вы также можете указать лишь определенные интерфейсы, задав их имена явно:
# rcctl set dhcpd flags em1 em2
Ниже приведен пример файла /etc/dhcpd.conf:
# Home
subnet 192.168.1.0 netmask 255.255.255.0 {
	option domain-name-servers 192.168.1.2;
	option routers 192.168.1.1;
	range 192.168.1.3 192.168.1.50;
}

# Guests
subnet 172.16.0.0 netmask 255.255.255.0 {
	option domain-name-servers 209.244.0.3, 8.8.8.8;
	option routers 172.16.0.1;
	range 172.16.0.2 172.16.0.254;
}
В этом примере рассматривается конфигурация с двумя подсетями: домашняя сеть и гостевая. Клиенты будут автоматически получать IP-адрес, шлюз и DNS-серверы, указанные в конфиге. Ознакомьтесь с dhcp-options(5), где описаны остальные поддерживаемые параметры.

Загрузка при помощи PXE (i386, amd64)

PXE (Preboot Execution Environment) представляет из себя стандартный метод загрузки системы, используя для этого только сеть. Сетевая карта клиента с поддержкой PXE транслирует запрос DHCP в самом начале процесса загрузки, и вместо получения только основной информации об использовании IP/DNS, клиенту также предоставляется файл для загрузки. В OpenBSD этим файлом является pxeboot(8), и предоставляется он обычно tftpd(8).

Беспроводные сети (Wireless Networking)

OpenBSD поддерживает ряд wireless чипсетов. Кроме того, поддерживаемые устройства могут быть найдены в usb(4) и pci(4). О том, на сколько хорошо и какие именно чипы они поддерживают, можно узнать из соответствующих man-страниц.

Следующие карты поддерживают режим Host-based Access Point (HostAP), что позволяет их использовать в качестве точки доступа:

Команда ifconfig(8) media показывает возможности сетевого интерфейса. Для беспроводных устройств она показывает поддерживаемые режимы 802.11a/b/g/n и режимы работы (hostap, ibss, monitor). К примеру, так можно посмотреть возможности интерфейса ath0:
$ ifconfig ath0 media
Чтобы использовать некоторые беспроводные карты, вам необходимо загрузить себе firmware при помощью fw_update(1). Некоторые производители не разрешают свободное распространение своих прошивок (firmware), поэтому они не могут быть включены в состав OpenBSD.

Еще один способ включения OpenBSD в беспроводную сеть состоит в совместном использовании обычной сетевой карты и внешней точки доступа для создания firewall.

Настройка беспроводного адаптера (Wireless Adapter)

Адаптеры на основе поддерживаемых чипов можно использовать как любой другой сетевой интерфейс. Чтобы подключить OpenBSD к существующей беспроводной сети, используйте утилиту ifconfig(8).

Пример hostname.if(5) файла, когда используется wireless в качестве клиента:

nwid puffyuberalles wpakey passwordhere
inet autoconf
Или, для нескольких точек доступа:
join home-net wpakey passwordhere
join work-net wpakey passwordhere
join cafe-wifi
inet autoconf
Обратите внимание, что ключевое слово inet autoconf должно быть в самом конце, т.е. после других строк конфигурации, поскольку сетевой адаптер не сможет отправлять DHCP запрос, пока он не настроен.

Автоматический выбор точки доступа можно временно отключить используя команду ifconfig nwid:

ifconfig ath0 nwid home-net
Если данная сеть уже существует в списке, её WPA-пароль будет использоваться автоматически, если потребуется. Команда ifconfig -nwid вернёт интерфейс в режим автоматического выбора точки доступа:
ifconfig ath0 -nwid

Использование trunking

Trunk'и - это виртуальные интерфейсы, состоящие из одного или нескольких сетевых карт. В этом разделе нашим примером будет ноутбук с wired интерфейсом bge0 и wireless интерфейсом iwn0. Мы создадим trunk(4) интерфейс, объединив оба из них в один. Интерфейсы для проводной и беспроводной сети должны быть подключены к одной сети.

Для этого мы сначала активируем два физических порта, а затем переназначаем их для trunk0.

# echo up > /etc/hostname.bge0
Однако для беспроводного интерфейса требуется немного больше настроек. Его необходимо подключить к нашей беспроводной WPA-защищенной сети:
$ cat /etc/hostname.iwn0
nwid puffynet wpakey mysecretkey
up
Теперь наш trunk интерфейс определен следующим образом:
$ cat /etc/hostname.trunk0
trunkproto failover trunkport bge0
trunkport iwn0
inet autoconf
Trunk настроен в failover режиме (режим аварийного переключения), поэтому можно использовать любой интерфейс. Если оба доступны, он предпочтет bge0, так как он первый задан в настройках.

Настройка сетевого моста (bridge)

Сетевой мост или bridge(4) является связующим звеном между двумя или более отдельными сетями. В отличие от маршрутизатора, пакеты проходят через bridge прозрачно: оба сегмента сети выглядят как единое целое для узлов по обе стороны сетевого моста. Мосты пересылают только те пакеты, которые должны пройти от одного сегмента к другому, при этом, интерфейс моста может иметь или не иметь собственного IP адреса. Если IP задан, интерфейс будет работать в двух режимах: первый - как часть моста, второй - как автономный NIC. Если ни один из интерфейсов не имеет IP адреса, мост будет передавать сетевые данные, но не будет обслуживаться извне (что рассматривется как фича).

Сетевой мост, использующийся в качестве DHCP сервера

Представим для примера, что у нас есть система с четыремя vr(4) интерфейсами, от vr0 и до vr3. Мы хотим соединить vr1, vr2 и vr3 вместе, оставив при этом vr0 как входную линию связи. Мы также хотим обслуживать IP адреса через DHCP, при помощи объединенных интерфейсов. Будучи DHCP сервером и маршрутизатором для входящей линии связи, box должен иметь IP-адрес в мостовой сети.

Невозможно назначить IP адрес непосредственно bridge интерфейсу. IP адрес должен быть добавлен к одному из интерфейсов, но мы не можем использовать физический интерфейс, так как link может быть down, и в этом случае адрес будет недоступен. К счастью, есть драйвер vether(4) (виртуальный ethernet), который можно использовать для этой цели. Мы добавим его к мосту, назначим ему IP адрес и скажем dhcpd(8) использовать его.

Сначала помечаем интерфейсы vr1, vr2 и vr3 как up:
# echo up > /etc/hostname.vr1
# echo up > /etc/hostname.vr2
# echo up > /etc/hostname.vr3
Затем создаем конфигурацию vether0:
# echo 'inet 192.168.1.1 255.255.255.0 192.168.1.255' > /etc/hostname.vether0
Настраиваем интерфейс моста так, чтобы он содержал все вышеперечисленные vr-интерфейсы:
$ cat /etc/hostname.bridge0
add vether0
add vr1
add vr2
add vr3
up
Наконец, говорим DHCP демону работать с vether0 интерфейсом:
# rcctl set dhcpd flags vether0
Перегружаемся и наслаждаемся работой моста!

Фильтрация пакетов при помощи моста

Как вы уже наверное догодались, для фильтрации трафика на мосту может использоваться Packet Filter. Имейте в виду, что по характеру моста одни и те же данные проходят через оба интерфейса, поэтому вам нужно фильтровать только один интерфейс.

Пара советов

Equal-cost Multipath Routing

"Equal-cost multipath routing" означает, что имеется несколько маршрутов в таблице маршрутизации к данной сети, например маршрут по умолчанию (default route) 0.0.0.0/0. Когда ядро определяет, каким маршрутом отправить пакет для данной сети, оно может выбрать любой из equal-cost маршрутов. В большинстве случаев такая маршрутизация используется для создания резервированного соединения с сетью логически более "корневого" уровня, например, подключения к сети Интернет.

Команда route(8) используется для добавления/удаления/изменения маршрутов в таблице маршрутизации (routing table). Аргумент -mpath используется при добавлении multipath маршрутов.

# route add -mpath default 10.130.128.1
# route add -mpath default 10.132.0.1
Проверим маршрутизацию:
# netstat -rnf inet | grep default
default     10.130.128.1      UGS       2      134      -     fxp1
default     10.132.0.1        UGS       0      172      -     fxp2
В этом примере мы видим, что маршрут по умолчанию достижим, используя 10.130.128.1 через интерфейс fxp1, а другой использует 10.132.0.1 и fxp2.

Так как mygate(5) до сих пор не поддерживает multipath маршрутизацию по умолчанию, вышеуказанные команды должны быть добавленны в конец hostname.if(5) файлов для fxp1 и fxp2 интерфейсов. Файл /etc/mygate должен быть после этого удален.

$ tail -1 /etc/hostname.fxp1
!route add -mpath default 10.130.128.1
$ tail -1 /etc/hostname.fxp2
!route add -mpath default 10.132.0.1
Наконец, не забудьте активировать multipath маршрутизацию, при помощи соответствующих параметров sysctl(8).
# sysctl net.inet.ip.multipath=1
# sysctl net.inet6.ip6.multipath=1
Не забудьте отредактировать sysctl.conf(5), чтобы сохранить изменения.

А теперь попробуем проверить работу разных маршрутов. Ядро будет распределять трафик в режиме балансировки (load balance) для каждого multipath маршрута.

# traceroute -n 154.11.0.4
traceroute to 154.11.0.4 (154.11.0.4), 64 hops max, 60 byte packets
 1  10.130.128.1  19.337 ms  18.194 ms  18.849 ms
 2  154.11.95.170  17.642 ms  18.176 ms  17.731 ms
 3  154.11.5.33  110.486 ms  19.478 ms  100.949 ms
 4  154.11.0.4  32.772 ms  33.534 ms  32.835 ms

# traceroute -n 154.11.0.5
traceroute to 154.11.0.5 (154.11.0.5), 64 hops max, 60 byte packets
 1  10.132.0.1  14.175 ms  14.503 ms  14.58 ms
 2  154.11.95.38  13.664 ms  13.962 ms  13.445 ms
 3  208.38.16.151  13.964 ms  13.347 ms  13.788 ms
 4  154.11.0.5  30.177 ms  30.95 ms  30.593 ms
Для дополнительной информации о том, как выбирается тот или иной маршрут, читайте RFC2992, "Analysis of an Equal-Cost Multi-Path Algorithm".

Стоит отметить, если интерфейс, используемый при multipath маршрутизации, потеряет соединение (например, нет carrier), ядро тем не менее все равно будет пытаться отправить пакеты маршрутом, сконфигурированным для этого интерфейса. Конечно, этот трафик никуда не попадет. Очень рекомендуется использовать ifstated(8) для проверки доступности интерфейса и коррекции таблицы маршрутизации.

Использование NFS

Network File System (NFS или Сетевая Файловая Система) используется для совместного использования файловой системы по сети.

В этом разделе приводятся шаги по простой установке NFS. В этом примере описывается NFS-сервер в LAN с клиентами из LAN. Здесь не обсуждаются вопросы безопасности NFS.

Настройка NFS сервера

Для начала, включите portmap(8), mountd(8) и nfsd(8) сервисы на сервере:
# rcctl enable portmap mountd nfsd
Следующим шагом мы настроим список файловых систем, чтобы сделать монтирование доступным для клиентов.

В этом примере наш сервер имеет адреc 10.0.0.1. Этот NFS-сервер обслуживает только клиентов из своей сети. Первый шаг в установке NFS - настройка файла exports(5):

$ cat /etc/exports
/docs -alldirs -ro -network=10.0.0 -mask=255.255.255.0
Директория локальной файловой системы /docs будет доступна через NFS. Параметр -alldirs указывает, что клиенты смогут монтировать полностью или лишь часть каталога /docs. Опция -ro указывает, что будет предоставлен доступ только для чтения. Последние два аргумента указывают, что только клиенты в сети 10.0.0.0 и использующие маску сети 255.255.255.0, будут авторизованы для монтирования этой файловой системы.

Теперь можно запустить сервисы на сервере.

# rcctl start portmap mountd nfsd
Если вы вносите изменения в /etc/exports когда NFS уже запущен, вам необходимо перезагрузить mountd:
# rcctl reload mountd

Подключение ФС через NFS

Файловые системы через NFS монтируются при помощи mount(8), или, точнее, mount_nfs(8).

Для монтирования ФС /docs, которая находится на машине 10.0.0.1, к себе в /mnt, выполните:

# mount -t nfs 10.0.0.1:/docs /mnt
Чтобы это происходило автоматически во время загрузки системы, добавьте следующую строку в ваш fstab(5):
# echo '10.0.0.1:/docs /mnt nfs ro,nodev,nosuid 0 0' >> /etc/fstab
Не забывайте использовать 0 0 в конце данной строки для файловой системы NFS, чтобы ваш компьютер не пытался запустить на ней fsck(8) во время загрузки.

При обращении к монтируемому каталогу от пользователя root, сервер автоматически отображает root доступ к имени пользователя nobody и группе nobody. Это важно знать при рассмотрении прав доступа к файлам. Например, возьмем файл с таким набором прав:

-rw-------    1 root     wheel           0 Dec 31 03:00 _daily.B20143
Если этот файл находится в NFS, и пользователь root пытается получить доступ к этому файлу через тот или иной NFS-клиент, доступ будет запрещен.

Пользователи и группы, которые должны иметь root-доступ, настраиваются при помощи файла exports(5) на стороне сервера.

Проверка состояния NFS

Для проверки, что сервис NFS работает должным образом, можно поверить RPC, которая регистрирует все запущенные демоны. Для этого используется rpcinfo(8).
$ rpcinfo -p 10.0.0.1
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100005    1   udp    633  mountd
    100005    3   udp    633  mountd
    100005    1   tcp    916  mountd
    100005    3   tcp    916  mountd
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
Есть несколько утилит для просмотра происходящего с NFS. Одна из них showmount(8), которая показывает, какие файловые системы смонтированы и кем. Есть также nfsstat(1), которая покажет более подробную статистику.