Ubuntu NAT + DHCP + Squid Прозрачный Кэширующий Прокси-Сервер

Дата публикации: 18-11-2011 | Автор: MelfisFettel | Рубрика: Ubuntu Server

В этой статье поднимем сервер позволяющий использовать общий доступ в интернет для сети организации. Для этого я буду использовать Ubuntu Server 10.04. Преимущества маршрутизатора на Linux очевидны. Это низкие требования к железу и бесплатность программного обеспечения. В данном случае я рассмотрю настройку прозрачной маршрутизации с использованием одного сетевого интерфейса на маршрутизаторе (так же приведу листинги для двух интерфейсов). Для достижения наших целей я использую iptables, dnsmasq и Прокси-Сервер SQUID.

Начальная настройка

Для начала введем в консоль команду1 Ifconfig

Из ответа сервера видно, что у меня есть только один сетевой интерфейс eth0. Он подключен к общему свитчу и имеет адрес 192.168.138.10.

Для того что бы настроить сетевые интерфейсы отредактируйте файл /etc/network/interfaces1 nano /etc/network/interfaces

где:

address – адрес вашего сетевого интерфейса (У меня это 192.168.138.10)
netmask – маска сети (У меня 255.255.255.0)
network – адрес сети (Мой 192.168.138.0)
broadcast – броадкаст адрес сети (У меня 192.168.138.255)
gateway – шлюз через который этот компьютер выходит в интернет (Мой 192.168.138.140)
dns -nameservers – адрес DNS сервера (Для моего сервера это 192.168.138.140)

То есть для моей сети я использую шлюз 192.168.138.140 с DNS сервером 192.168.138.140, и мой сервер доступен в локальной сети по адресу 192.168.138.10.
Так же загляните в /etc/resolv.conf и укажите там ваши DNS сервера. (DNS провайдера или шлюза интернет.)1 nameserver 192.168.138.140

Моя сеть выглядит следующим образом:

То есть мой сервер на данный момент имеет доступ в интернет. Теперь раздадим его для компьютеров в локальной сети.

Перед установкой какого либо программного обеспечения я советую выполнять1
2 sudo apt-get update
sudo apt-get upgrade

Что бы обновить списки пакетов и сами пакеты.

Настройка NAT

Для начала нужно создать сам файл с настройками NAT. (Вместо username вставьте имя пользователя в каталоге которого будет хранится файл с настройками iptables. В принципе расположение файла не имеет значения. Если хотите, можете его расположить в любой директории вашего сервера.)1
2 sudo touch /home/username/transparent_nat
sudo nano /home/username/ transparent_nat

Запишем в него следующие инструкции:1
2
3
4
5
6
7
8
9
10 #!/bin/sh
# При использовании одного сетевого интерфейса eth0 для доступа в локальную сеть и интернет.
# Включаем пересылку пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward
# Разрешим проход трафика на loopback-интерфейсе
iptables -A INPUT -i lo -j ACCEPT
# Разрешаем доступ из внутренней сети наружу
iptables -A FORWARD -i eth0 -o eth0 -j ACCEPT
# Включаем NAT. Замените 192.168.138.0 на адрес своей сети
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.138.0/24 -j MASQUERADE

Или вариант для настройки, если используется несколько сетевых карт. В этом листинге предполагается что интерфейс eth0 смотрит в сеть интернет, а eth1 в локальную сеть.1
2
3
4
5
6
7
8
9
10
11
12 #!/bin/sh
# При использовании нескольких сетевых интерфейсов. eth0 – интернет, eth1 — локальная сеть.
# Включаем пересылку пакетов.
echo 1 > /proc/sys/net/ipv4/ip_forward
# Разрешим проход трафика на loopback-интерфейсе.
iptables -A INPUT -i lo -j ACCEPT
# Разрешаем доступ из внутренней сети наружу.
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
# Включаем NAT. Замените 192.168.138.0 на адрес своей сети.
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.138.0/24 -j MASQUERADE
# Запретим доступ из внешней сети во внутреннюю.
iptables -A FORWARD -i eth0 -o eth0 -j REJECT

Так как настройки iptables не сохраняются после перезагрузки системы, сделаем наш скрипт исполняемым:1 sudo chmod +x /home/username/transparent_nat

И добавим его в конец файла /etc/network/interfaces добавив туда вот такую инструкцию:1 post-up /home/username/transparent_nat

то есть Ваш /etc/network/interfaces теперь будет выглядеть вот так:

Перезапускаем сеть:1 sudo /etc/init.d/networking restart

Для того что бы не менять каждый раз имена DNS серверов на клиентских компьютерах, установим на наш сервер простой DNS: Dnsmasq.

Установка Dnsmasq

Для установки пакета выполним команду:1 sudo apt-get install dnsmasq

Теперь нужно что бы наш DNS принимал DNS запросы из внутренней сети предприятия. Для этого откроем /etc/dnsmasq.conf. Найдем в нем строку 1 #listen-address=

И заменим ее на:1 listen-address=127.0.0.1, 192.168.138.10 #Указав адрес интерфейса смотрящего в локальную сеть.

Сохраняем изменения и перезапускаем наш DNS:1 sudo /etc/init.d/dnsmasq restart

Для того что бы у пользователей появился интернет достаточно в настройках их подключения к локальной сети указать Шлюз: IP — адрес вашего сервера, DNS — адрес вашего сервера. Но ходить на каждый компьютер не удобно, по этому настроим DHCP сервер для автоматической раздачи настроек Вашей локальной сети.

Настраиваем DHCP

На самом деле мы уже установили DHCP сервер в составе пакета dnsmasq. Теперь его осталось только настроить. Снова открываем /etc/dnsmasq.conf, и находим там строку1 # dhcp-range=192.168.0.50,192.168.0.150,12h

Заменим эту строку вот такой (Укажем диапазон раздаваемых адресов от 192.168.138.11 до 192.168.138.100. Маска подсети 255.255.255.0. Для Вашей сети установите свой диапазон адресов.)1 dhcp-range=192.168.138.11,192.168.138.100,255.255.255.0,12h

Адреса DNS сервера и шлюза будут подставлены автоматически из системных настроек вашего сервера. Перезапустим dnsmasq:1 sudo /etc/init.d/dnsmasq restart

Теперь Ваш сервер не только раздает интернет для локальной сети, но и раздает IP адреса и настройки сети, теперь достаточно подключить новую машину в сеть и она будет иметь доступ в интернет без настроек вручную.

Кэширующий прокси-сервер Squid

Теперь установим прокси-сервер SQUID. Для чего это нужно? SQUID — это кэширующий прокси сервер, он позволит снизить долю потребляемого трафика для клиентов Вашей локальной сети. Мы не будем создавать ограничения для пользователей или запрещать кому-либо доступ.

Установим сам SQUID командой:1 sudo apt-get install squid

и тут же его остановим 1 sudo /etc/init.d/squid stop

Для настройки SQUID отредактируем его конфигурационный файл /etc/squid/squid.conf

Найдите строку 1 #http_port 3128

И измените ее на: 1 http_port 3128 transparent

теперь ищем строку1 # cache_dir ufs /var/spool/squid 100 16 256

И меняем ее на:1 cache_dir ufs /var/spool/squid 4096 32 256

теперь укажем список внутренних сетей для нашего прокси. Ищем вот такие строки:1
2
3 acl localnet src 10.0.0.0/24 # 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

Так как тут нет нашей сети, мы можем создать новую строку, либо раскоментировать и изменить уже существующую. Для начала закомментируем уже существующие строки поставив знак # перед ними. Теперь создадим вот такую строку (Для Вашей сети адрес может отличаться):1 acl localnet src 192.168.138.0/24

Теперь нужно разрешить доступ к прокси SQUID из нашей локальной сети. Найдите строку и раскоментируйте или допишите в случае ее отсутствия:1 http_access allow localnet

Заодно чуть ниже проверьте, что бы строка http_access deny all была закоментирована. Иначе может случится так что вообще никто не будет иметь доступа к Вашему SQUID.

Снимем комментарии со строк:1
2 memory_pools on
memory_pools_limit 50 MB

Эти строки определяют лимит использования памяти сервером SQUID.

Зададим язык для вывода ошибок пользователям. Найдите строку: 1 error_directory /usr/share/squid/errors/en

раскоментируйте ее или замените на1 error_directory /usr/share/squid/errors/ru

Сохраняем конфигурационный файл и выходим из редактора. Теперь нужно построить кэш для SQUID сервера. Введите команду:1 sudo /usr/sbin/squid –z

В ответ Вы должны получить вот такой вывод:

Теперь запустим наш прокси-сервер SQUID:1 sudo /etc/init.d/squid start

Теперь прописав в настройках соединения браузера на пользовательской машине адрес вашего прокси-сервера SQUID и порт 3128 вы должны получить доступ в интернет. Но это опять же неудобно так как снова придется ходить от компьютера к компьютеру и прописывать адрес прокси-сервера вручную. Эту проблему можно решить так же при помощи iptables. Все что нужно сделать это “завернуть” порты 80 и 8080 на порт вашего прокси SQUID 3128. Для этого допишем в наш файл /home/username/transparent_nat который мы создали в начале статьи вот такую конструкцию:1
2 #Заворачиваем порты 80 и 8080 на порт SQUID 3128
iptables -t nat -A PREROUTING -i eth0 -d ! 192.168.138.0/24 -p tcp -m multiport —dport 80,8080 -j DNAT —to 192.168.138.10:3128

Теперь Ваш сервер готов.

Примечание! Для того что бы посмотреть список адресов выданных Ваши DHCP сервером можно использовать команду: 1 cat /var/log/syslog | grep DHCPOFFER

Анализаторы логов Вашего SQUID сервера вы можете найти и скачать по адресу http://www.squid-cache.org/Scripts/.http://melfis.ru/ubuntu-nat-dhcp-squid-прозрачный-кэширующий-прокси-се/