18 жовтня 2011 р.

Планування правил firewall за часом у OpenWrt

Планування правил firewall за часом у OpenWrt не реалізовано графічним засобами.
У оригінальному програмному забезпечені роутера це робиться досить просто. А якщо користувач не дуже знайомий з особливостями Linux то можливо виникають питання.

Так є завдання - блокувати для IP адрес локальної мережі, за розкладом, вихід до мережі інтернет.
У роутері попередньо налаштований DHCP pool на видачу адрес у діапазоні  192.168.0.128 - 192.168.0.142.

firewall

Для блокування створимо теку для зберігання скриптів, наприклад /etc/fw-cron
і там файли вмикання привил child.1.sh та вимикання правил child.0.sh.
touch  /etc/fw-cron/child.1.sh
touch  /etc/fw-cron/child.0.sh
chmod +x /etc/fw-cron/child.*



У моєму випадку блокується вихід до мережі інтернет з адрес 192.168.0.128/28 (192.168.0.128 - 192.168.0.142)*.   * -на допомогу прийде ipcalc
тому зміст файлів наступний :

child.1.sh:
/usr/sbin/iptables -I zone_lan_forward -j zone_wan_REJECT -s 192.168.0.128/28 

Цей запис вставляє, до фаєрволу iptables, правило за номером 1 у ланцюжок з іменем "zone_lan_forward", якщо адреса комп'ютерів підлягає під мережу 192.168.0.128/28, то правило направляє пакети до зони "zone_wan_REJECT". Та в свою чергу блокує вихід до WAN.

Ось надано вигляд ланцюгів iptables що існують:


zone_lan_forward
zone_wan_REJECT
Налаштування WAN порту та VLAN
zone_lan_forward після додавання правила

child.0.sh: 
/usr/sbin/iptables -D zone_lan_forward -j zone_wan_REJECT -s 192.168.0.128/28

Цей запис видаляє, попередньо додані правила, і надає доступ до мережі інтернет.


cron

Для виконання команд за розкладом є прогама cron. Приклад налаштування: "Scheduling Jobs With cron on OpenWrt" [en][ua]
Для того щоб вона виконувалася треба щоб був файл конфігурації що розміщується у теці /etc/crontabs

У кожного користувача можуть бути свої файли налаштувань, створимо для користувача root

touch /etc/crontabs/root

За допомогою редактора додамо записи до фала конфігурації /etc/crontabs/root
0 */2 * * * /etc/fw-cron/child.1.sh > /dev/null
30 */2 * * * /etc/fw-cron/child.0.sh > /dev/null


Правила виконуються кожну 2-гу годину.
Наприклад, о 16-00 забороняємо доступ, о 16-30 дозволяємо доступ.

Запускаємо
/etc/init.d/cron restart


cutter

Якщо є бажання то можна і обмежити поточні з'єднання, тому що додані правила фаєрволу не розривають вже встановленні з'єднання. І програми що використовують постійне з'єднання продовжують працювати. Для розривання з'єднань встановимо пакунок cutter
opkg update
opkg install cutter
Є декілька варіантів з визначенням поточних з'єднань.
1. Використаємо файл з IP адресами клієнтів наданих DHCP сервером роутера. І відфільтруємо тільки ті адреси що потрібно блокувати.

while read inputline;
do
ip4=$(echo "$inputline" | awk '{print $3;}')
ip44=$(echo $ip4 | cut -d "." -f 4)
if [[ $ip44 -ge 128 && $ip44 -le 148 ]]; then
/usr/sbin/cutter $ip4 >/dev/null
fi
done < "/var/dhcp.leases"

2. Використаємо файл зі значенням поточних з'єднань з використанням /proc/net/ip_conntrack
виконуючи таку послідовність
grep ESTABLISHED /proc/net/ip_conntrack | cut -d "=" -f 2| cut -d " " -f 1|sort -u
отримаємо перелік адрес з поточним з'єднанням.
Обробимо фільтруючи адреси:

grep ESTABLISHED /proc/net/ip_conntrack | cut -d "=" -f 2| cut -d " " -f 1|sort -u | while read ip4; do \
ip44=$(echo $ip4 | cut -d "." -f 4); \
if [[ $ip44 -ge 128 && $ip44 -le 148 ]]; then \
/usr/sbin/cutter $ip4 >/dev/null; \
fi \
done

Додамо рядки з будь якої з версій реалізації до файлу /etc/fw-cron/child.1.sh. Таким чином у нас будуть блокуватися майбутні з'єднання і обриваються поточні.

Перевірено на роутері TP-Link 1043, OpenWrt KAMIKAZE (bleeding edge, r25068) [18.10.2011]

Якщо є потреба не обмежувати повний доступ,  а використовувати блокування на рівні доменного імені, то можна скористатися модулем iptables-mod-filter - (iptables extensions for packet content inspection)

opkg updare
opkg info iptables-mod-filter

Depends: iptables, kmod-ipt-filter


opkg info   kmod-ipt-filter
Depends: kernel (= 2.6.32.27-1), kmod-ipt-core, kmod-textsearch

opkg info kmod-ipt-core
Depends: kernel (= 2.6.32.27-1)

Тому слід бути уважним щодо використовного вашого ядра операційної системи, у моєму випадку потрібні скомпільовані версії для  2.6.32.28-1, тому я їх створював за цією процедурою.


opkg install iptables-mod-filter

Для блокування тільки "vkontakte" та "odnoklassniki"
/usr/sbin/iptables -I zone_lan_forward -j zone_wan_REJECT -s 192.168.0.128/28 -m string --string "vkontakte" --algo kmp
/usr/sbin/iptables -I zone_lan_forward -j zone_wan_REJECT -s 192.168.0.128/28 -m string --string "odnoklassniki" --algo kmp

 Або  блокування усього окрім "slovari.yandex.ru"
/usr/sbin/iptables -I zone_lan_forward -j zone_wan_REJECT -s 192.168.0.128/28 
/usr/sbin/iptables -I zone_lan_forward -j zone_wan_ACCEPT -s 192.168.0.128/28 -m string --string "slovari.yandex.ru" --algo kmp



Немає коментарів:


Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready