Дерни за веревочку, дверца и откроется. (C) Бабушка
| Страница ДКД (Страница провайдера) | Линукс-Чайник (Оглавление) |
ARP позволяет одному компьютеру "выступать" от лица другого.
Представьте, например, что у ARP-маршрутизатора есть модемный пул, по
которому дозваниваются клиенты (небольшой такой Интернет-провайдер).
Каждый модем представляет собой сетевой интерфейс, а следовательно
имеет IP-адрес, который присваивается дозвонившемуся клиенту.
ARP-маршрутизатор на запросы о MAC-адресе клиента посылает MAC-адрес
своей сетевой карточки. После этого все IP-пакеты, предназначенные
клиенту передаются маршрутизатору, а он посылает их дальше, по нужному
сетевому интерфейсу. Следует отметить, однако, что ARP работает только в
локальных сетях.
4. Почему именно ARP-маршрутизатор
В моем распоряжении был компьютер 486/DX2-66 c 8Mb RAM, и две сетевые
карточки - 3Com 905 и 509. Клиентские машины, которые должны были
получить маршрутизацию, имели 4 разные операционные системы, и
настраивать каждую у меня не было никакого желания. Я решил
использовать ARP по следующим причинам:
CONFIG_FIREWALL=y CONFIG_NET_ALIAS=n CONFIG_INET=y CONFIG_IP_FORWARD=y CONFIG_IP_MULTICAST=n CONFIG_SYN_COOKIES=y CONFIG_IP_FIREWALL=y CONFIG_IP_FIREWALL_VERBOSE=y CONFIG_IP_MASQUERADE=n CONFIG_IP_ALWAYS_DEFRAG=n CONFIG_IP_ACCT=y CONFIG_IP_ROUTER=y CONFIG_NET_IPIP=n
Я так же скомпилировал поддержку для своих 3Com сетевых карточек,
прямо в ядре, а не как модули, хотя вы вполне можете скомпилировать поддержку
второй карточки как модуль, при необходимости.
6. Настройка двух сетевых карт
После загрузки с новым ядром, я получил два сетевых устройства:
eth0 и eth1. При помощи dmesg я определил, что eth0 у меня 905
карточка, а eth1 - 509. Первым делом я определил IP-адреса карточек,
адреса подсетей и широковещательные адреса. По этому поводу можно долго
говорить, но лучше прочитать NET-3-HOWTO, а я рассмотрю простейший
случай - когда имеются две подсети класса С (то есть для адресации
хоста в подсети используется только последняя цифра IP-адреса). Пусть
первая подсеть имеет адрес 100.100.100.0, а вторая - 100.100.101.0, а
IP-адреса роутера 100.100.100.1 и 100.100.101.1 соответственно в каждой
подсети. Тогда получаем следующую конфигурацию:
eth0:
DEVICE=eth0
IPADDR=100.100.100.1
NETMASK=255.255.255.0
NETWORK=100.100.100.0
ONBOOT=yes
eth1:
DEVICE=eth1
IPADDR=100.100.101.1
NETMASK=255.255.255.0
NETWORK=100.100.101.0
ONBOOT=yes
В зависимости от дистрибутива Линукса у вас возможно будут различные конфигурационные файлы. Для RedHat достаточно создать файлы в директории /etc/sysconfig/network-scripts/ c именами ifcfg-eth0 и ifcfg-eth1 и записать в них конфигурацию. Файл ifcfg-eth0 у вас, скорее всего, уже есть, второй файл надо создать вручную. В дистрибутиве SuSE надо подправить всего один файл - /etc/rc.config, отредактировав следующие строчки:
# 2 сетевые карточки eth0 и eth1 NETCONFIG=_0 _1 # IP-адреса IPADDR_0=100.100.100.1 IPADDR_1=100.100.101.1 # Сетевые интерфейсы NETDEV_0=eth0 NETDEV_1=eth1 # Указываем маршрутизацию IFCONFIG_0="100.100.100.1 broadcast 100.100.100.255 netmask 255.255.255.0" IFCONFIG_1="100.100.101.1 broadcast 100.100.101.255 netmask 255.255.255.0"
Для других дистрибутивов могут быть другие настройки, (например для Дебиана, это файл /etc/init.d/network) но в любом случае вызываются одни и те же команды. Если угодно, это одна и та же конфетка, только в разных фантиках. В конце-концов, можно самому написать скрипт, по которому будет конфигурироваться вся сеть.
После того, как все настроено, попробуйте пингануть (то есть
использовать программку ping) хосты в каждой подсети. Если все
правильно подключено, в том числе - не перепутаны сетевые кабели, то
все должно нормально работать. Пока подсети не были разделены, я
использовал для отладки один кабель, физически перетыкая его из одной
карточки в другую.
7. Настройка firewall и ARP.
Настройке firewall посвящена отдельная статья, но в нашем случае
нам достаточно разрешить пересылку пакетов с одного интерфейса на
другой. Это достигается добавлением строчки типа
/sbin/ipfwadm -F -a accept -P all -S 0.0.0.0/0 -D 0.0.0.0/0
в один из последних загрузочных скриптов, например /etc/rc.d/rc.local Убедитесь, что у вас установлена программка ipfwadm в директории /sbin. Эта комманда позволяет пересылку любых пакетов с интерфейса на интерфейс. Почитайте документацию, чтобы задать более жесткие правила.
И, наконец - собственно настройка ARP. Для работы с таблицей ARP есть маленькая программка arp, установленная в моем случае в /sbin. С помощью программы ifconfig я узнал MAC-адреса своих сетевых карт (поле HWaddr).
00:60:97:B8:6E:37 00:A0:24:8A:AC:B2
<-----------------> Linux <----------------->
eth0 eth1
net_A net_B
100.100.100.xxx 100.100.101.xxx
host_A host_D
host_B host_E
host_C
То есть, в сеть 100.100.100.0 была обращена карточка eth0 с MAC-адресом 00:60:97:B8:6E:37, а в сеть 100.100.101.0 - eth1 c MAC 00:A0:24:8A:AC:B2. Хосты с именами host_A, host_B, host_C находятся в подсети net_A, а машины с именами host_D, host_E - в подсети net_B, что должно быть отражено в файле /etc/hosts:
... # сеть 100.100.100.xxx host_A 100.100.100.5 host_B 100.100.100.25 host_C 100.100.100.123 ... # сеть 100.100.101.xxx host_D 100.100.101.33 host_E 100.100.101.77 ...
Чтобы заработал ARP, необходимо, чтобы интерфейс eth0 выступал от имени хостов host_D и host_E в подсети net_A, и аналогично - для eth1. Для этого добавляем в один из скриптов следующие строчки:
# Карточка eth0 имеет MAC адрес 00:60:97:B8:6E:37 /sbin/arp -i eth0 -s host_D 00:60:97:B8:6E:37 pub /sbin/arp -i eth0 -s host_E 00:60:97:B8:6E:37 pub # Карточка eth1 имеет MAC адрес 00:A0:24:8A:AC:B2 /sbin/arp -i eth1 -s host_A 00:A0:24:8A:AC:B2 pub /sbin/arp -i eth1 -s host_B 00:A0:24:8A:AC:B2 pub /sbin/arp -i eth1 -s host_C 00:A0:24:8A:AC:B2 pub
После этой настройки, исполнив все эти комманды (перезагрузка не
требуется), пропингуйте одну подсеть из другой - ping будет проходить
только от перечисленных хостов и только на перечисленные, что,
собственно, нам и требовалось :-)
8. Заключение.
В последнее время, в связи с повсеместным переходом на "оконную"
технологию, локальные сети просто забиты ненужными пакетами. Дело в
том, что сети "Microsoft" используют немаршрутизируемый и впридачу
широковещательный протокол, который хорош только в очень локальных (я
бы сказал даже - домашних) - сетях. Слабым выходом является
использование относительно дорогостоящих Switch - коммутаторов, которые
на основе анализа MAC-адресов оптимизируют работу в сети. Однако против
широковещательной натуры Windows (да-да, это когда фонарик ползает
вправо-влево по Нетворк Неборхуд) они уже не помогут. После введения
ARP-маршрутизатора траффик из одной сети в другую уменьшился в 20 раз!
Если все-же необходимо сделать передачу файлов по сети Microsoft,
сделайте из ARP-маршрутизатора Samba-сервер ;-)
(L) CopyLeft Vladas Lapinskas, Dec, 98