Статьи

Как я настраивал прозрачный прокси в Linux Ubuntu Server. Часть 1

Для упрощения доступа в интернет из локальной сети решил всё-таки взять и настроить прозрачный прокси, т.к. очень долго собирался это сделать и давно хотел сделать так, чтобы в локальной сети не заботиться о настройках параметров прокси-сервера. Linux Ubuntu Server уже был установлен и настроен в качестве LAMP (Linux Apache MySQL PHP), о чем я ранее писал в шпаргалке, а так же еще в нескольких статьях о Linux

Итак, исходные данные: ОС: Linux Ubuntu Server 10.04

eth0 - сетевая карта, подключенная к маршрутизатору (интернет)

iface eth0 inet static
        address 192.168.3.102
        netmask 255.255.255.0
        network 192.168.3.0
        broadcast 192.168.3.255
        gateway 192.168.3.253

eth1 - сетевая карта, подключенна к локальной сети

iface eth1 inet static
        address 192.168.5.104
        netmask 255.255.255.0
        network 192.168.5.0
        broadcast 192.168.5.255

Здесь я не буду описывать настройки сети. Частично о командах, помогающих настроить сеть, можно почитать в статье Настройка Linux Ubuntu Server

И еще один момент. Все настройки я буду выполнять под учетной записью root, поэтому команду sudo не пишу.

Настройка DNS

Не буду описывать для чего нужен DNS и что это такое, об этом можно почитать много где. Ясно одно, без этих настроек интернет не работал. Указание DNS серверов в настройке сетевой карты не помогло. Итак, в файле /etc/resolv.conf пишем адреса наших DNS-серверов. Открываем на редактирование этот конфиг:

nano /etc/resolv.conf

И пишем в него данные нашего провайдера:

nameserver 81.26.129.5
nameserver 81.26.132.6

Перезапускаем сеть и пробуем ping с самого Linux сервера на какой-нибудь узел

/etc/init.d/networking restart

root@serv-web:/home/alex# ping ya.ru
PING ya.ru (87.250.251.3) 56(84) bytes of data.
64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=1 ttl=57 time=86.6 ms
64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=2 ttl=57 time=85.0 ms
64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=3 ttl=57 time=86.8 ms

Отлично, сам сервер интернет видит.

Настройка NAT

Опять же. Что такое NAT и для чего он нужен можно почитать тут.

От себя скажу своими словами, что NAT позволяет сетевым программам в локальной сети работать как будто они работают в интернет напрямую, а не через какой-то маршрутизатор или другой компьютер. Например, почтовая программа забирает почту по протоколу POP используя порт 110. Если NAT не настроен, то почтовая программа не сможет даже соединиться с сервером почты, если NAT работает, то порт 110 просто “пробрасывается” от компьютера в локальной сети через шлюз (маршрутизатор, на котором работает NAT) к почтовому серверу.

Для настройки NAT использую iptables, поэтому надо будет предусмотреть настройки NAT из скрипта и организацию автозапуска этого скрипта после перезагрузки системы.

Создаю файл-скрипт:

touch /etc/nat

И в этот файл пишу вот такое содержимое:

#!/bin/sh

# Включаем форвардинг пакетов
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
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.5.0/24 -j MASQUERADE
# Разрешаем ответы из внешней сети
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT 
# Запрещаем доступ снаружи во внутреннюю сеть
iptables -A FORWARD -i eth0 -o eth1 -j REJECT

После сохранения файла /etc/nat помещаю его в автоматическую загрузку. Для этого в конце файла /etc/network/interfaces дописываю строчку:

post-up /etc/nat

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

sudo chmod +x /etc/nat

Подробнее о правах доступа в Linux написано в этой статье

Теперь можно перезапустить сеть командой /etc/init.d/networking restart и на компьютере в локальной сети установить в настройке сети адрес шлюза по умолчанию равным адресу нашего Linux сервера. У меня это адрес 192.168.5.104 Но интернет еще не работает, т.к. остался не настроен DNS. То есть с компьютера локальной сети уже можно пинговать и заходить на сайты по IP адресу, а не по имени.

Настройка кэширующего DNS

Устанавливаем кэширующий DNS сервер Dnsmasq:

apt-get install dnsmasq

После установки открываем конфиг /etc/dnsmasq.conf на редактирование, ищем и раскомментируем параметр listen-address. В моем случае он выглядит так:

listen-address=127.0.0.1, 192.168.5.104

Как он выглядел до редактирования я уже не помню, но обязательно нужно указать адрес интерфейса локальной сети (у меня 192.168.5.104). Перезапускаем Dnsmasq:

/etc/init.d/dnsmasq restart

После этого на компьютерах в локальной сети работает интернет без указания прокси.

На этом пока всё. В следующей статье опишу как я “завернул” интернет на прокси Squid