Был у меня на работе старенький сервачок на
FreeBSD, на нем крутился
DHCP и
squid, и что бы никто без моего ведома не получал доступ к интернетам, был своеобразный фильтр, по маку выдавался определенный
IP, который был разрешен в
squid через
SAMS. Слишком много телодвижений подумал я, и решил все упростить.
FreeBSD решил снести и накатить туда
debian. Процедуру установки описывать не буду, не об этом заметка.
1. В
squid включаем прозрачность
http_port 8080
http_port 8081 intercept
В 3 версии необходимо слушать на 2х портах, один прозрачный, второй обычный
2. У меня на работе 5 этажей и для каждого этажа я создал по файлу с
mac адресами
#TAG: acl
acl 1_floor arp "/etc/squid3/1_floor.mac"
acl 2_floor arp "/etc/squid3/2_floor.mac"
acl 3_floor arp "/etc/squid3/3_floor.mac"
acl 4_floor arp "/etc/squid3/4_floor.mac"
acl 5_floor arp "/etc/squid3/5_floor.mac"
#TAG: http_access
http_access allow 1_floor
http_access allow 2_floor
http_access allow 3_floor
http_access allow 4_floor
http_access allow 5_floor
Содержимое файла 1_floor.mac
00:22:15:cb:d9:9b #107
00:1a:4d:93:8b:67 #101
00:80:48:b5:77:14 #vahta
54:04:A6:06:09:17 #vahta_nbook
90:94:E4:AE:D6:40 #106_wifi
Можно включить в логах отображение
mac-адреса, для этого в конфиг сквида нужно добавить:
logformat squid %{%d/%b/%Y:%H:%M:%S}tl %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
3. Теперь про
iptables.
Закручиваем весь
http траффик на
8081 порт(прозрачный)
iptables -t nat -A PREROUTING -s 192.168.84.0/24 ! -d 192.168.84.1 -p tcp --dport 80 -j REDIRECT --to-port 8081
Все запросы из 84 подсети, кроме 84.1(это наш сервер) на 80 порт, будут перенаправлены на локальный порт
8081.
Допустим некоторых надо пустить напрямую, без редиректа, через
NAT, для этого следующее правило:
iptables -t nat -A POSTROUTING -s 192.168.84.5 -o eth1 -j MASQUERADE
iptables -t nat -A PREROUTING -s 192.168.84.5 -p tcp -m tcp --dport 80 -j RETURN
Оно должно быть выше, редиректа на SQUID
Ну а теперь самое интересное, многие знают, что
443 порт очень сложно сделать прозрачным, точнее даже не сложно, а геморройно, связи с сертификатами. Так вот, наша задача состоит в том, что бы включить
NAT на
443 порт для
mac адресов перечисленных в файлах *.mac.
Принцип действия.
Мы создаем таблицу(mangle)
mac_access и маркируем пакеты с определенных
mac адресов, и в конечном итоге указываем, что разрешено этим маркированным пакетам.
Скрипт для добавления всех
mac адресов из файлов
X_floor.mac расположенных в
/etc/squid3
#!/bin/bash
iptables -t mangle -N mac_access
iptables -t mangle -A mac_access -j MARK --set-mark 1
for i in `sed 's/#.*//; /^$/d' /etc/squid3/*.mac`
do
iptables -t mangle -A PREROUTING -m mac --mac-source ${i} -j mac_access
done
Правило в iptables разрешающее
NAT 443 порта
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 443 -m mark --mark 1 -j MASQUERADE
4. И немножко про
DHCP.
В настройка
DHCP можно указать файл автоматический конфигурации
PROXY. Для этого надо добавить следующее:
/etc/dhcp/dhcpd.conf
option wpad code 252 = text;
option local-pac-server code 252 = text;
subnet 192.168.84.0 netmask 255.255.255.0 {
range 192.168.84.10 192.168.84.220;
option wpad "http://192.168.84.1/wpad.dat";
option local-pac-server "http://192.168.84.1/wpad.dat\000";
}
Если нет никакого
http сервера, устанавливаем
lighttpd apt-get install lighttpd
, особой конфигурации не требует.
Создаем файл
/var/www/html/wpad.dat:
function FindProxyForURL(url, host)
{
return "PROXY 192.168.84.1:8080";
}
IE и
Chrome понимают данную конструкцию.
Так же про
wpad можно почитать здесь
http://habrahabr.ru/company/mailru/blog/259521/
Вроде бы все, из вышесказанного можно делать любые конструкции по фильтрации и маскарадинга по
mac адресу. Насчет производительности не уверен, но у меня в таблице свыше 100
mac адресов и сервер хоть и старенький, но чувствует себя комфортно.
Всем
iptables ;-)
Комментарии ()