Здравствуйте! =)
Есть проблема, но сначала предыстория.. Схема: 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где LAN1_IP_RANGE = "192.168.10.0/24", а LAN2_IP_RANGE = "192.168.20.0/24", LAN_IFACE = "eth0". Никаких маршрутов не прописывал, ибо неважно разбираюсь как то в них. Но.. пинг как шел так и идет.. а нужно (желательно) чтобы подсеть 10 не имела доступа к подсети 20, только к интернету. Жду помощи, советов, рассуждений и прочих отзывов. =)
$IPTABLES -A FORWARD -s $LAN2_IP_RANGE -d $LAN1_IP_RANGE -j DROP
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPTВот.. подумал что нелишним будет весь скрипт iptables:
#!/bin/bash
################################################################################
##########
#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#другие опции
Вот, лог с ноутбука, которым тестирую-пингую роутер:# 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
>Видно, что сама сетевая карта ноутбука принадлежит другой подсети, но это
>не мешяет ей пинговать роутер во второй подсети. Реально ли разделить?
>Очень жду помощи! =)Видно. Не мешяет. Реально. А зачем ? Проблемы на самом деле нет.
NB: это не роутер во второй подсети, это второй интерфейс одного и того же роутера. Соответственно FORWARD тут пока не при чем.
>Видно. Не мешяет. Реально. А зачем ? Проблемы на самом деле нет.
>
>
>
>NB: это не роутер во второй подсети, это второй интерфейс одного и
>того же роутера. Соответственно FORWARD тут пока не при чем.А, ну то есть нужно попробовать попинговать реальный компьютер со второй подсети, а не интерфейс роутера?
Проблемы то нет.. как бы, я вообще удивлен, что оно так работает, вроде бы нужно прописать маршрут между подсетями, чтобы не было зацикливаний. все же у меня оба интерфейса: eth1 & eth1:0 "сидят" ня одном кабеле, а клиенты подсетей "сидят" на одном свитче, этакое подобие VLAN. Что будет, если клинент "а" из подсети А обратится к клиенту "б" из подсети Б? Пакет пойдет через роутер или же зациулится? По логике, хочется оградить клмпьютеры из подсети А от компьютеров из подсети Б.. но это не критично. А по сделанной мной схеме (без явно прописанного маршрута) все будет работать нормально?
>Проблемы то нет.. как бы, я вообще удивлен, что оно так работает,я не удивлен, так и должно работать. Нужно просто думать и понимать что происходит в сети.
Читать.>вроде бы нужно прописать маршрут между подсетями, чтобы не было зацикливаний.
Вроде бы у вас дефолтным шлюзом рутер прописан. Не наводит ни на какие мысли ?
>все же у меня оба интерфейса: eth1 & eth1:0 "сидят" ня
>одном кабеле, а клиенты подсетей "сидят" на одном свитче, этакое подобие
>VLAN. Что будет, если клинент "а" из подсети А обратится к
>клиенту "б" из подсети Б? Пакет пойдет через роутер или жечерез рутер
>зациулится?
с чего бы вдруг? Нужно просто _думать_ и понимать что происходит в сети. Читать.
>По логике, хочется оградить клмпьютеры из подсети А от компьютеров
>из подсети Б.. но это не критично. А по сделанной мной
>схеме (без явно прописанного маршрута) все будет работать нормально?читать выше про дефолтный рутер. степень нормальности вы определяете сами.
Ну да, так оно.. дефолтный шлюз для каждой подсети - соответствующий (псевдо)интерфейс моего роутера. Значит завтра попингую реальный комп из второй подсети.. спасибо, что объясняете. Читать то я читаю, в последнее время только больше про файрвол и шейпинг, сегодня вот DHCP настроил и разбил одну сеть на две для удобства. Не очень пароноидальная схема я надеюсь? =)
Пропинговал другой комп с ноута из первой подсети.. пинга нет =) все как надо. Значит.. щас чтобы подсети могли общаться нужен маршрут и разрешить в iptables..
>Пропинговал другой комп с ноута из первой подсети.. пинга нет =) все
>как надо. Значит.. щас чтобы подсети могли общаться нужен маршрут и
>разрешить в iptables..хе-хе.. подправил iptables, закомментил вчера написанные правила - пинг появился. То есть.. можно сейчас как угодно сделать.
>>Пропинговал другой комп с ноута из первой подсети.. пинга нет =) все
>>как надо. Значит.. щас чтобы подсети могли общаться нужен маршрут и
>>разрешить в iptables..
>
>хе-хе.. подправил iptables, закомментил вчера написанные правила - пинг появился. То есть..
>можно сейчас как угодно сделать.конечно же как угодно, и пользователь тоже может IP и MAC ручками прописать :)
так оно так.. но тут этого не будет, делается для простой конторы без злостных нарушителей в штате. =)