Internet Gateway on Ubuntu Server (chapter one — base, dns, nat, squid, dhcp)
Сегодня займемся созданием шлюза на базе Ubuntu Server. Перед аналогичными решениями на базе Microsoft этот вариант имеет большую производительность, гибкость, безопасность и устойчивость. Перед интегрированными в железо решениями (кроме cisco) вариант имеет преимущество в производительности и опять же — гибкость. Перед специализированными решениями вроде SmoothWall или FRESCO вариант с Ubuntu Server имеет большую универсальность за счет полного ядра и всех новых библиотек, хотя вероятно меньшую надежность и производительность.
На момент написания статьи, последним стабильным релизом Ubuntu Server был Jaunty. Karmic, который еще на стадии преальфы, рассматривать пока что рано. Железо для шлюза есть следующее:
- Процессор Pentium III 933 Mhz, ядро Coppermine;
- 256 мегабайт оперативной памяти;
- Материнская плата от Intel, старая, но рабочая;
- 40 гигабайт НЖМД;
- 2 сетевых адаптера (Base100)
Было желание раз и навсегда защитить шлюз от компьютеров локальной сети, снизить потребление электричества, получить стабильную систему, которую можно не трогать годами. Также был свободный денек и желание получить опыт.
Да-да, именно свободный денек. У читателей статьи весь процесс займет около получаса, вместе с установкой системы. У меня же не было подробного пошагового руководства, потому целый день собирал по крупицам сведения.
От читателя требуются такие же желания, базовые знания сетей и сетевых технологий, более или менее прямые руки, умение думать.
Также рекомендую не забывать делать резервные копии всех файлов, которые мы будем изменять.
cp path_to_file path_to_file-backup
К этой комманде можно прибавить лишь sudo, в том случае, если редактируется файлы, которые принадлежат пользователю root.
0. диск\образ
Ubuntu Server можно получить несколькими способами: скачать, купить или заказать бесплатно. У меня безлимитный интернет, и я выбираю первый способ.
Скачать можно тоже несколькими способами и первый из них — привычное скачивание с http\ftp сервера:
32bit ftp://ftp.corbina.net/pub/Linux/ubuntu-cd/jaunty/ubuntu-9.04-server-i386.iso
64bit ftp://ftp.corbina.net/pub/Linux/ubuntu-cd/jaunty/ubuntu-9.04-server-amd64.iso
Еще быстрее можно загрузить образ диска использую технологию BitTorrent:
32bit ftp://ftp.corbina.net/pub/Linux/ubuntu-cd/jaunty/ubuntu-9.04-server-i386.iso.torrent
64bit ftp://ftp.corbina.net/pub/Linux/ubuntu-cd/jaunty/ubuntu-9.04-server-amd64.iso.torrent
Загрузка с торрентов имеет преимуществ как для Вас, так и для Canonical. Для Вас основное преимущество заключается в скорости. Так как каналы интернет Сanonical и партнеров зеркальщиков не резиновые, то в часы пик скорость заметно снижается. Также, используя торренты, вы позволяете Canonical экономить деньги на сервера, зеркала и каналы. Лучше пускай эти деньги уйдут на спонсирование новых разработок.
После загрузки образа, запишите его на компакт диск.
Загрузив и записав, купив или получив Ubuntu Server, можно приступать к установке.
1. Установка
В целом, установка сервера не вызовет никаких проблем даже у начинающих пользователей. Даже разметка диска происходит в автоматическом режиме, хотя по желанию все можно сделать руками.
На последних шагах установщик попросит отметить галками предусмотренные наборы пакетов (у Microsoft это называется ролями). Выбираем только OpenSSH. Остальное мы сделаем ручками.
По окончании установки перезагрузите компьютер. Переходим ко второму пункту.
2. настраиваем сетевые карты
Установщик в процессе инсталяции предложит настроить только одну сетевую карту. Вторую и остальные нужно настраивать отдельно. Для этого нужно лишь отредактировать файл /etc/network/interfaces:
sudo nano /etc/network/interfaces
После редактирования файл должен иметь примерно такой вид:
# The loopback network interface
auto lo
iface lo inet loopback# LAN
auto eth0
iface eth0 inet static
address 172.16.0.254
netmask 255.255.255.0# ISP Network
auto eth1
iface eth1 inet dhcp
eth0 у меня смотрит в локальную сеть, а eth1 подключена к интернет провайдеру. Перезапускаем сеть:
sudo /etc/init.d/networking restart
Проверяем:
ping ya.ru
3. Удаленное администрирование.
В серверной, как обычно, кондиционер дует в полную — холодно. Теперь, когда сеть настроена, можно пересаживаться за ноутбук или рабочую машину в более теплом месте и настраивать сервер удаленно. Для этого на удаленной машине набираем:
ssh 172.16.0.254
4. Обновления.
После установки рекомендуется получить актуальные версии всех пакетов:
sudo apt-get update
sudo apt-get upgrade
5. Настраиваем DNS.
Теперь начнем настраивать собственно серверное программное обеспечение. Первым из списка будет DNS сервер. Инсталлируем:
sudo apt-get install bind9
После инсталляции останавливаем, так как будем редактировать его конфигурацию:
sudo /etc/init.d/bind9 stop
Создаем и редактируем локальную зону локальной сети:
sudo touch /etc/bind/maxlan.conf
sudo nano /etc/bind/maxlan.conf
Содержимое:
zone «max.»{
type master;
file «/etc/bind/db.max»;
};
Далее описываем зону:
sudo touch /etc/bind/db.max
sudo nano /etc/bind/db.max
Содержимое:
$TTL 86400 ; 1 day
@ IN SOA server root.server (
2009032601 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
@ IN NS serverserver A 172.16.0.1 ; адрес сервера в сети
Обратная зона:
sudo touch /etc/bind/local.rev
sudo nano /etc/bind/local.rev
Содержимое:
$TTL 604800
@ IN SOA server.max. root.server.max. (
2009032601 ; serial
604800 ; refresh
86400 ; retry
2419200 ; expire
604800 ; negative cache TTL
)
@ IN NS server.max.
1.0.16 IN PTR server.max.
Далее:
sudo nano /etc/bind/named.conf.options
Содержимое:
options {
directory «/var/cache/bind»;version «Version»;
allow-recursion {«net»;};
allow-query {any;};
listen-on-v6 {none;};
};
Далее:
sudo nano /etc/bind/named.conf
Добавляем в начало:
acl «net» {
172.16.0.0/24;
127.0.0.1;
};
и в конец:
zone «172.in-addr.arpa» {
type master;
file «/etc/bind/local.rev»;
};
и последней командой:
include «/etc/bind/maxlan.conf»;
Дописываем домен поиска:
sudo nano /etc/resolv.conf
И добавляем в начало:
search server.max
nameserver 127.0.0.1
Указываем как резолвить самого себя:
sudo nano /etc/hosts
после «127.0.0.1 localhost» вписываем:
172.16.0.254 server.max server
Запускаем:
sudo /etc/init.d/bind9 start
Если не запустился — проверяем cat /var/log/syslog и исправляем ошибки.
Теперь на компьютере из локальной сети пробуем:
nslookup -172.16.0.254
ya.ru
Должно отдать Ip-адрес яндекса.
6. Настройка proxy.
Даже при широкополосном канале в сеть Интернет, более половины трафика от браузера повторяется от пользователя к пользователю. Частично с этим борется кеш самого браузера, но гораздо эффективнее и централизовано с этим справится серверный кеширующий прокси сервер. Также при помощи прокси сервера можно управлять доступом пользователей к определенным ресурсам, управлять скоростью, резать рекламные банеры и еще много чего. Сейчас мы сделаем лишь базовую настройку прокси. В качестве программы прокси сервера будем использовать Squid. На момент написания статьи в репозиториях Ubuntu лежала третья версия этого старейшего и лучшего прокси.
Устанавливаем, останавливаем:
sudo apt-get install squid
sudo /etc/init.d/squid stop
Открываем конфиг для редактирования:
sudo nano /etc/squid/squid.conf
ищем директиву http_port и переписываем:
http_port 3128 transparent
меняем:
cache_dir ufs /var/spool/squid 4096 32 256
ищем и коментируем строки:
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
и добавляем ниже:
acl localnet src 172.16.0.0/24 # ournet
ищем и раскомментируем строку
#http_access allow localnet
раскомментируем строку и даем 15 мегабайт
memory_pools_limit 5 MB
Задаем язык вывода ошибок для пользователя
error_directory /usr/share/squid/errors/Russian-koi8-r
Теперь строим кеш:
sudo /usr/sbin/squid -z
и запускаем
sudo /etc/init.d/squid start
7. настраиваем NAT
NAT — это механизм в сетях TCP/IP, позволяющий преобразовывать IP-адреса транзитных пакетов. Суть механизма состоит в замене адреса источника (source) при прохождении пакета в одну сторону и обратной замене адреса назначения (destination) в ответном пакете. Наряду с адресами source/destination могут также заменяться номера портов source/destination.
Так как я не нашел механизма в Linux, который сохранял бы все настройки iptables при перезагрузке сервера или сети, то его настройку вынесем в отдельный файл скрипт, который будет запускатся при активировании сети.
Создаем этот скрипт и открываем для редактирования:
sudo touch /etc/nat-up
sudo nano /etc/nat-up
Далее содержимое, с моими комментариями:
#!/bin/sh
# очищаем все настройки
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT#активируем форвардинг пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward# Всегда принимаем трафик на loopback-интерфейсе
iptables -A INPUT -i lo -j ACCEPT
# Разрешаем соединения, которые инициированы внутри (eth0)
iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state —state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state —state ESTABLISHED,RELATED -j ACCEPT
# Разрешаем доступ из LAN-сети к внешнему миру
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# Запрещаем форвардинг из внешнего мира во внутреннюю сеть
iptables -A FORWARD -i eth1 -o eth1 -j REJECT# заворачиваем пакеты на 80 и 8080 порты на прокси. У кого нет — строчку удаляем.
iptables -t nat -A PREROUTING -i eth0 -d ! 172.16.0.0/24 -p tcp -m multiport —dport 80,8080 -j DNAT —to 172.16.0.254:3128
Теперь нам нужно, чтобы данный скрипт запускался при старте сети. Редактируем:
sudo nano /etc/network/interfaces
и в конец дописываем
post-up /etc/nat-up
Проверяем:
sudo /etc/init.d/networking restart
В локальной сети должен заработать Интернет.
8. DHCP
DHCP (англ. Dynamic Host Configuration Protocol — протокол динамической конфигурации узла) — это сетевой протокол, позволяющий компьютерам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP.
Устанавливаем и останавливаем:
sudo apt-get install dhcp3-server
sudo /etc/init.d/dhcp3-server start
Редактируем конфиг:
sudo nano /etc/default/dhcp3-server
Находим и заменяем на eth0 (интерфейс локальной сети):
INTERFACES=»eth0″
Открываем:
sudo nano /etc/dhcp3/dhcpd.conf
Теперь находим следующие директивы и редактируем. Тех, которых нет — создаем:
default-lease-time 600;
max-lease-time 7200;option subnet-mask 255.255.255.0;
option broadcast-address 172.16.0.255;
option routers 172.16.0.254;
option domain-name-servers 172.16.0.254;
option domain-name «max»;
В том же файле, в конце создаем нашу зону:
subnet 172.16.0.0 netmask 255.255.255.0 {
range 172.16.0.1 172.16.0.252;
}
Если мы хотим, чтобы определенным компьютерам всегда выдавался заданный ip-адрес — дописываем:
host power {
hardware ethernet 00:1F:3C:46:07:56;
fixed-address 172.16.0.13;
}host thebest {
hardware ethernet 00:E0:4D:72:70:68;
fixed-address 172.16.0.1;
}
Запускаем:
sudo /etc/init.d/dhcp3-server
ВСЕ. Теперь наш сервер умеет раздавать «Интернет» в локальную сеть, а также кешировать http трафик. Также умеет преобразовывать интернет имена в ip, раздавать компьютерам локальной сети необходимые для работы настройки.
Это базовая настройка. В дальнейшем мы обязательно прикрутим фильтрацию рекламы, небольшой потоковый антивирус, управление и балансировку канала и трафика (QoS), и может быть что то еще хорошее.
возник вопрос, в строке
# Запрещаем форвардинг из внешнего мира во внутреннюю сеть
iptables -A FORWARD -i eth1 -o eth1 -j REJECT
ошибки нет? оба параметра eth1 ?
Угу, оба параметра eth1
acl «net» {
172.16.0.0/24;
127.0.0.1;
85.90.192.9;
195.234.220.8;
85.90.192.8;
};
Три последних IP-адреса не понятно откуда взялись?
—
Статья не плохая, но местами не хватает хотя бы коротких комментариев к параметрам, что и зачем мы пишем. Просто тактика «ищем» -> «меняем» не приводит к пониманию. Можно конечно полезть в доки, но эт уже если дальше, если понравится 🙂
у меня вопрос по настройке DNS:
что означает строка «server A 172.16.0.1 ; адрес сервера в сети»?
То, что в локальной сети есть еще DNS-сервер? Адрес какого сервера здесь указан?
Если я правильно понимаю, мы поднимаем DNS-сервер на роутере -> здесь нужен IP роутера (172.16.0.254). Или я все-таки чего-то не понимаю? Спасибо.
вот такая ошибка при запуске. это нормально?
epashkov@DC2:/etc$ sudo ./iptables.rules.sh
Bad argument `–state’
Try `iptables -h’ or ‘iptables —help’ for more information.
Bad argument `–state’
Try `iptables -h’ or ‘iptables —help’ for more information.
Bad argument `–state’
Try `iptables -h’ or ‘iptables —help’ for more information.
Using intrapositioned negation (`—option ! this`) is deprecated in favor of extrapositioned (`! —option this`).
Bad argument `–dport’
Try `iptables -h’ or ‘iptables —help’ for more information.
epashkov@DC2:/etc$