Здравствуйте.Решил отказаться от squid’a (в виду проблемности с https (для меня)), и с делать все через iptables.
Получилось следующее:
IP-адреса выдаются на основании MAC
правила для групп находятся в отдельных файлах
при запуске считываются правила и добавляются в iptables
Конфиг DHCP:
ddns-update-style none;
authoritative;
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.1.1;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
option broadcast-address 192.168.1.255;
default-lease-time 600;
max-lease-time 7200;
}
include "/etc/dhcp/hosts";
Файл с хостами для DHCP:
host host1 {
hardware ethernet 00:0C:29:E7:СС:7C;
fixed-address 192.168.1.10;
}
host host2 {
hardware ethernet 00:0C:FF:E7:45:7C;
fixed-address 192.168.1.11;
}
host host3 {
hardware ethernet 99:0C:29:E7:45:7C;
fixed-address 192.168.1.12;
}
и т.д.
Файл добавления правил:
#!/bin/bash
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
# Правила по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
echo "1" > /proc/sys/net/ipv4/ip_forward
# Директория с файлами правил
RULES_DIR=/home/user/rules
### INPUT
# Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить уже установленные входящие соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Разрешить DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT
### FORWARD
# Разрешить уже установленные пересылаемые соединения
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Правила
# rules.sh - файл чтения правил из файла
find $RULES_DIR -type f | grep -E -o "group_([0-9A-Za-z\-\_])+" | while read FILENAME; do
$RULES_DIR/rules.sh $RULES_DIR/$FILENAME
done
# почта
iptables -A FORWARD -p tcp -m tcp --dport 995 -j ACCEPT
iptables -A FORWARD -p tcp -m tcp --dport 465 -j ACCEPT
# DNS
iptables -A FORWARD -p udp -s 192.168.1.0/24 -m multiport --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -d 192.168.1.0/24 -m multiport --dport 53 -j ACCEPT
### NAT
# Включить NAT для локальной подсети
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j MASQUERADE
service dnsmasq restart
Файл чтения правил из файла:
#!/bin/bash
mac=$( cat $1 | grep -E -o '((([0-9A-Fa-f]){2}(\:)?){5,7}(\|)?)+' )
mac=${mac//"|"/" "}
for i in $mac
do
cat $1 | grep -e "rule " | while read line
do
ports=$( echo $line | grep -E -o '([0-9]{1,5}(\|)?)+' )
sites=$( echo $line | grep -E -o '(([0-9a-zA-Z])*(\.)?([0-9a-zA-Z])+(\.){1}([0-9a-zA-Z]){2,9}(\|)*)+' )
ports=${ports//"|"/" "}
sites=${sites//"|"/" "}
if [ ${#posts} != 0 ] & [ ${#sites} != 0 ]; then
# Есть порты и сайты
for p in $ports
do
for s in $sites
do
iptables -A FORWARD -p tcp --dport $p -d $s -m mac --mac-source $i -j ACCEPT
iptables -A FORWARD -p tcp --dport $p -s $s -m mac --mac-source $i -j ACCEPT
done
done
else
if [ ${#posts} > 0 ]; then
# Есть порты
for p in $ports
do
iptables -A FORWARD -p tcp --dport $p -m mac --mac-source $i -j ACCEPT
done
else
# Есть сайты
for s in $sites
do
iptables -A FORWARD -p tcp -d $s -m mac --mac-source $i -j ACCEPT
iptables -A FORWARD -p tcp -s $s -m mac --mac-source $i -j ACCEPT
done
fi
fi
done
done
Пример файла правил:
<rules mac="00:0C:FF:E7:45:7C|00:0C:FF:E7:99:7C">
<rule port="80|8080" sites="ubuntu.ru|novosti.ru" />
<rule port="443" sites="mail.ru|youtube.com" />
</rule>
В правилах указывается разрешенный порт и сайты, на которые разрешен доступ по этому порту с mac указанных в свойстве mac. Если не указывать сайты, будет открыт доступ ко всем сайтам этого порта. Если ничего не указать, будет запрещен доступ ко всему.
В принципе все работает (проверял на физической сети с 3 компами, и виртуальной сети с 2 компами).
Вопрос вот в чем, правильно ли так делать, какие проблемы могут возникнуть (нагрузка на сервер (процессор), общая работоспособность сети и интернета в целом, и т.д.)?
Конфигурация будет следующей:
Процессор: 4-х ядерный, 3.2 ГГц
ОЗУ: 8 Гб
Сетевые карты: 1 Гбит