Как разграничить локальные подсети? (очевидно в цепочке FORWARD iptables..)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
gard
Сообщения: 215

Как разграничить локальные подсети?

Сообщение gard »

Здравствуйте! =)
Есть проблема, но сначала предыстория.. Схема: Internet - ppp0(eth0) - Router(Ubuntu) - eth1 - LAN. В общем в правилах iptables локальной сети разрешено выходить в интернет, по причине желаемого ограничения скорости некоторых клиентов локальной сети эта сеть была разбита на 2.

То есть у меня есть eth1 192.168.20.1 которая принадлежит как уже понятно сети вида 192.168.20.0/24, адреса в этой сети раздаются по DHCP (который прицеплен на eth1), мной был создан алиас eth1:0 192.168.10.1 находящийся в своей подсети вида 192.168.10.0/24. Все это было проделано для:
- пользователям более "важной" группы отдаются адреса в подсети 192.168.10.0/24, прописываются ручками
- всем остальным пользователям при подключении автоматически присваивается адрес в подсети 192.168.20.0/24 сервером DHCP
- у первых скорость в Инете выше, у вторых ниже (шейпер)
- удобно быстро воткнуть новый компьютер.

Но все бы ничего, но проблема! Компьютер 192.168.10.2 у меня преспокойно пингует 192.168.20.1 (eth1), разве это возможно? Это же другая подсеть! Я вроде и в FORWARD в iptables уже написал:

Код: Выделить всё

$IPTABLES -A FORWARD -s $LAN1_IP_RANGE -d $LAN2_IP_RANGE -j DROP
$IPTABLES -A FORWARD -s $LAN2_IP_RANGE -d $LAN1_IP_RANGE -j DROP
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT

где LAN1_IP_RANGE = "192.168.10.0/24", а LAN2_IP_RANGE = "192.168.20.0/24". Никаких маршрутов не прописывал, ибо неважно разбираюсь как то в них. Но.. пинг как шел так и идет.. а нужно (желательно) чтобы подсеть 10 не имела доступа к подсети 20, только к интернету. Жду помощи, советов, рассуждений и прочих отзывов. =)
Изображение Contacts: gard.area51@jabber.ru/org .. more: http://gardarea51.wordpress.com
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Как разграничить локальные подсети?

Сообщение IMB »

Я у себя сделал наоборот - дефолтная политика DROP, кому надо - ACCEPT.
Спасибо сказали:
Аватара пользователя
gard
Сообщения: 215

Re: Как разграничить локальные подсети?

Сообщение gard »

А вот у меня тоже дефолтная DROP, просто она применяется когда все правила исчерпаны. Тут проблема в том, что iptables не может работать с алиасами, оба интерфейса eth1 и eth1:0 для iptables все равно как один eth1. Вот я и сделал два правила что из сети А в сеть Б - дропить и наоборот дропить, а если просто пакет идет на eth1 то пропускать (например в Интернет).. блин я сам запутался как же тут сделать оО..

Вот, лог с ноутбука, которым тестирую-пингую роутер:

Код: Выделить всё

# traceroute 192.168.10.1
traceroute to 192.168.10.1 (192.168.10.1), 30 hops max, 38 byte packets
 1  192.168.10.1 (192.168.10.1)  0.462 ms  0.409 ms  0.413 ms
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:60:97:93:56:FA
          inet addr:192.168.20.2  Bcast:192.168.20.255  Mask:255.255.255.0
          UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6780 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6370 errors:0 dropped:0 overruns:0 carrier:0
          collisions:138 txqueuelen:1000
          RX bytes:5767736 (5.5 MiB)  TX bytes:703835 (687.3 KiB)
          Interrupt:5 Base address:0x300

Видно, что сама сетевая карта ноутбука принадлежит другой подсети, но это не мешяет ей пинговать роутер во второй подсети.
Вот моя конфигурация iptables, настраивать скорее всего нужно FORWARD.. подскажите, где косяк:

Код: Выделить всё

#!/bin/bash

#Данный сценарий основан на наличии одной локальной сети, одного маршрутизатора и одного подключения к Интернет с динамическим ip адресом.
#Доступ к сервисам интернет идет через брандмауэр, мы полностью доверяем клиентам нашей локальной сети и поэтому не будем блокировать
#трафик, исходящий из локальной сети, однако, Интернет - не доверительная сеть. поэтому нужно ограничить доступ в нашу сеть и на брандмауэр
#извне. Исходное правило: "все, что явно не разрешено - то запрещено".

################################################################################
##########
#1.Конфигурация: интернет, локальная сеть, lo, модули не проверяем каждый раз..
INET_IFACE="ppp0"
LAN1_IP="192.168.10.1"
LAN1_IP_RANGE="192.168.10.0/24"
LAN2_IP="192.168.20.1"
LAN2_IP_RANGE="192.168.20.0/24"
LAN_IFACE="eth1"
LO_IFACE="lo"
LO_IP="127.0.0.1"
IPTABLES="iptables"

################################################################################
##########
#2.Очистка цепочек и удаление созданных цепочек.
$IPTABLES -t filter -F
$IPTABLES -t mangle -F
$IPTABLES -t nat -F
$IPTABLES -t filter -X

################################################################################
##########
#3.Установка правил
#3.1.Устанвока политик по-умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#3.2.Создание собственных цепочек _таблицы_filter_
$IPTABLES -N bad_tcp_packets
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets

#3.3.Наполнение собственных цепочек _таблицы_filter_ правилами
#цепочка bad_tcp_packets (syn/ask пакеты со сброшенным битом syn, со статусом new, но сброшенным битом syn)
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
#цепочка allowed, tcp, udp, icmp пакетов
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#>цепочка tcp_packets (разрешаем доступ извне по SSH, маскируя порт от сканирования)
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -m recent --name ssh --update --seconds 3600 --hitcount 8 -j REJECT
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -m recent --name ssh --set
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -m recent --name ssh ! --rcheck --seconds 15 --hitcount 2 -j REJECT
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -j allowed
#>цепочка udp_packets (разрешаем прохождение ответов от внешнего DNS-сервера, ICQ, udp-наводнение пресекается политикой DROP)
$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 5190 -j ACCEPT
#цепочка icmp_packets (пинг, ответ об умершем пакете, остальные д. принадлежать либо к ESTABLISHED либо к RELATED соединениям)
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#>>дополнительная защита от фрагментированных пакетов (вероятное ping-наводнение)
$IPTABLES -A icmp_packets --fragment -p ICMP -j LOG --log-prefix "fragment icmp packets DROP: "
$IPTABLES -A icmp_packets --fragment -p ICMP -j DROP

#3.4.цепочка PREROUTING
#3.4.1.таблица mangle
$IPTABLES -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x6
$IPTABLES -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x6
$IPTABLES -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x6
$IPTABLES -t mangle -A PREROUTING -i $INET_IFACE -j TTL --ttl-inc 1
#пришедшие для SSH, , маркируем эти пакеты (для дальнейшей приоретизации скорости в iproute2)
#$IPTABLES -t mangle -A PREROUTING -p tcp -s 0/0 --dport 22 -j MARK --set-mark 11
#3.4.2.таблица nat
#перенаправление порта для организации прозрачного проксирования в squid (+ открыть в INPUT порт 3128 для LAN)
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -p tcp --dport 80 -j REDIRECT --to-ports 3128
#3.5.цепочка INPUT
#3.5.1.таблица mangle
#3.5.2.таблица filter
#проверка пакетов, идущих на маршрутизатор (валидность, из локальной сети, от самого себя)
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN1_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN2_IP_RANGE -j ACCEPT
#squid
#iptables -A INPUT -p TCP -s $LAN1_IP_RANGE --dport 3128 -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
#остальные либо связанные с ESTABLISHED,RELATED соединениями, либо направляются в соответствующие цепочки
$IPTABLES -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
#логирование не пропущенных пакетов
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "

#3.6.цепочка FORWARD
#3.6.1.таблица mangle
#3.6.2.таблица filter
#проверка транзитных пакетов (валидность, идут ли из локальной сети, принадлежат ли ESTABLISHED,RELATED соединениям)
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
$IPTABLES -A FORWARD -s $LAN1_IP_RANGE -d $LAN2_IP_RANGE -j DROP
$IPTABLES -A FORWARD -s $LAN2_IP_RANGE -d $LAN1_IP_RANGE -j DROP
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#логирование не пропущенных пакетов
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "

#3.7.цепочка OUTPUT
#3.7.1.таблица mangle
#маркировка пакетов для iproute2
$IPTABLES -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j MARK --set-mark 0x3
$IPTABLES -t mangle -A OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x4
$IPTABLES -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j MARK --set-mark 0x4
$IPTABLES -t mangle -A OUTPUT -p ALL -j MARK --set-mark 0x5
#3.7.2.таблица nat
#3.7.2.таблица filter
#проверка исходящих от роутера пакетов (валидность, идут с нашего $INET_IFACE, на $LAN1_IP или $LO_IP)
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN1_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN2_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
#логирование не прошедших
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "

#3.8.цепочка POSTROUTING
#3.8.1.таблица mangle
$IPTABLES -t mangle -A POSTROUTING -p udp --dport 53 -j MARK --set-mark 0x1
$IPTABLES -t mangle -A POSTROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
$IPTABLES -t mangle -A POSTROUTING -p icmp -j MARK --set-mark 0x2
$IPTABLES -t mangle -A POSTROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x8
#<<изменение TTL на стандартное, чтобы замаскировать подсеть по ttl
$IPTABLES -t mangle -A POSTROUTING -o $INET_IFACE -j TTL --ttl-set 64
#$IPTABLES -t mangle -A POSTROUTING -p tcp --sport 80 --dport 80 -j MARK --set-mark 0x2
#3.8.2.таблица nat
#маскарадинг, DNAT на входе (PREROUTING) будет произведено автоматически
$IPTABLES -t nat -A POSTROUTING -s $LAN1_IP_RANGE -o $INET_IFACE -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -s $LAN2_IP_RANGE -o $INET_IFACE -j MASQUERADE

################################################################################
##########
#4.Настройка /proc
#4.1.Включаем возможность форвардинга
echo "1" > /proc/sys/net/ipv4/ip_forward
#4.2.Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies


#другие опции ядра

#>проверка обратного адреса для всех пакетов
#for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
#echo 2 > $i
#done
Изображение Contacts: gard.area51@jabber.ru/org .. more: http://gardarea51.wordpress.com
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Как разграничить локальные подсети?

Сообщение IMB »

Да, с алиасами iptables не работает. Я в сети решил это через vlan.
Спасибо сказали:
Аватара пользователя
gard
Сообщения: 215

Re: Как разграничить локальные подсети?

Сообщение gard »

Ну тут вопрос стоит как "сделать из того, что есть и максимально дешево, но веьма сердито"... =)
Изображение Contacts: gard.area51@jabber.ru/org .. more: http://gardarea51.wordpress.com
Спасибо сказали: