Планування правил firewall за часом у OpenWrt не реалізовано графічним засобами.
У оригінальному програмному забезпечені роутера це робиться досить просто. А якщо користувач не дуже знайомий з особливостями Linux то можливо виникають питання.
Так є завдання - блокувати для IP адрес локальної мережі, за розкладом, вихід до мережі інтернет.
У роутері попередньо налаштований DHCP pool на видачу адрес у діапазоні 192.168.0.128 - 192.168.0.142.
firewall
Для блокування створимо теку для зберігання скриптів, наприклад /etc/fw-cron
і там файли вмикання привил child.1.sh та вимикання правил child.0.sh.
У моєму випадку блокується вихід до мережі інтернет з адрес 192.168.0.128/28 (192.168.0.128 - 192.168.0.142)*. * -на допомогу прийде ipcalc
тому зміст файлів наступний :
child.1.sh:
Цей запис вставляє, до фаєрволу iptables, правило за номером 1 у ланцюжок з іменем "zone_lan_forward", якщо адреса комп'ютерів підлягає під мережу 192.168.0.128/28, то правило направляє пакети до зони "zone_wan_REJECT". Та в свою чергу блокує вихід до WAN.
Ось надано вигляд ланцюгів iptables що існують:
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
За допомогою редактора додамо записи до фала конфігурації /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
У оригінальному програмному забезпечені роутера це робиться досить просто. А якщо користувач не дуже знайомий з особливостями 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
Немає коментарів:
Дописати коментар