Категорії
Linux

Простенький шлюз с прозрачным прокси-сервером squid

Всё описанное проводилось на gentoo linux 2.6.29.

Внимание!

Перед установкой следует позаботиться о достаточном количестве файловых дескрипторов для пользователя, от которого работает squid, при включённом кешировании.

1) Форвардинг пакетов.

Первым делом резрешим пересылку пакетов между сетевыми картами. Делается это через sysclt:

#sysctl net.ipv4.ip_forward = 1

Что бы после ребута оно не слетало, запишем его в /etc/sysctl.conf

2) Установка и настройка файервола: iptables.

Ставим:

#emerge net-firewall/iptables

После установки, добавляем трансляцию адресов NAT:

#iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
#iptables --append FORWARD --in-interface eth1 -j ACCEPT

где, eth0 – внешний интерфейс, а eth1 – внутренний.

Примечание.

Если вдруг при добавлении правила возникают ошибки, проверьте подгружены ли модули ip_nat, ip_conntrack:

lsmod | grep nat
iptable_nat 11077 1
ip_tables 17029 3 iptable_mangle,iptable_nat,iptable_filter
ip_nat 21101 2 iptable_nat
ip_conntrack 53281 6 xt_connlimit,xt_state,iptable_nat,ip_nat
nfnetlink 10713 2 ip_nat,ip_conntrack
x_tables 17349 12 xt_MARK,ipt_REJECT,xt_connlimit,ipt_ULOG,xt_state,xt_multiport,xt_pkttype,iptable_nat,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables

В случаях когда внешний адрес постоянный и заренне известен, лучше использовать SNAT. MASQUERADE предназначен для интерфейсов с динамическими адресами, поэтому тратит больше ресурсов на отслеживание изменений IP-адреса на интерфейсе. Правила с SNAT выглядят вот так (eth0 имеет внешний адрес 111.111.111.111):

#iptables --table nat --append POSTROUTING --out-interface eth0 -j SNAT --to 111.111.111.111
#iptables --append FORWARD --in-interface eth1 -j ACCEPT

3) Установка и настройка squid’a.

#emerge squid

После установки, переходим к настройке. Конфиг можно взять отсюда. Добавим правило заворота на прокси-сервер в файерволе:

iptables -t nat -A PREROUTING -s 10.10.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128

где 10.10.10.0/24 – внутрення подсеть.

Проброс порта во внутреннюю сеть:

#iptables -t nat -A PREROUTING -p tcp -d XX.XX.XX.XX --dport 10000 -j DNAT --to-destination 10.10.10.100:80

где,

XX.XX.XX.XX – внешний IP шлюза,

–dport – порт к которому будут подключаться извне

–to-destination – IP и порт машины в локалке, на которую пробрасывается порт.

Вот небольшая выдержка из сайта habrahabr.ru насчёт использования REDIRECT вместо DNAT

Технически REDIRECT является подвидом DNAT, с той лишь разницей, что адрес назначения (destination) переписывается на primary-адрес интерфейса, с которого получен пакет (вот так это реализовано для IPv4 и для IPv6). Локальные же пакеты будут перенаправляться на порт на адресе 127.0.0.1. Отсюда следует одна неочевидная особенность — если вы перенаправляете пакеты на какой-то порт, но ваше приложение не слушает порт на интерфейсе, на который пришёл пакет, то ничего не заработает — счётчики на правиле будут увеличиваться, но в ответ клиенту будут улетать tcp-reset’ы или icmp-port-unreachable (если там UDP). Точно так же, например, не получится перенаправлять входящие извне пакеты приложению, которое слушает только 127.0.0.1. Если же на интерфейсе нет адреса вообще (например, если вы используете unnumbered-интерфейс), то пакеты будут отброшены. И так как это завязано на коннтраке, то не забывайте очищать таблицу коннтрака после изменения правил; а так же учтите, что под это правило попадают только пакеты соединений с состоянием NEW, то есть только первый пакет соединения, которого ещё нет в таблице коннтрака. Отловить же эти пакеты в других цепочках можно через конструкцию “-m conntrack –ctstate DNAT”. Вот как-то так.

4) Просмотр состояний.

– посмотреть список правил

#iptables -L [chain]

Так де можно использовать команду

#iptables -S [chain]

Разница лишь в том, что первая вторая выводит их в формате iptables-save.
Для просмотра правил NAT трансляции можно воспользоваться такой командой:

#iptables -L -t nat

Посмотреть текущие NAT-сессии можно так:

#netstat -M - если у вас настроен МАСКАРАДИНГ
#netstat-nat - если у вас NAT

Последняя утилита ставиться отдельно.

5) Пример файла с правилами.

#!/bin/sh
IPT="/sbin/iptables"

# Reset Default Policies
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT

# Flush all rules
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

# Erase all non-default chains
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

iptables --table nat --append POSTROUTING --out-interface eth0 -j SNAT 111.111.111.111
iptables --append FORWARD --in-interface eth1 -j ACCEPT

Оригинал статьи здесь.

Опубликовано с разрешения редакции журнала RootUA и газеты FOSS News

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff