На данном этапе в Инет может выходить только сервер, т.е. ресурсы
интернета доступны только ему. Мне же необходимо, чтоб каждый участник
локальной сети имел доступ к внешним ресурсам.
Идеологически было бы правильнее, на мой взгляд, что бы за каждый
внешний сервис отвечала бы локальная служба, которая бы уже в свою
очередь раздавала доступ к этому сервису. Например,
за HTTP и FTP
- прокси-сервер squid/delegate
за SMTP
- почтовый сервер sendmail/postfix/exim
за POP3 и IMAP
- средства доступа к эл. почте imap/cyrus-imap/courier-imap/Qpopper
и т.д.
Но, во-первых, не всегда есть время чтобы осуществить настройку всех
этих программных пакетов, а во-вторых, не всегда можно подобрать
соответствующую службу.
В таких случаях можно воспользоваться маскарадингом, когда все запросы
с локальных машин устремляются на сервер, а он в свою очередь высылает
запросы в другую сеть только уже от своего имени. Затем ответы приходят
на сервер, а он уже знает кому какой ответ предназначался и отсылает их
локальным машинам. Подробнее об этом процессе в документации по
iptables.
Для организации маскарадинга в первую очередь необходимо включит
пересылку пакетов. За это отвечает одна из переменных ядра, доступных
через файловую систему proc - /proc/sys/net/ipv4/ip_forward. Чтоб
включить пересылку в данная переменная должна быть установлена в "1":
$ echo "1" > /proc/sys/net/ipv4/ip_forward
Чтоб выключить - в "0":
$ echo "0" > /proc/sys/net/ipv4/ip_forward
Также можно воспользоваться утилитой sysctl, которая также позволяет
манипулировать параметрами ядра "на лету".
$ /sbin/sysctl -w net.ipv4.ip_forward=1
$ /sbin/sysctl -w net.ipv4.ip_forward=0
Если необходимо, чтоб пересылка включалась автоматически во время
загрузки системы, то можно добавить в файл /etc/sysctl.conf следующие
строчки:
# Enables packet forwarding
net.ipv4.ip_forward = 1
У меня выбран последний вариант.
Теперь нужно сконфигурировать таблицы ядра с помощью iptables таким
образом, чтобы компьютеры локальной сети маскировались за сервером. Для
этого нужно исправить файл формирования правил
/etc/netfilter/filter.dialup.start. Приведу сразу результат.
begin /etc/netfilter/filter.dialup.start #!/bin/bash
#******************************************************
# Предопределения
#******************************************************
# Для инета
# Сетеовой инет-интрефейс
INET_IFACE="ppp0"
# Для локальной стороны
# Сетевой интерфейс, связанный с локалкой
LAN_IFACE="eth0"
# IP-адрес "локального" сетевого интерфейса
LAN_IP="192.168.2.192"
# Диапазон ip-адресов локальной подсети
LAN_IP_RANGE="192.168.2.0/24"
# Для внутренних дел (интерфейс обратной петли)
# Название
LO_IFACE="lo"
# IP-адрес
LO_IP="127.0.0.1"
# Ускоренное обращение к утилитам
IPTABLES="/sbin/iptables"
DEPMOD="/sbin/depmod"
MODPROBE="/sbin/modprobe"
#******************************************************
# Загрузка модулей, отвечающих за работу фильтрации
#******************************************************
$DEPMOD -a
$DEPMOD -a
$MODPROBE ip_tables
$MODPROBE ip_conntrack
$MODPROBE iptable_filter
$MODPROBE iptable_nat
$MODPROBE ipt_LOG
$MODPROBE ipt_limit
$MODPROBE ipt_state
$MODPROBE ipt_MASQUERADE
$MODPROBE ip_nat_ftp
$MODPROBE ip_conntrack_ftp
#******************************************************
# Работаем с таблицей filter
#******************************************************
# Определение политик по умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
# Отдельно выделим цепочку для "плохих" пакетов
$IPTABLES -N bad_tcp_packets
# Не способствовать спуфинг-атаке "Sequence Number Prediction"
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state\
--state NEW -j REJECT --reject-with tcp-reset
# Не пропускать пакеты со статусом NEW и со сброшенным битом SYN
# Данное правило я оставляю закомментированным, потому что иначе я не
# смогу запускать сценарий запуска из сессии ssh, потому что она как
# раз попадет под действие этой цепочки
# $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
# Отдельно выделим цепочку для прохождения ICMP пакетов
# пропускать будем только icmp-сообщения следующих типов:
# 3 - destination-unreachable (пункт назначения не доступен)
# 8 - echo-request (запрос на ping)
# 11 - time-exceeded (истекло время (ttl) при traceroute)
$IPTABLES -N icmp_packets
$IPTABLES -A icmp_packets -p ICMP --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP --icmp-type 11 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -j DROP
# Отдельно выделим цепочку для прохождения TCP пакетов
# Пропускать будет только tcp-пакеты адресованные к портам:
# 22 - сервис ssh
$IPTABLES -N tcp_packets
$IPTABLES -A tcp_packets -p TCP --dport 22 -j ACCEPT
$IPTABLES -A tcp_packets -p TCP -j DROP
# Отдельно выделим цепочку для прохождения UDP пакетов
# Пропускать будет только udp-пакеты адресованные к портам:
$IPTABLES -N udp_packets
$IPTABLES -A udp_packets -p UDP --destination-port 53 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -j DROP
#******************************************************
# Таблица filter - стандартная цепочка INPUT
#******************************************************
# Обрабатываем входящие плохие пакеты
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
# Разрешаем все входящие на интерфейс обратной петли
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
# Разрешаем все соединения получившие уже маркировку как
# установленное (ESTABLISHED) или связанное с уже
# установленным (RELATED) - для ускорения пропуска
$IPTABLES -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
# Обрабатываем ICMP-сообщения: для локалки разрешить все, для инета -
# разрешить определенные
$IPTABLES -A INPUT -p ICMP -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
# Обрабатываем TCP-соединения: для локалки разрешить определенные, для
# инета - запретить
$IPTABLES -A INPUT -p TCP -i $LAN_IFACE -s $LAN_IP_RANGE -j tcp_packets
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j DROP
# Обрабатываем UDP-соединения: аналогично TCP
$IPTABLES -A INPUT -p UDP -i $LAN_IFACE -s $LAN_IP_RANGE -j udp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j DROP
#******************************************************
# Таблица filter - стандартная цепочка FORWARD
#******************************************************
# Обрабатываем пересылаемые плохие пакеты
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
# Разрешаем любую пересылку со стороны локалки
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
# Для всех остальных: разрешаем только "установленные" и "связанные"
# соединения
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#******************************************************
# Работаем с таблицей nat
#******************************************************
#******************************************************
# Таблица nat - стандартная цепочка POSTROUTING
#******************************************************
# Включаем пересылку и маскирование (маскарад) адресов локальной сети
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
end /etc/netfilter/filter.dialup.start Итак, добавилось политика по умолчанию для таблицы filter цепочки
FORWARD, также фильтрация пересылаемых пакетов в таблице filter цепочке
FORWARD, плюс в таблице nat цепочке POSTROUTING добавилось правило
маскирующее все пакеты исходящие из сервера в Инет.
Для того чтобы это все заработало нужно сначала сбросить существующие
правила, а затем применить новые:
$ /etc/netfilter/filter.flush
$ /etc/netfilter/filter.dialup.start
На клиентских машинах в качестве шлюза (gateway) нужно указать ip-адрес
сервера.
Теперь, после дозвона сервером в Инет, клиентские машины могут
полноценно работать с внешним миром: браузить по сети,
получать-посылать почту, обмениваться сообщениями через ICQ и IRC. Но
следует учесть, что канал в этот момент они будут разделять все машины,
участвующие в это время в трафико-генерации, то есть скорость на одного
может быть достаточно не высокая. И еще, личное наблюдение, весь канал
может захватить тот, кто развивает большую сетевую активность.
C уважением, Kolotov Alexandr aka mr. Эбола
отвечать: myscri***@e*****.ru
ICQ: 100349254
| Registered Linux user # 236664 |
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru