Nat прокси

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

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

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

1
Ifconfig
Ifconfig

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

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

1

nano

 

/

etc

/

network

/

interfaces
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
nameserver 192.168.138.140

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


настройка SQUID

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

Перед установкой какого либо программного обеспечения я советую выполнять

1
2

sudo

apt-get

update

sudo

apt-get

upgrade
sudo apt-get update

sudo apt-get upgrade

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

Настройка NAT

Настройка NAT Ubuntu Linux

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

1
2

sudo

touch

/

home

/

username

/

transparent_nat

sudo

nano

/

home

/

username

/

transparent_nat
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
#!/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
#!/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
sudo chmod +x /home/username/transparent_nat

И добавим его в конец файла /etc/network/interfaces добавив туда вот такую инструкцию:

1
post-up 

/

home

/

username

/

transparent_nat
post-up /home/username/transparent_nat

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

Перезапускаем сеть:

1

sudo

/

etc

/

init.d

/

networking restart
sudo /etc/init.d/networking restart

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

Установка Dnsmasq

Для установки пакета выполним команду:

1

sudo

apt-get

install

dnsmasq
sudo apt-get install dnsmasq

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

1

#listen-address=

#listen-address=

И заменим ее на:

1
listen-address=127.0.0.1, 192.168.138.10 

#Указав адрес интерфейса смотрящего в локальную сеть.

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

Сохраняем изменения и перезапускаем наш DNS:

1

sudo

/

etc

/

init.d

/

dnsmasq restart
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

# 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
dhcp-range=192.168.138.11,192.168.138.100,255.255.255.0,12h

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

1

sudo

/

etc

/

init.d

/

dnsmasq restart
sudo /etc/init.d/dnsmasq restart

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

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

Установка SQUID на Ubuntu 10.04

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

Установим сам SQUID командой:

1

sudo

apt-get

install

squid
sudo apt-get install squid

и тут же его остановим

1

sudo

/

etc

/

init.d

/

squid stop
sudo /etc/init.d/squid stop

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

Найдите строку

1

#http_port 3128

#http_port 3128 

И измените ее на:

1
http_port 

3128

transparent
http_port 3128 transparent

теперь ищем строку

1

# cache_dir ufs /var/spool/squid 100 16 256

# cache_dir ufs /var/spool/squid 100 16 256

И меняем ее на:

1
cache_dir ufs 

/

var

/

spool

/

squid

4096

32

256

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

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

acl localnet src 192.168.138.0/24

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

1
http_access allow localnet
http_access allow localnet

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

Снимем комментарии со строк:

1
2
memory_pools on
memory_pools_limit 

50

MB
memory_pools on

memory_pools_limit 50 MB

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

Зададим язык для вывода ошибок пользователям. Найдите строку:

1
error_directory 

/

usr

/

share

/

squid

/

errors

/

en
error_directory /usr/share/squid/errors/en

раскоментируйте ее или замените на

1
error_directory 

/

usr

/

share

/

squid

/

errors

/

ru
error_directory /usr/share/squid/errors/ru

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

1

sudo

/

usr

/

sbin

/

squid –z
sudo /usr/sbin/squid –z

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

Теперь запустим наш прокси-сервер SQUID:

1

sudo

/

etc

/

init.d

/

squid start
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

#Заворачиваем порты 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
cat /var/log/syslog | grep DHCPOFFER

Анализаторы логов Вашего SQUID сервера вы можете найти и скачать по адресу .

Чем более человек интеллектуален, тем больше у него в волосах меди и цинка.