Squid и Iptables фильтруем по mac адресам.

Был у меня на работе старенький сервачок на 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 ;-)

Комментарии ()

    Есть вопрос или предложение пиши в Telegram @cloudsv

    Прямой эфир

    cloudsv 24 октября 2018, 00:27
    О жизни Обновление Scala Rider G4 0
    cloudsv 21 октября 2018, 23:16
    Arch Linux Памятка по основным утилитам Linux 0
    cloudsv 01 июня 2018, 01:39
    Telegram Настройка прокси mtproto для Telegram 28
    cloudsv 22 января 2018, 21:59
    Web Локальное зеркало обновлений Dr.web 0
    cloudsv 03 октября 2017, 10:55
    Web Пароль от резервной копии Bitrix 1
    cloudsv 09 июля 2017, 23:02
    Arch Linux Let's Encrypt это легко и просто 0