Страницы

воскресенье, 13 апреля 2008 г.

Случилось мне как-то стать админом в домашней сетке

Случилось мне как-то стать админом в домашней сетке :)
Сетка наша состоит из 4-х сегментов. Ничего кроме обыкновенных неуправляемых свитчей у нас нет, а вирусы/хакеры/броадкаст и прочая ерунда уже начинают доставать. Благо интернет у нас в сегменте уже появился, и вот одной из бессоных летних ночей набрел я на инфу, которая гласила, что для решения нашей проблемы нужен фильтрующий мост.
В двух словах это комп с 2-мя сетевухами, к одной подключен наш сегмент, а к другой остальная сеть, и мост фильтрует трафик на предмет броадкаста, смены айпи и прочего.
Буквально на следущее утро был найден P2 533MHz 64RAM 1.5Gb HDD. На него был установлен мой любимый Slackware, на тот момент 11 версии. Для реализации задумки необходимы были следущие пакеты:
Первые два уже были установлены вместе с дистрибутивом, а последний пришлось ставить с исходников.
Понемногу обо всех пакетах: ну iptables в представлении не нуждается, а вот bridge-utils как раз таки и является ключевым звеном в мосте, так как именно он реализует виртуальный мост между интерфейсами. Пакет с немного неблагозвучным для русского человека названием :) ebtables служит для той же цели что и iptables, но только работает на более низком уровне управления пакетами(подробнее описывать не буду, кому надо - гоу на домашнюю страницу проекта).
Так вот после того как все это было установлено, а в свежеустановленной системе были произведены минимально необходимые настройки, началось самое интересное, а именно написание конфигов.
В процессе штудирования манов было написано 2 конфига. Один rc.brige в нем находятся правила для поднятия виртуального интерфейса br0 который объединяет в себе 2 интерфейса eth0 и eth1 (первая и вторая сетевухи соответственно).
Второй rc.firewall в нем прописаны все необходимые правила для фильтрации трафика, проходящего через мост. Конфиги были положены в их законное место /etc/rc.d/
Собсно сами конфиги приведены ниже:
rc.bridge

#!/bin/sh

ifconfig eth0 0.0.0.0
ifconfig eth1 0.0.0.0

brctl addbr br0

brctl addif br0 eth0
brctl addif br0 eth1

ifconfig br0 192.168.3.104 netmask 255.255.252.0

brctl stp br0 off

ip link set br0 up
ip link set eth0 up
ip link set eth1 up

Небольшие пояснения: Первые две строки убирают с интерфейсов eth0 и eth1 айпи адреса для того чтобы использовать их в виртуальном мосте. br0 это название интерфейса моста, 192.168.3.104 это адрес под которым мост будет виден в сети, адрес можно и не писать, но тогда не будет доступа по ssh.
Теперь rc.firewall

#!/bin/sh

IPT=/usr/sbin/iptables
EB=/usr/local/sbin/ebtables



$IPT -F INPUT
$IPT -F FORWARD
$IPT -F OUTPUT
$EB -F INPUT
$EB -F FORWARD
$EB -F OUTPUT

/sbin/modprobe ipt_conntrack
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp

# Deny for change ip's

$EB -A FORWARD -i eth1 -p IPv4 --ip-src 192.168.3.0/24 -j DROP
$EB -A FORWARD -i eth0 -p IPv4 --ip-src 192.168.3.0/24 -j ACCEPT
$EB -A FORWARD -i eth0 -p IPv4 --ip-dst 192.168.3.0/24 -j DROP
$EB -A FORWARD -i eth0 -p IPv4 -j DROP

# Deny for any INPUT traffic from eth1

$EB -A INPUT -i eth1 -p IPv4 -j DROP



# *******iptables rules for virtual brige interface*******


# DROP bradcast's and open some port's for games

# Open CS

$IPT -A FORWARD -p udp -m multiport --ports 27015:27020 -j ACCEPT

# Open UT2004

$IPT -A FORWARD -p udp -m multiport --ports 7777:7780 -j ACCEPT

# Drop all broadcast

$IPT -A FORWARD -m pkttype --pkt-type broadcast -j DROP


# Nassy must die

$IPT -A FORWARD -p tcp --dport 56003 -j DROP
$IPT -A FORWARD -p tcp --dport 50138 -j DROP
$IPT -A FORWARD -p tcp --dport 50139 -j DROP
$IPT -A FORWARD -p udp --dport 56003 -j DROP
$IPT -A FORWARD -p udp --dport 50138 -j DROP
$IPT -A FORWARD -p udp --dport 50139 -j DROP
$IPT -A FORWARD -p tcp --dport 50160 -j DROP
$IPT -A FORWARD -p udp --dport 50160 -j DROP

# Vypres must die

$IPT -A FORWARD -p tcp --dport 8165 -j DROP
$IPT -A FORWARD -p tcp --dport 8166 -j DROP
$IPT -A FORWARD -p tcp --dport 8167 -j DROP
$IPT -A FORWARD -p tcp --dport 8168 -j DROP
$IPT -A FORWARD -p tcp --dport 8169 -j DROP
$IPT -A FORWARD -p udp --dport 8165 -j DROP
$IPT -A FORWARD -p udp --dport 8166 -j DROP

# Allow ssh and telnet for Me, deny from all

$IPT -A INPUT -p tcp --source 192.168.3.1 --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp --source 192.168.3.1 --dport 23 -j ACCEPT
$IPT -A INPUT -p tcp --destination 192.168.3.104 --dport 22 -j DROP
$IPT -A INPUT -p tcp --destination 192.168.3.104 --dport 23 -j DROP

# Deny ssh and telnet connect from Big Lan to our network

$IPT -A FORWARD -p tcp --destination 192.168.3.0/24 --dport 22 -j DROP
$IPT -A FORWARD -p tcp --destination 192.168.3.0/24 --dport 23 -j DROP

####--- The packet forwarding part ---####



# Enable ip packet forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

# Kill the invalid packet's

$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP

# Allow the ESTABLISHED packet's

$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# SYN storm

$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP

# UDP storm

$IPT -A INPUT -p udp --destination-port 113 -j REJECT
$IPT -A INPUT -p udp --source-port 67 --destination-port 68 -j ACCEPT
$IPT -A INPUT -p udp -j RETURN
$IPT -A OUTPUT -p udp -j ACCEPT
$IPT -A FORWARD -p udp --destination-port 113 -j REJECT
$IPT -A FORWARD -p udp --source-port 67 --destination-port 68 -j ACCEPT
$IPT -A FORWARD -p udp -j RETURN
$IPT -A FORWARD -p udp -j ACCEPT


# ICMP - redirect

$IPT -A INPUT --fragment -p icmp -j DROP
$IPT -A OUTPUT --fragment -p icmp -j DROP
$IPT -A FORWARD --fragment -p icmp -j DROP

# Allow ping out, control the ping to me

$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 2 -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j DROP
$IPT -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 2 -j ACCEPT
$IPT -A FORWARD -p icmp --icmp-type echo-request -j DROP
$IPT -A INPUT -p icmp -j ACCEPT
$IPT -A FORWARD -p icmp -j ACCEPT

Небольшие пояснения для этого конфига:
В eth0 подключен наш сегмент, адреса 192.168.3.1-254
В eth1 подключена большая сеть, адреса 192.168.0.1-192.168.2.254
Мой адрес 192.168.3.1
В данном конфиге рубится весь броадкаст, разрешается он лишь для контры и ут2004.
Так же запрещается доступ по ssh и telnet из большой сети в нашу, а так же полностью закрыт доступ из большой сети на сам мост(они его просто не видят).
Реализована защита от смены айпи, таким образом если кто-то из большой сети пропишет себе адрес с нашего поддиапазона, то он просто не увидит ни одного компьютера нашего сегмента, так как мост все это блокирует.
Данный мост работает уже больше года и никаких сбоев в работе отмечено не было, со своими обязанностями он справляется, и почти никто из юзеров даже и не догадывается о его существовании.
Вот и все, если что-то не понятно, постараюсь разъяснить....have fun :)

2 комментария:

  1. добрый день,

    я бы хотел у вас проконсультироваться по следующей проблеме насчет бриджей.

    Есть компьютер (комп2) с 3-мя картами, к двум из них подключены еще 2 компа (комп1 и комп3), третья карта смотрит в интернет. Этот комп хочу использовать как роутер-мост для моей сетки. Хочу, чтобы все 3 компа видели друг друга и все 3 могли ходить в инет без ограничений. Пока решил настраивать, чтобы все 3 компа видели друг друга с помощью bridge-utils (у меня debian-testing)
    Настраивал через ssh с комп3, т.к. на компе-роутере (комп2) нет клавы и моника. Комп3 при этом был подключен к комп2 через eth1.

    Вот что получилось

    через 3-я карту в компе-роутере (комп2 eth1) я и настраивал сам бридж с рабочего компа (комп3) - потом она будем смотреть в сторону провайдера.
    Вот что получилось - вроде все нормально

    #arvdr:~# ifconfig -a
    eth0 Link encap:Ethernet HWaddr 00:15:F2:18:E2:68
    inet6 addr: fe80::215:f2ff:fe18:e268/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:66 errors:0 dropped:0 overruns:0 frame:0
    TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:4948 (4.8 KiB) TX bytes:2864 (2.7 KiB)
    Interrupt:201 Base address:0x9400

    eth1 Link encap:Ethernet HWaddr 00:50:DA:C0:30:BC
    inet addr:192.168.53.87 Bcast:192.168.53.255 Mask:255.255.255.0
    inet6 addr: fe80::250:daff:fec0:30bc/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:2418 errors:0 dropped:0 overruns:0 frame:0
    TX packets:2893 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:192641 (188.1 KiB) TX bytes:452391 (441.7 KiB)
    Interrupt:169 Base address:0x6000

    eth2 Link encap:Ethernet HWaddr 00:E0:4C:77:0F:E8
    inet6 addr: fe80::2e0:4cff:fe77:fe8/64 Scope:Link
    UP BROADCAST MULTICAST MTU:1500 Metric:1
    RX packets:40 errors:0 dropped:0 overruns:0 frame:0
    TX packets:65 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:3236 (3.1 KiB) TX bytes:4844 (4.7 KiB)
    Interrupt:177 Base address:0xd400

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet6 addr: ::1/128 Scope:Host
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:136 errors:0 dropped:0 overruns:0 frame:0
    TX packets:136 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:13898 (13.5 KiB) TX bytes:13898 (13.5 KiB)

    sit0 Link encap:IPv6-in-IPv4
    NOARP MTU:1480 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

    vdr Link encap:Ethernet HWaddr 00:15:F2:18:E2:68
    inet addr:192.168.53.89 Bcast:192.168.53.255 Mask:255.255.255.0
    inet6 addr: fe80::215:f2ff:fe18:e268/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:35 errors:0 dropped:0 overruns:0 frame:0
    TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:1610 (1.5 KiB) TX bytes:468 (468.0 b)

    вроде бы все нормально. Переключаю сетевой кабель с eth1 в компе-роутере на один из интерфейсов бриджа (eth0, eth2). Пингом определяю, что мой рабочий комп (комп3) видит комп1. Значит мост заработал.

    Но есть и минус - после того, как переключил сетевой кабель c eth1 на eth0 или eth2 в компе-роутере я перестал видеть комп2
    (кстати, ИП адрес комп3 - 192.16.53.88)

    я пробовал пинговать на ИП бриджа - пинг не проходит. Т.е. доступ на VDR я потерял. Если же обратно подключу кабель на eth1 в комп2 - то сам комп2 я вижу по IP адресу бриджа (192.168.53.89). Однако в этом случае я не вижу комп1 со своего компа3 - что логично.

    Вопрос такой - как получить доступ к комп2 с комп3, на котором запущен бридж при подключенном сетевом кабеле на одном из интерфейсов самого моста (eth0 или eth2)


    Игорь

    ОтветитьУдалить
  2. Хм, без бутылки не разобраться, проверьте не трогали ли вы чего-нибудь в iptables, это на всякий случай.
    Хотя, если честно первое что пришло на ум, в вашем случае мне кажется проще купить свитч, и в роутере поставить две сетевухи, одну к провайдеру а во вторую свитч с пользователями.
    А если по существу, то в принципе все сделано правильно. Проверьте файрволл, и сделайте route -n проверьте чтобы маршрут по умолчанию шел на ваш vdr.

    ОтветитьУдалить