Маршрутизатор на CLS

Наверняка у многих из нас дома пылится старый комп, который и пыль собирает, и место “есть”, и выкинуть жалко. Но почему бы его не использовать как маршрутизатор, при том что такой аппарат будет гораздо более гибкий в настройке и безопасность увеличится раза в 2.

Итак, если мы решили таки собрать маршрутизатор нам для этого надо:

  1. Старенький комп (От 1.2 ГГц и более, от 512 мб ОЗУ и небольшой жд, а так же не менее двух сетевых карт) + настройки вашего провайдера для подключения к Интернету.
  2. Много любви к ОС Calculate (Gentoo) :)))

Сразу говорю, данный пример основан на CLS (Calculate Linux Scrath). Если Вы используете CDS, то такие сервисы как DHCP, BIND и т.п. там уже есть и настраиваются они при помощи команды cl-setup (как это делается можно узнать набрав cl-setup --help-all, или можно дождаться новой версии этого поста ;))

По окончании наш сервер-маршрутизатор будет выполнять роль сервера точного времени, dhcp- и rsync-сервера, а так же мы организуем доступ ко внутренним ресурсам: локальному dns-серверу (192.168.0.2:53), веб (192.168.0.3:80) и почтовику (192.168.0.4:110 и 25).

Итак, начнём с настройки ядра.
Проверим наши сети:

 # ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:60:F5:07:07:B8
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:11 Base address:0x9800

eth1 Link encap:Ethernet HWaddr 00:60:F5:07:07:B9
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:10 Base address:0x9400

Если вы не увидели ваши две карты и вы не уверены, какие карты у вас есть, попробуйте запустить lspci | grep Ethernet из пакета pciutils. Как только вы получите эту информацию, переходите к конфигурированию ядра и добавьте поддержку соответствующих драйверов.

Следующим шагом включите поддержку межсетевого экрана iptables и NAT (а также ограничителя пакетов, если вам он нужен). Приведенный список разделен на обязательные (*), обязательные для ADSL через PPPoE (a), рекомендуемые (x) функции и функции для ограничителя трафика (s). Неважно, как вы будете осуществлять их поддержку — в самом ядре или в качестве модулей, если функция будет затребована, соответствующий модуль будет загружен (загрузка модуля оставлена для читателя как занимательное для любого упражнение).

Networking options --->
[*] TCP/IP networking
[*] IP: advanced router
[*] Network packet filtering (replaces ipchains)
Если вы используете ядро 2.4.x, вам понадобится включить следующее для DHCP:
[*] Socket Filtering

IP: Netfilter Configuration --->
[*] Connection tracking (required for masq/NAT)
[x] FTP protocol support
[x] IRC protocol support
[*] IP tables support (required for filtering/masq/NAT)
[*] IP range match support
[x] MAC address match support
[*] Multiple port match support
[*] Packet filtering
[*] REJECT target support
[x] REDIRECT target support
[*] Full NAT
[*] MASQUERADE target support
[s] Packet mangling
[s] MARK target support
[x] LOG target support

QoS and/or fair queueing --->
[s] QoS and/or fair queueing
[s] HTB packet scheduler
[s] Ingress Qdisc

#Следующие пункты нужны, только если вы используете PPPoE
[a] PPP (point-to-point protocol) support
[a] PPP filtering
[a] PPP support for async serial ports
[a] PPP support for sync tty ports
[a] PPP Deflate compression
[a] PPP BSD-Compress compression
[a] PPP over Ethernet

За сетевой интерфейс подключённый к интернету примем eth1. Рассмотрим 2 типа подключения к интернету: через PPPoE при помощи xDSL модема и прямое с использованием статического/динамического IP. Ну так как с последним вариантом всё понятно, заострим внимание на PPPoE.

Всё разнообразие возможностей этого протокола объединено в одном пакете Roaring Penguin (Хохочущий Пингвин). Для этого просто выполним “emerge rp-pppoe”.
Загрузите /etc/ppp/pppoe.conf в ваш любимый текстовый редактор и внесите ее в файл.
Примечание: Для того, чтобы следующие настройки работали, у вас должен быть установлен baselayout-1.11.14 или выше в вашей системе.

(Замените “user” вашим именем пользователя и “password” вашим паролем)

 # nano /etc/ppp/pap-secrets
 # клиент сервер пароль
"user" * "password"
 # nano /etc/conf.d/net
Укажите baselayout использовать adsl в качестве eth1:
config_eth1=( "adsl" )
user_eth1=( "user" )
 # ln -s net.lo /etc/init.d/net.eth1
 # rc-update add net.eth1 default
 # /etc/init.d/net.eth1 start

Предупреждение: Когда поднимется DSL-интерфейс, создастся устройство ppp0. Хотя ваша сетевая карта называется eth1, IP-адрес на самом деле будет привязан к ppp0. Теперь, когда вы увидете в примерах использование «eth1», замените его на «ppp0».

Если у вас статический IP-адрес, то, по сравнению с динамическим IP-адресом, вам потребуется несколько больше параметров настроек. Дополнительно вам понадобится ваш IP-адрес, адреса шлюза и DNS-серверов.
Для пользователей с динамическим IP-адресом:

 # emerge dhcpcd
 # nano /etc/conf.d/net
Добавьте параметр, подобный этому:
config_eth1=( "dhcp" )

Для пользователей со статическим IP-адресом:

 # nano /etc/conf.d/net
Добавьте параметры, подобные этим:
config_eth1=( "66.92.78.102 broadcast 66.92.78.255 netmask 255.255.255.0" )
routes_eth1=( "default gw 66.92.78.1" )
 # nano /etc/resolv.conf
Добавьте по одной строке на каждый DNS-сервер:
nameserver 123.123.123.123

Настройки для обоих вариантов:

 # ln -s net.lo /etc/init.d/net.eth1
 # rc-update add net.eth1 default
 # /etc/init.d/net.eth1 start

У вас должно все работать, чтобы вы могли идти дальше.

Теперь надо настроить внутреннюю сеть.

 # nano /etc/conf.d/net
Добавьте строку, подобную приведенной:
config_eth0=( "192.168.0.1 broadcast 192.168.0.255 netmask 255.255.255.0" )
 # rc-update add net.eth0 default
 # /etc/init.d/net.eth0 start

Теперь надо настроить DHCP. Для этого мы можем использовать и dnsmasq, но нам интереснее всё сделать при помощи пакета net-misc/dhcp.
Для начала его надо установить:

#emerge net-misc/dhcp
 # nano /etc/dhcp/dhcpd.conf
(Вот пример файла настроек)
authoritative;
ddns-update-style interim;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.250;
default-lease-time 259200;
max-lease-time 518400;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name-servers 192.168.0.1;
}
 # nano /etc/conf.d/dhcpd
(Установите IFACE="eth0")
 # rc-update add dhcpd default
 # /etc/init.d/dhcpd start

Это минимальные настройки, необходимые для замены DHCP-возможностей от dnsmasq.

Для настройки DNS на этом сервере нам хватит просто запустить dnsmasq, т.к. в нём уже всё есть, но при желании можно заменить его и на bind и на встроенные утилиты CDS.

#emerge dnsmasq
или
#emerge calculate-server
Для первого варианта
#rc-update add dnsmasq default && /etc/init.d/dnsmasq start

На данный момент люди вашей сети могут общаться друг с другом и могут преобразовывать имена узлов с помощью DNS, но они все еще не могут по настоящему выйти в интернет.

Вот здесь на сцену выходит трансляция сетевых адресов (Network Address Translation — NAT). NAT — это способ подключить множество компьютеров в частной сети к интернету, если у вас в распоряжении есть только небольшой набор IP-адресов. Обычно вы получаете от провайдера только 1 IP-адрес, но вы хотите позволить всему вашему дому подключаться к интернету.

В ОС Calculate iptables уже установлен, но если вы используете gentoo, то вам понадобится его установить.
Сначала обнуляем наши текущие правила

 # iptables -F
 # iptables -t nat -F

Установим политики по умолчанию для трафика, не соответствующего ни одному из правил

 # iptables -P INPUT ACCEPT
 # iptables -P OUTPUT ACCEPT
 # iptables -P FORWARD DROP

Скопируйте и вставьте для примера…

 # export LAN=eth0
 # export WAN=eth1

Теперь закроем наши сервисы так, чтобы они могли работать только для LAN

 # iptables -I INPUT 1 -i ${LAN} -j ACCEPT
 # iptables -I INPUT 1 -i lo -j ACCEPT
 # iptables -A INPUT -p UDP --dport bootps -i ! ${LAN} -j REJECT
 # iptables -A INPUT -p UDP --dport domain -i ! ${LAN} -j REJECT

Отбросим все TCP/UDP-пакеты, обращающиеся к привилегированным портам

 # iptables -A INPUT -p TCP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP
 # iptables -A INPUT -p UDP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP

В конце добавляем правила для NAT

 # iptables -I FORWARD -i ${LAN} -d 192.168.0.0/255.255.0.0 -j DROP
 # iptables -A FORWARD -i ${LAN} -s 192.168.0.0/255.255.0.0 -j ACCEPT
 # iptables -A FORWARD -i ${WAN} -d 192.168.0.0/255.255.0.0 -j ACCEPT
 # iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
Сообщаем ядру, что ip-форвардинг разрешен
 # echo 1 > /proc/sys/net/ipv4/ip_forward
 # for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

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

 # /etc/init.d/iptables save
 # rc-update add iptables default
 # nano /etc/sysctl.conf
Добавьте/Раскомментируйте следующие строки:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1

Если у вас динамически назначаемый IP-адрес, возможно, вам понадобиться включить следующее:
net.ipv4.ip_dynaddr = 1

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

Параметр ip_dynaddr полезен для систем с соединением по необходимости или в случаях, когда ваш провайдер предоставляет динамические адреса. Благодаря этому решается проблема попытки подключения до полного запуска сетевого интерфейса. На деле это просто упрощает жизнь пользователям за вашим маршрутизатором.

Теперь надо открыть доступ ко всем внутренним ресурсам
Все правила проброса портов имеют вид iptables -t nat -A PREROUTING [-p протокол] --dport [внешний порт маршрутизатора] -i ${WAN} -j DNAT --to [IP-адрес/порт для проброса]. К сожалению, iptables не принимает имена узлов при пробросе портов. Если вы пробрасываете внешний порт на порт с тем же номером для внутреннего компьютера, то вы можете опустить порт назначения.

Скопируйте и вставьте для примера…

 # export LAN=eth0
 # export WAN=eth1

Пробрасывание HTTP-трафика на внутренний компьютер

 # iptables -t nat -A PREROUTING -p tcp --dport 80 -i ${WAN} -j DNAT --to 192.168.0.3
Пробрасывание DNS-трафика на внутренний компьютер
 # iptables -t nat -A PREROUTING -p tcp --dport 53 -i ${WAN} -j DNAT --to 192.168.0.2

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

Теперь нам следует настроить сервер точного времени на нашем сервере.
Сохранять системное время точным является неотъемлемой частью сопровождения хорошей системы. Одним из самых распространенных способов сделать это являются протокол сетевого времени (Network Time Protocol, NTP) и пакет ntp (содержащий реализации как сервера, так и клиента).

Многие запускают клиенты NTP на своих компьютерах. Очевидно, что множество клиентов по всему миру сильно загружают серверы NTP, обращаясь к ним. В условиях домашней сети мы можем помочь снизить нагрузку общедоступных серверов, предоставляя в свою очередь время нашим компьютерам. А в качестве бонуса обновление в локальной сети будет происходить намного быстрее! Все, что нам нужно, — запустить NTP-сервер на маршрутизаторе, который будет синхронизироваться с общедоступными серверами и предоставлять время другим компьютерам в локальной сети. Чтобы начать, просто наберите “emerge ntp” на маршрутизаторе.

 # nano /etc/conf.d/ntp-client
Измените, если хотите, но настройки по умолчанию вполне подойдут
 # rc-update add ntp-client default

 # nano /etc/ntp.conf
Добавьте следующие строки:
restrict default ignore
restrict 192.168.0.0 mask 255.255.255.0 notrust nomodify notrap
Это разрешит использовать ваш NTP-сервер только NTP-клиентам
с адресом из диапазона 192.168.0.xxx
 # nano /etc/conf.d/ntpd
Измените, если хотите, но настройки по умолчанию вполне подойдут
 # rc-update add ntpd default

 # /etc/init.d/ntp-client start
 # /etc/init.d/ntpd start

Примечание: Удостоверьтесь, что разрешили входящие и исходящие соединения на порт ntp (123/udp) при настройке сервера. Клиентам требуется только исходящий доступ на порт 123 через udp.

Теперь на клиентах также наберите emerge ntp. А дальше просто запустите ntp-клиент, потому что настройка элементарна.

 # nano /etc/conf.d/ntp-client
Измените "pool.ntp.org" в переменной NTPCLIENT_OPTS на "192.168.0.1"
 # rc-update add ntp-client default
 # /etc/init.d/ntp-client start

Ну что ж, теперь у вас есть полноценный маршрутизатор.
Для удобства переброски портов рекомендую написать небольшой скрипт и закинуть его в /usr/sbin.
Назовём скрипт “porting” и сохраним его со следующим кодом в /usr/sbin/porting:

#!bin/bash
export LAN=eth0
export WAN=eth1
iptables -t nat -A PREROUTING -p $3 --dport $2 -i ${WAN} -j DNAT --to $1

Теперь вы можете с лёгкостью пробрасывать порты выполняя в консоли:

#porting [адрес машины] [порт] [тип данных (udp или tcp)]

Have fan!!! :slight_smile:

Не считаю что это хорошая идея перепечатывать статью с сайта генты, даже не заменив тех вещей, которые предоставляет Calculate.

Не считаю что это хорошая идея перепечатывать статью с сайта генты, даже не заменив тех вещей, которые >предоставляет Calculate.

Например? Я готов подправить…

P.S.: Я кстати только 2 или 3 абзаца скатал с сайта gentoo, и то только потому, что “нет смысла изобретать велосипед, если есть мотоцикл”.

Не считаю что это хорошая идея перепечатывать статью с сайта генты, даже не заменив тех вещей, которые предоставляет Calculate.

Документация на gentoo.org распространяется под лицензией Creative Commons - Attribution / Share Alike Если есть конструктивные замечания - пишите.

Пожалуй действительно нужно указать что речь идет о Calculate Directory Server, так как в десктопных дистрибутивах для настройки сети используется Wicd.

Пожалуй действительно нужно указать что речь идет о Calculate Directory Server, так как в десктопных >дистрибутивах для настройки сети используется Wicd.

А я на “скратче” поставил… :slight_smile:

Ну хотя бы использовать DHCP и DNS из состава calculate server

Я за основу брал чистый скратч 10.0.
В целом конечно можно и на CDS сделать, но мне скратч нравится пока что больше (я просто до этого почти год не слезал с gentoo, поэтому не привык ещё к автоматике, так сказать).

Да, может мне тогда полностью переписать его строго под CDS?

а, может мне тогда полностью переписать его строго под CDS?
А смысл, суть идеи - минимализьм конфигурации маршрутизатора… объясните мне маленькому и глупому - нахрена в маршрутизаторе для дома LDAP сервер, например? Для днс? У какого? Кеширующего с редиректом? Хаха, смешно…

Автор, статья - хорошая, молодец!

2 батенька вы между авторитарным DNS и тупо кеширующем - не сильно видите разницу? =)