Skip to content

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

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

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

 В двух словах это комп с 2-мя сетевухами, к одной подключен наш сегмент, а к другой остальная сеть, и мост фильтрует трафик на предмет броадкаста, смены айпи и прочего.

Буквально на следущее утро был найден P2 533MHz 64RAM 1.5Gb HDD. На него был установлен мой любимый Slackware, на тот момент 11 версии. Для реализации задумки необходимы были следущие пакеты:

iptables

bridge-utils

ebtables

Первые два уже были установлены вместе с дистрибутивом, а последний пришлось ставить с исходников.Понемногу обо всех пакетах: ну 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 smiley