Настройка шлюза.
На шлюзе используются несколько другие программы, или по другому настроены. Для начала разберёмся с самим понятием "шлюз". Шлюзом я называю компьютер, имеющий более одного IP адреса. Шлюз связывает как минимум две сети. Подразумевается, что у нас уже есть настроенный и подключённый к Сети компьютер, в моём случае я использовал обычный компьютер с Slackware Linux, и инетом через мобильный телефон. Сеть у меня включается утилиткой kppp, причём настройка сети примитивна - всё по умолчанию. Единственное, что надо настраивать у моего опсоса(tele2) - номер телефона. Конечно нужно указать и интерфейс (его можно узнать выполнив dmesg после подключения девайса. Работает это всё через USB, но этот USB эмулирует COM интерфейс. Т.о. в железе это USB, но ПО работает с файлом /dev/tty* так, как будто это древний COM порт. Сама мобила тоже эмулирует некий древний дайлапный модем, т.е. туда можно отправлять разные команды и получать на них ответы. Правда смысл имеют всего 2 команды: Во первых ATZ (сброс), во вторых ATDPномер - набор номера телефона. Как только связь установится, сетевой интерфейс будет видно в ifconfig, в моём случае это ppp0. Ещё мне какой-нить IP дают, не обращал внимание какой именно. Сам адрес видимо постоянно меняется (динамический), и кроме того - "серый", т.е. входящие ко мне соединения невозможны. По этой (в частности) причине и такое наплевательское отношение к безопасности.
Настройка второго сетевого интерфейса.
Второй интерфейс у нас будет смотреть в нашу локальную сеть из двух компьютеров (шлюза и клиента). Подключив карточку и включив оба компьютера (глобальную сеть можно нужно не включать) надо прежде всего узнать командой ifconfig -a номер нашего интерфейса, у меня это eth1. Теперь правим /etc/rc.d/rc.inet1.conf - изменяем значение переменных соответствующего индекса (у меня eth1, потому индекс 1)
# Config information for eth1:
IPADDR[1]="192.168.1.1"
NETMASK[1]="255.255.255.0"
USE_DHCP[1]=""
DHCP_HOSTNAME[1]=""
Тут адрес жёстко задан, потому-что шлюз у нас будет иметь вполне конкретный адрес (впрочем можно и плавающий адрес сделать, всё равно клиенты найдут шлюз, вот только - зачем?)
Перезапускаем сеть:
Консоль:
/etc/rc.d/rc.inet1 restart
И смотрим наш интерфейс:
Консоль:
# ifconfig
eth1 Link encap:Ethernet HWaddr 00:80:ad:8c:cc:f1
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::280:adff:fe8c:ccf1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:83967 errors:1 dropped:0 overruns:0 frame:1
TX packets:2788372 errors:6 dropped:0 overruns:0 carrier:6
collisions:0 txqueuelen:1000
RX bytes:10069550 (9.6 MiB) TX bytes:4169453506 (3.8 GiB)
Interrupt:12 Base address:0x6000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:29792 errors:0 dropped:0 overruns:0 frame:0
TX packets:29792 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2928900 (2.7 MiB) TX bytes:2928900 (2.7 MiB)
Как видите интерфейс удачно поднялся и ему присвоился IP 192.168.1.1. Можно также и ручками подымать опускать интерфейсы той-же
ifconfig. До клиента нам пока не достучатся, ибо у него ещё нет IP, что-бы он его получил нам надо поднять DHCP сервер.
Настройка DHCP
Я использовал стандартный сервер из пакета dhcp-3.1.2p1-i486-1. Сначала его надо настроить, для нашего случая настройки такие:
Консоль:
# sed 's/^#.*//;/^$/d' /etc/dhcpd.conf
ddns-update-style ad-hoc;
option domain-name "bx";
option domain-name-servers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
authoritative;
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name "bx";
option broadcast-address 192.168.1.254;
option domain-name-servers 192.168.1.1;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
range 192.168.1.50 192.168.1.60;
default-lease-time 600;
max-lease-time 7200;
host aranei {
hardware ethernet 00:80:48:46:98:15;
fixed-address 192.168.1.10;
}
}
смысл данного конфига такой:
приходит клиент, и запрашивает IP адрес (используется широковещательный запрос на фиктивный IP .255)
сервер имеет пул IP от .50, до .60, он выдаёт первый свободный IP из этого пула.
имеется исключение: если MAC адрес клиента равен 00:80:48:46:98:15, то сервер выдаёт такому клиенту IP .10
Для запуска демона используется специальный скрипт (не помню где взял
надеюсь он под GPL...)
Консоль:
# cat
/etc/rc.d/rc.dhcpd #!/bin/sh
#
# /etc/rc.d/rc.dhcpd
# This shell script takes care of starting and stopping
# the ISC DHCPD service
#
# Put the command line options here that you want to pass to dhcpd:
#DHCPD_OPTIONS="-q eth0"
DHCPD_OPTIONS="-q eth1"
[ -x /usr/sbin/dhcpd ] || exit 0
[ -f /etc/dhcpd.conf ] || exit 0
start() {
# Start daemons.
echo -n "Starting dhcpd: /usr/sbin/dhcpd $DHCPD_OPTIONS "
/usr/sbin/dhcpd $DHCPD_OPTIONS
echo
}
stop() {
# Stop daemons.
echo -n "Shutting down dhcpd: "
killall -TERM dhcpd
echo
}
status() {
PIDS=$(pidof dhcpd)
if [ "$PIDS" == "" ]; then
echo "dhcpd is not running!"
else
echo "dhcpd is running at pid(s) ${PIDS}."
fi
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
;;
esac
exit 0
В принципе вся настройка скрипта сводится (при необходимости) к смене номера интерфейса в первой не закомментированной строке.
Создадим скрипт, установим его права 700, и запустим. Запускается он молча, но можно посмотреть его работу в /var/log/messages
Sep 9 08:33:01 bx dhcpd: Wrote 0 deleted host decls to leases file.
Sep 9 08:33:01 bx dhcpd: Wrote 0 new dynamic host decls to leases file.
Sep 9 08:33:01 bx dhcpd: Wrote 2 leases to leases file.
а теперь проверим его работу. вместе с DHCP сервером в комплекте идёт и клиент, причём в клиентском компе я использовал dhcpcd, а здесь у нас dhclient (это разные вещи на самом деле). Запустим его:
Консоль:
dhclient
Internet Systems Consortium DHCP Client V3.1.2p1
Copyright 2004-2009 Internet Systems Consortium.
All rights reserved.
For info, please visit
http://www.isc.org/sw/dhcp/Listening on LPF/eth1/00:80:ad:8c:cc:f1
Sending on LPF/eth1/00:80:ad:8c:cc:f1
Sending on Socket/fallback
DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7
DHCPOFFER from 192.168.1.1
DHCPREQUEST on eth1 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
bound to 192.168.1.51 -- renewal in 256 seconds.
вот... что-то произошло. ifconfig пишет, что:
Консоль:
# ifconfig
eth1 Link encap:Ethernet HWaddr 00:80:ad:8c:cc:f1
inet addr:192.168.1.51 Bcast:192.168.1.254 Mask:255.255.255.0
inet6 addr: fe80::280:adff:fe8c:ccf1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:83984 errors:1 dropped:0 overruns:0 frame:1
TX packets:2788393 errors:6 dropped:0 overruns:0 carrier:6
collisions:0 txqueuelen:1000
RX bytes:10072626 (9.6 MiB) TX bytes:4169457736 (3.8 GiB)
Interrupt:12 Base address:0x6000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:33483 errors:0 dropped:0 overruns:0 frame:0
TX packets:33483 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3272154 (3.1 MiB) TX bytes:3272154 (3.1 MiB)
как видно, сервер выдал новый адрес (в данном случае самому себе, что конечно приведёт к нарушению работы шлюза). Этот клиент тоже настраивается, но нам он нужен лишь для проверки, потому мы обойдёмся пустым конфигом по умолчанию.
Важно! не забудьте выключить этот клиент, а то он каждые несколько минут IP переписывает.
Консоль:
root@bx:~# ps uax | grep "dhcl"
root 4956 0.0 0.2 2208 596 ? Ss 09:12 0:00 dhclient
root 6072 0.0 0.3 2412 832 pts/2 S+ 09:48 0:00 grep --color dhcl
root@bx:~# kill 4956
root@bx:~# ps uax | grep "dhcl"
root 6075 0.0 0.3 2412 832 pts/2 S+ 09:48 0:00 grep --color dhcl
Теперь нужно прописать запуск dhcpd я это сделал в скрипте /etc/rc.d/rc.inet1
Примечание: по замыслу Патрика, сеть в слаке подымается двумя скриптами:
Скрипт /etc/rc.d/rc.inet1 подымает саму сеть.
А скрипт /etc/rc.d/rc.inet2 подымает сетевые демоны.
Есть ещё опциональный скрипт /etc/rc.d/rc.inetd, этот поднимает одноимённый демон суперсервера, который запускает не слишком нужные сетевые серверы. К примеру так обычно запускается FTP, если этот FTP нужен раз в году.
Я решил, что для DHCP сервера самое место именно в /etc/rc.d/rc.inet1. Впрочем, вы можете это изменить.
Вот отличия нового файла от старого:
Консоль:
root@bx:~#diff etc/rc.d/rc.inet1.new /etc/rc.d/rc.inet1 -c
*** etc/rc.d/rc.inet1.new 2009-08-25 08:37:21.000000000 +0400
--- /etc/rc.d/rc.inet1 2010-09-09 09:33:10.000000000 +0400
***************
*** 211,220 ****
--- 211,226 ----
if_up $i
done
gateway_up
+ if [ -x /etc/rc.d/rc.dhcpd ]; then
+ /etc/rc.d/rc.dhcpd start
+ fi
}
# Function to stop the network:
stop() {
+ if [ -x /etc/rc.d/rc.dhcpd ]; then
+ /etc/rc.d/rc.dhcpd stop
+ fi
gateway_down
for i in ${IFNAME[@]} ; do
if_down $i
Подразумевается, что клиент подключён. Теперь опять рестартанём сеть, и посмотрим что получилось:
(в /var/log/messages)
Sep 9 09:52:20 bx dhcpd: DHCPREQUEST for 192.168.1.10 from 00:80:48:46:98:15 via eth1
Sep 9 09:52:20 bx dhcpd: DHCPACK on 192.168.1.10 to 00:80:48:46:98:15 via eth1
Видно, что наш DHCP сервер принял запрос от клиента, и выдал ему адрес .10.
Набрав
Консоль:
root@bx:~# ping 192.168.1.10
PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.442 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.277 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=64 time=0.305 ms
64 bytes from 192.168.1.10: icmp_seq=4 ttl=64 time=0.281 ms
^C
--- 192.168.1.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.277/0.326/0.442/0.068 ms
убеждаемся в нормальной работе сети.
А если не работает?
Не работать может по многим причинам (я всю ночь не мог сделать - выяснилось, что просто сетевая карта не рабочая). Самое простое, ИМХО, идти к клиенту, останавливать там сеть, и поднимать её ручками:
Консоль:
root@bx:~# /etc/rc.d/rc.inet1 stop
Shutting down dhcpd:
root@bx:~# ifconfig
# нет ответа - интерфейсы не подняты
root@bx:~# ifconfig eth1 up 192.168.1.10
root@bx:~# ifconfig
eth1 Link encap:Ethernet HWaddr 00:80:ad:8c:cc:f1
inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::280:adff:fe8c:ccf1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:84467 errors:1 dropped:0 overruns:0 frame:1
TX packets:2788575 errors:6 dropped:0 overruns:0 carrier:6
collisions:0 txqueuelen:1000
RX bytes:10224282 (9.7 MiB) TX bytes:4169487324 (3.8 GiB)
Interrupt:12 Base address:0x6000
# поднял интерфейс (только я это на сервере делал - ходить к клиенту мне лень

# теперь пропингуем клиентом самого себя - это я могу сделать и отсюда:
root@aranei:~# ping 192.168.1.10
PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.176 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.117 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=64 time=0.103 ms
^C
--- 192.168.1.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.103/0.132/0.176/0.031 ms
# сам себя пингует, и если провода и сетевухи нормальные, то должен пинговаться и с сервера:
root@bx:~# ping 192.168.1.10
PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.430 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.276 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=64 time=0.293 ms
^C
--- 192.168.1.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.276/0.333/0.430/0.068 ms
Если не получается, посмотрите журналы (и на сервере и на клиенте), возможно процесс какой-то мешает, или ещё что. Должно получится 
Как я уже писал, внешнюю сеть подключать пока НЕ надо, что-бы она не мешалась.
Итого: мы подняли сеть, и она даже работает
Конечно этого мало, ведь кроме ping больше ничего пока не работает.
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)