четверг, 7 мая 2009 г.

Настройка интернет-шлюза на базе Debian GNU/Linux 5.0

Постановка задачи

Необходимо настроить интернет-шлюз для подключения компьютеров ЛВС предприятия к интернет, включая электронную почту и банковский "почтовик" системы дистанционного обслуживания (Клиент-Банк).

Решение

Этап 1. Настройка кеширующего прокси-сервера

Проблема настройки прокси-сервера SQUID достаточно широко рассмотрена в интернете, поэтому привожу изменения и (или) дополнения к конфигурационному файлу /etc/squid/squid.conf:

# Привилегированный доступ: 192.168.0.1 - 192.168.0.14 (14)
acl priv_access src 192.168.0.0/28
# Непривилегированный доступ: 192.168.0.33 - 192.168.0.62 (30)
acl unpriv_access src 192.168.0.32/27

http_access allow priv_access
http_access allow unpriv_access

icp_access allow priv_access
icp_access allow unpriv_access

# "Прозрачное проксирование"
http_port 3128 transparent

cache_mem 64 MB

cache_dir ufs /var/spool/squid 1024 16 256

# Трафик шейпер
delay_pools 2
delay_class 1 2
delay_class 2 2
delay_access 1 allow priv_access
delay_access 1 deny all
delay_access 2 allow unpriv_access
delay_access 2 deny all
delay_parameters 1 -1/-1 16000/16000    # ~128kbps
delay_parameters 2 -1/-1 8000/8000        # ~64kbps

Этап 2. Настройка фйрвола

Настройка IPTABLES была "подсмотрена" на этом сайте:

#!/bin/sh

# путь к IPTABLES, на всякий случай
IPTABLES="/sbin/iptables"
# описание сетевых интерфейсов: "петля", внешний, внутренний
LO_IF="lo"
EXT_IF="eth1"
INT_IF="eth0"
# IP-адреса шлюза на описанных интерфейсах
LO_IP="127.0.0.1"
INT_IP="192.168.0.2"
EXT_IP="192.168.1.2"
# адрес внутренней сети
INT_NET="192.168.0.0/24"
# описание используемых портов
UNPRIV_PORTS="1024:65535"
DNS_PORT="53"
HTTP_PORT="80"
SQUID_PORT="3128"
SSH_PORT="22"
POP_PORT="110"
SMTP_PORT="25"
# описание внешних адресов, с которыми нужно работать
DNS1_IP="x.x.x.x"
DNS2_IP="x.x.x.x"
BPS_IP="x.x.x.x"
BREST_BY_IP="x.x.x.x"
# устанавливаемое значение TTL
TTL="64"
# расположение файла для включения форвардинга
IP_FORWARD_FILE="/proc/sys/net/ipv4/ip_forward"

# Очистка правил
$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT
$IPTABLES -t nat -F PREROUTING
$IPTABLES -t nat -F POSTROUTING
$IPTABLES -t mangle -F

# Политика по-умолчанию - запрет на всё
$IPTABLES -P FORWARD DROP
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP

# DROP пакетов кроме запросов на соединение
$IPTABLES -A INPUT -p TCP ! --syn -m state --state NEW -j DROP

# DROP запросов на соединение из Интернет
$IPTABLES -A INPUT -d $EXT_IP -p TCP --syn -j DROP

# Разрешение SQUID и SSH в локальной сети
$IPTABLES -A INPUT -s $INT_NET -p TCP -d $INT_IP -m multiport --dport $SSH_PORT,$SQUID_PORT -j ACCEPT

# Разрешение уже установленных входящих подключений на незарезервированные порты
$IPTABLES -A INPUT -d $EXT_IP -p TCP --dport $UNPRIV_PORTS -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешение DNS для SQUID и локальной сети (входящие - только ответы на DNS-запросы)
$IPTABLES -A INPUT -p UDP -s $DNS1_IP -m state --state ESTABLISHED --sport $DNS_PORT -j ACCEPT
$IPTABLES -A INPUT -p TCP -s $DNS1_IP --sport $DNS_PORT --dport $UNPRIV_PORTS -m state --state ESTABLISHED -j ACCEPT

$IPTABLES -A INPUT -p UDP -s $DNS2_IP -m state --state ESTABLISHED --sport $DNS_PORT -j ACCEPT
$IPTABLES -A INPUT -p TCP -s $DNS2_IP --sport $DNS_PORT --dport $UNPRIV_PORTS -m state --state ESTABLISHED -j ACCEPT

$IPTABLES -A FORWARD -p UDP -s $INT_NET -d $DNS1_IP --dport $DNS_PORT -j ACCEPT
$IPTABLES -A FORWARD -p UDP -s $DNS1_IP -d $INT_NET --sport $DNS_PORT -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -p TCP -s $INT_NET -d $DNS1_IP --dport $DNS_PORT -j ACCEPT

$IPTABLES -A FORWARD -p UDP -s $INT_NET -d $DNS2_IP --dport $DNS_PORT -j ACCEPT
$IPTABLES -A FORWARD -p UDP -s $DNS2_IP -d $INT_NET --sport $DNS_PORT -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -p TCP -s $INT_NET -d $DNS2_IP --dport $DNS_PORT -j ACCEPT

# Перенаправление исходящего HTTP-трафика на порт SQUID
$IPTABLES -t nat -A PREROUTING -s $INT_NET -p tcp -m tcp --dport $HTTP_PORT -j REDIRECT --to-ports $SQUID_PORT
$IPTABLES -t nat -A POSTROUTING -s $INT_NET -o $EXT_IF -j SNAT --to-source $EXT_IP

# Разрешение обмена с сервером БПС-Банк (!!!!!)
$IPTABLES -A FORWARD -s $INT_NET -d $BPS_IP -p TCP --dport $UNPRIV_PORTS -j ACCEPT

# Разрешение обмена с почтовым сервером brest.by
$IPTABLES -A FORWARD -s $INT_NET -d $BREST_BY_IP -p TCP --dport $POP_PORT -j ACCEPT
$IPTABLES -A FORWARD -s $INT_NET -d $BREST_BY_IP -p TCP --dport $SMTP_PORT -j ACCEPT

# Разрешение уже установленных соединений для двустороннего обмена
$IPTABLES -A FORWARD -p TCP -m state --state ESTABLISHED,RELATED -m multiport --sport $DNS_PORT,$POP_PORT,$SMTP_PORT,$BPS_PORT -j ACCEPT

# Разрешение внутреннего трафика
$IPTABLES -A INPUT -p ALL -s $LO_IP -i $LO_IF -j ACCEPT
$IPTABLES -A INPUT -p ALL -s $INT_IP -i $LO_IF -j ACCEPT
$IPTABLES -A INPUT -p ALL -s $EXT_IP -i $LO_IF -j ACCEPT

$IPTABLES -A OUTPUT -p ALL -d $LO_IP -o $LO_IF -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $EXT_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INT_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT

# Установка на все исходящие пакеты одного и того же значения TTL (маскировка)
$IPTABLES -t mangle -A PREROUTING -i $EXT_IF -j TTL --ttl-set $TTL

# Включение NAT
$IPTABLES -t nat -A POSTROUTING -o $EXT_IF -j SNAT --to-source $EXT_IP

echo "1" > $IP_FORWARD_FILE

Данный скрипт рекомендуется сохранить в каталоге /etc, например, /etc/fw.sh, выставить права 0711 (rwx-x-x): chmod 0711 /etc/fw.sh , и организовать его автоматический запуск в конце загрузки системы (добавить вызов в скрипт /etc/rc.local)


Заключение

Итак, получился вполне работоспособный интернет-шлюз. Единственное, что хотелось бы сделать, так это настроить почтовый сервер, который мог бы отправлять/получать почту у провайдера. Но об этом позже.