Сборка собственного маршрутизатора из старых деталей имеет множество преимуществ перед покупкой специализированного маршрутизатора (например Linksys). Одним из самых больших является контроль над соединениями. Другие преимущества оставим вашему воображению. Все, что может быть сделано по этому руководству, будет хорошим подспорьем для этого.
В этом руководстве рассказывается, как вам создать трансляцию сетевых адресов (NAT) на маршрутизаторе (на базе ядра Linux и iptables), добавить и настроить распространенные сервисы (систему доменных имен (DNS) с помощью dnsmasq, протокол динамической конфигурации хоста (DHCP) с помощью dhcpcd, ADSL с помощью rp-pppoe) и завершить настройку более детальной разработкой и интересными вещами (проброс портов, ограничение трафика, прокси/кэширование и многое другое...).
Перед тем, как начать, вы должны отвечать нескольким базовым требованиям. Во-первых, вам понадобится компьютер, в котором установлены не менее 2 сетевых карт (NIC). Во-вторых, вам понадобятся параметры настроек вашего соединения к интернету (возможно, включая параметры IP/DNS/шлюза/имени пользователя/пароля). Наконец, вам понадобится немного времени и любовь к ОС Gentoo.
Соглашения, используемые в данном руководстве:
Вашему ядру нужны драйверы, работающие для обеих сетевых карт. Чтобы
просмотреть, определены ли ваши карты системой, наберите
# 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
Если вы не увидели ваши две карты и вы не уверены, какие карты у вас есть,
попробуйте запустить
Следующим шагом включите поддержку межсетевого экрана 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 [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
Есть множество способов подключиться к интернету, поэтому я рассмотрю те, в которых хорошо разбираюсь сам. Остановимся на ADSL (PPPoE) и кабельном подключении (с использованием статических/динамических IP-адресов). Если другие способы не описаны здесь, смело пишите небольшое руководство и отправляйте мне по электронной почте. Вы можете смело пропускать следующие разделы, не касающиеся вас. В этой главе описывается подключение маршрутизатора к интернету через интерфейс eth1.
Все разнообразное ПО для PPPoE, которое использовалось в rp-pppoe (
(Замените "vla9h92" вашим именем пользователя и "boogie" вашим паролем) # nano /etc/conf.d/netУкажите baselayout использовать adsl поверх ppp0: config_ppp0=( "ppp" ) link_ppp0="eth1" plugins_ppp0=( "pppoe" ) pppd_ppp0=( "defaultroute" "usepeerdns"Здесь могут быть дополнительные настройки, см. /etc/conf.d/net.example ) username_ppp0="vla9h924" password_ppp0="boogie" # ln -s net.lo /etc/init.d/net.ppp0 # rc-update add net.ppp0 default # /etc/init.d/net.ppp0 start
Если у вас статический 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) и почему вы должны об этом позаботиться.
DHCP полностью оправдывает свое название. Это протокол, позволяющий вам
автоматически настраивать другие компьютеры. Вы запускаете DHCP-сервер (dhcpd)
на маршрутизаторе, даете ему всю информацию о вашей сети (доступные IP-адреса,
серверы DNS, шлюзы и т. д...), а затем, когда начнет загружаться другой
компьютер, он запустит DHCP-клиент и автоматически настоится. Ни суматохи, ни
беспорядка! Для более детальной информации вы всегда можете посетить
Мы воспользуемся пакетом dnsmasq, который предоставляет оба сервиса DHCP и DNS.
Сейчас перенесем свое внимание на DHCP. Помните, что если вы хотите запустить
отдельный сервер DHCP, то вы найдете другой пример в главе Забавные вещи. Также,
если вы хотите отточить настройки DHCP-сервера, просто прочтите комментарии в
# emerge dnsmasq # nano /etc/dnsmasq.confПросто добавьте эту строку, чтобы включить dhcp: dhcp-range=192.168.0.100,192.168.0.250,72hОграничим действия dnsmasq только интерфейсом локальной сети interface=eth0 # rc-update add dnsmasq default # /etc/init.d/dnsmasq start
Теперь ваш маленький маршрутизатор еще и DHCP-сервер! Подключите несколько
компьютеров и понаблюдайте за их работой! Для систем с ОС Windows вам
понадобится выбрать параметры «Obtain an IP address automatically»
(«Получать IP-адреса автоматически») и «Obtain DNS server
address automatically» («Получать адреса DNS-серверов
автоматически») в настройках соединения. Изменения не будут мгновенными,
поэтому запустите командную строку и введите в ней
Когда люди хотят посетить место в интернете, они запоминают названия, а не
набор бесполезных цифр. В конце концов, что проще запомнить — ebay.com
или 66.135.192.87? Вот здесь появляется система доменных имен — Domain
Name System (DNS). DNS-серверы работают по всему интернету, и если кто-нибудь
захочет посетить ebay.com, то они заменят ebay.com (понятный для нас) на
66.135.192.87 (понятный для компьютеров). Для более детальной информации о
DNS вы можете всегда посетить
Мы использовали пакет dnsmasq в качестве DHCP-сервера, но он также содержит и DNS-сервер, и вам больше ничего не надо делать! Ваш маленький маршрутизатор уже предоставляет услуги DNS для своих клиентов DHCP. Держу пари, что вы хотели бы, чтобы все было так просто ;).
Вы можете выбрать другой сервер DNS, если он более удобен для вас, но причина использования dnsmasq заключается в том, что он разработан специально для того, что хотим мы и ничего более. Это небольшой кэширующий/пробрасывающий сервер DNS для локальных сетей. Нам не нужно предоставлять DNS для нашего домена, просто осуществлять простые операции с DNS вне нашей локальной сети.
На данный момент люди вашей сети могут общаться друг с другом и могут преобразовывать имена узлов с помощью DNS, но они все еще не могут по-настоящему выйти в интернет. Вы можете подумать, что это великолепно (больше канала для вас!), но я готов поспорить, что они так не считают.
Вот здесь на сцену выходит трансляция сетевых адресов (Network Address
Translation — NAT). NAT — это способ подключить множество
компьютеров в частной сети к интернету, если у вас в распоряжении есть только
небольшой набор IP-адресов. Обычно вы получаете от провайдера только 1
IP-адрес, но вы хотите позволить всему вашему дому подключаться к интернету.
NAT —это то самое колдовство, делающее это возможным. Для более детальной
информации о NAT вы всегда можете посетить
Сначала обнуляем наши текущие правила # 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(Необязательно) Разрешаем доступ к нашему ssh-серверу из интернета # iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPTОтбросим все 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 полезен для систем с соединением по необходимости или в случаях, когда ваш провайдер предоставляет динамические адреса. Благодаря этому решается проблема попытки подключения до полного запуска сетевого интерфейса. На деле это просто упрощает жизнь пользователям за вашим маршрутизатором.
Верите ли или нет, но вы все уже сделали :). Начиная с этого раздела, я опишу несколько полезных тем, которые могут быть полезными для вас. Любая из этих глав необязательна.
Когда-нибудь вам может потребоваться сервисы на компьютере за маршрутизатором или же вы просто хотите сделать жизнь проще, подключаясь к локальной сети из интернета. Возможно, вы захотите запустить серверы FTP, HTTP, SSH или VNC на одном или нескольких компьютерах за вашим маршрутизатором и подключаться к ним всем. Есть только одно ограничение — вы можете запускать только по одному сервису на компьютере на каждый порт. Например, невозможно настроить три FTP-сервера за вашим маршрутизатором и попробовать подключиться ко всем трем из интернета через порт 21; только один из них будет на порту 21, когда как остальные будут использовать, скажем, порты 123 и 567.
Все правила проброса портов имеют вид
Скопируйте и вставьте для примера... # export LAN=eth0 # export WAN=eth1Пробрасывание порта 2 на ssh внутреннего хоста # iptables -t nat -A PREROUTING -p tcp --dport 2 -i ${WAN} -j DNAT --to 192.168.0.2:22Пробрасывание FTP-трафика на внутренний компьютер # iptables -t nat -A PREROUTING -p tcp --dport 21 -i ${WAN} -j DNAT --to 192.168.0.56Пробрасывание HTTP-трафика на внутренний компьютер # iptables -t nat -A PREROUTING -p tcp --dport 80 -i ${WAN} -j DNAT --to 192.168.0.56Пробрасывание VNC-трафика для внутренних компьютеров # iptables -t nat -I PREROUTING -p tcp --dport 5900 -i ${WAN} -j DNAT --to 192.168.0.2 # iptables -t nat -I PREROUTING -p tcp --dport 5901 -i ${WAN} -j DNAT --to 192.168.0.3:5900Теперь, если вам необходимо подключиться к VNC по адресу 192.168.0.3, то просто добавьте ":1" к имени маршрутизатора Пробрасывание SAMBA на внутренний узел (как много портов нужно Windows) # iptables -t nat -I PREROUTING -p tcp --dport 135 -i ${WAN} -j DNAT --to 192.168.0.2 # iptables -t nat -I PREROUTING -p tcp --dport 139 -i ${WAN} -j DNAT --to 192.168.0.2 # iptables -t nat -I PREROUTING -p tcp --dport 445 -i ${WAN} -j DNAT --to 192.168.0.2 # iptables -t nat -I PREROUTING -p udp --dport 137:138 -i ${WAN} -j DNAT --to 192.168.0.2 # iptables -t nat -I PREROUTING -p udp --dport 445 -i ${WAN} -j DNAT --to 192.168.0.2Проброс трафика Bittorrent # iptables -t nat -A PREROUTING -p tcp --dport 6881:6889 -i ${WAN} -j DNAT --to 192.168.0.2Проброс трафика eDonkey/eMule # iptables -t nat -A PREROUTING -p tcp --dport 4662 -i ${WAN} -j DNAT --to 192.168.0.55Поддержка Game Cube Warp Pipe # iptables -t nat -A PREROUTING -p udp --dport 4000 -i ${WAN} -j DNAT --to 192.168.0.56Поддержка Playstation 2 Online # iptables -t nat -A PREROUTING -p tcp --dport 10070:10080 -i ${WAN} -j DNAT --to 192.168.0.11 # iptables -t nat -A PREROUTING -p udp --dport 10070:10080 -i ${WAN} -j DNAT --to 192.168.0.11Xbox Live # iptables -t nat -A PREROUTING -p tcp --dport 3074 -i ${WAN} -j DNAT --to 192.168.0.69 # iptables -t nat -A PREROUTING -p udp --dport 3074 -i ${WAN} -j DNAT --to 192.168.0.69 # iptables -t nat -A PREROUTING -p udp --dport 88 -i ${WAN} -j DNAT --to 192.168.0.69
Ретранслируемые интернет-чаты (Internet Relay Chat, IRC) усиленно используют
сервис ident. Теперь, когда IRC-клиенты находятся за маршрутизатором, нам
нужен способ настроить свой ident для маршрутизатора и клиентов. Подобный
сервер называется
# emerge midentd # rc-update add midentd default # /etc/init.d/midentd start
В портеже есть и другие серверы ident. В зависимости от ваших нужд, рекомендую
попробовать
Сохранять системное время точным является неотъемлемой частью сопровождения хорошей системы. Одним из самых распространенных способов сделать это являются протокол сетевого времени (Network Time Protocol, NTP) и пакет ntp (содержащий реализации как сервера, так и клиента).
Многие запускают клиенты NTP на своих компьютерах. Очевидно, что множество
клиентов по всему миру сильно загружают серверы NTP, обращаясь к ним. В
условиях домашней сети мы можем помочь снизить нагрузку общедоступных
серверов, предоставляя в свою очередь время нашим компьютерам. А в качестве
бонуса обновление в локальной сети будет происходить намного быстрее! Все, что
нам нужно, — запустить 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
Теперь на клиентах также наберите
# 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
Вы сможете уберечь тех, кто использует машины с ОС Gentoo в локальной сети,
от синхронизации каждой машины посредством
Хотя каждый компьютер с установленной ОС Gentoo нуждается в rsync, нет
необходимости устанавливать его на всех клиентах. Отредактируйте
pid file = /var/run/rsyncd.pid use chroot = yes read only = yes address = 192.168.0.1 [gentoo-portage] path = /mnt/space/portage comment = Gentoo Linux Portage tree exclude = /distfiles /packages
Теперь вам необходимо стартовать сервис (и снова, настройки по умолчанию подойдут).
# /etc/init.d/rsyncd start # rc-update add rsyncd default
Все, что остается вам, — сообщить вашим клиентам синхронизироваться с маршрутизатором.
SYNC="rsync://192.168.0.1/gentoo-portage"
Когда-нибудь будет неплохо запустить на маршрутизаторе собственный сервер SMTP (Simple Mail Transfer Protocol — простой протокол передачи почты). У вас могут быть есть свои причины сделать это, но я запускаю его для того, чтобы пользователи видели, как их почта быстро уходит, а вся работа по получении/маршрутизации перекладывалась на почтовый сервер. К тому же некоторые провайдеры не разрешают трансляцию почты для учетных записей, не являющихся частью их собственных сетей (например Verizon). Также, вы можете просто регулировать доставку почты, и большие вложения не будут постоянно забивать ваш канал на полчаса.
# emerge netqmailудостоверьтесь, что вывод `hostname` верный # emerge --config netqmail # iptables -I INPUT -p tcp --dport smtp -i ! ${LAN} -j REJECT # ln -s /var/qmail/supervise/qmail-send /service/qmail-send # ln -s /var/qmail/supervise/qmail-smtpd /service/qmail-smtpd # cd /etc/tcprules.d # nano tcp.qmail-smtpДобавьте строку, подобную этой, в раздел разрешений: 192.168.0.:allow,RELAYCLIENT="" # make # rc-update add svscan default # /etc/init.d/svscan start
Я прожженный фанат qmail, но вы вольны использовать другой MTA :). Как только
вы настроите электронную почту для узлов вашей сети, сообщите им, что теперь их
почтовый сервер имеет адрес 192.168.0.1 и теперь все будет по первому разряду.
Вы можете посетить
Ранее мы использовали dnsmasq для предоставления сервиса DHCP всем нашим
клиентам. Для большинства людей, работающих в небольших локальных сетях, этого
более чем достаточно. Но вам может понадобиться что-то с более широкими
возможностями. Для этого мы перейдем к полноценному DHCP-серверу,
разработанному людьми из
# emerge 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,
использованного нами ранее. Кстати, не забыли ли вы отключить возможности DHCP
в dnsmasq? Если да, то вы должны сделать это сейчас (просто закомментируйте
настройки
Когда-нибудь вам понадобится подключить к маршрутизатору другую локальную сеть.
Возможно, что вы хотите собрать в отдельную группу своих друзей, или вы
перфекционист и хотите разделить сеть на группы компьютеров, или вы просто на
самом деле заскучали. Как бы то ни было, расширение маршрутизатора еще одной
сетью должно быть довольно простым и понятным. Вы следующих примерах
предположим, что новая сеть подключена к третье сетевой карте с именем
Сначала вам понадобится настроить интерфейс. Просто следуйте инструкциям в
Затем вам понадобиться подправить dnsmasq для обслуживания нового интерфейса.
Просто отредактируйте файл
И наконец, посмотрите правила межсетевого экрана в
Если у вас проблемы в подключении компьютеров к сети, вы можете попробовать
устранить их с помощью следующих утилит (всех их можно найти в портежах в
категории
Утилиты | Описание |
---|---|
При первом старте init.d-сценария dhcp вы можете получить ошибку загрузки без какой-либо полезной информации.
# /etc/init.d/dhcp start * Setting ownership on dhcp.leases ... [ ok ] * Starting dhcpd ... [ !! ]
Все дело в том, что надо знать, куда dhcpd направляет свой вывод. Просто
просмотрите
Если вы сталкиваетесь со странными ошибками (например, не загружаются определенные web-страницы), возможно, у вас проблема Path MTU Discovery. Быстрый способ проверить это — запустить эту команду iptables:
# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Это повлияет на все новые соединения, поэтому для теста просто обновите
страницу, с которой у вас проблемы. Если это поможет, то стандартным значением
MTU для 100 Мбит/с сетей является
Если вы хотите связать два компьютера напрямую между собой (неважно, зачем) без
использования концентратора или коммутатора, то обычный кабель, скорее всего,
не подойдет. Исключение составляет специальный Auto MDI/MDI-X (также известный
как «autosensing») сетевой адаптер. Вам понадобится специальный
перекрестный (crossover) кабель. Более подробная информация о различии разных
типов кабелей может быть найдена на странице
У меня нет послесловия, если не считать того, что если вы испытываете
проблемы с этим руководством, пожалуйста, свяжитесь