Скрипты ip-up и ip-down с ipset для Accel-ppp

Приведу пример скриптов которые я раньше использовал, в список allowip добавлялись IP адреса которым разрешен интернет, а в denyip которые переадресовывались на http страницу с информацией о негативном депозите.

Скрипт ip-up:

#!/bin/sh
# ip-up
IFNAME=$1
IP=$5
AWK=/usr/bin/awk
DEBUG=0

if [ -f /var/run/radattr.$IFNAME ]; then
  FILTERS=`${AWK}  '/Filter-Id/ {print $2}'  /var/run/radattr.${IFNAME}`
fi;

if [ w${FILTERS} = wNEG_DEPOSIT ] ; then
   /sbin/ipset add denyip $IP -exist
  if [ w${DEBUG} != w ] ; then
    echo "$(date '+%Y/%m/%d %H:%M') --- UP neg filter User: ${USER_NAME} Filter: ${FILTERS} IF: ${IFNAME} IP: $IP" >> /tmp/neg
  fi;
  exit;

else
  if [ "${DEBUG}" != "" ] ; then
    echo "$(date '+%Y/%m/%d %H:%M') --- UP User: ${USER_NAME} Filter: ${FILTERS} IF: ${IFNAME} IP: $IP" >> /tmp/allow
  fi;

  /sbin/ipset add allowip $IP -exist
fi;

Скрипт ip-down:

#!/bin/sh
# ip-down
IFNAME=$1
IP=$5
AWK=/usr/bin/awk
DEBUG=0

if [ -f /var/run/radattr.$IFNAME ]; then
   FILTERS=`${AWK}  '/Filter-Id/ {print $2}'  /var/run/radattr.$IFNAME`
   USER_NAME=`${AWK}  '/User-Name/ {print $2}'  /var/run/radattr.${IFNAME}`
fi;

# Filters
if [ w${FILTERS} = wNEG_DEPOSIT ] ; then
    /sbin/ipset del denyip $IP -exist
   if [ w${DEBUG} != w ] ; then
     echo "$(date '+%Y/%m/%d %H:%M') --- Down neg filter User: ${USER_NAME} Filter: ${FILTERS} IF: ${IFNAME} IP: $IP" >> /tmp/neg
   fi;
   exit;
else
  if [ "${DEBUG}" != "" ] ; then
    echo "$(date '+%Y/%m/%d %H:%M') --- DOWN User: ${USER_NAME} Filter: ${FILTERS} IF: ${IFNAME} IP: $IP" >> /tmp/allow
  fi;

  /sbin/ipset del allowip $IP -exist
fi;

Соответственно должны быть созданы списки:

/sbin/ipset -N allowip iphash
/sbin/ipset -N denyip iphash

И iptables правила.
Разрешаем FORWARD для allowip:

/sbin/iptables -A FORWARD -m set --match-set allowip src -j ACCEPT
/sbin/iptables -A FORWARD -m set --match-set allowip dst -j ACCEPT

NAT:

/sbin/iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 11.11.11.1 --persistent

Для denyip настраиваем переадресацию всех http запросов, разрешаем FORWARD к странице на которую выполняется переадресация и запрещаем FORWARD по умолчанию для всего остального:

/sbin/iptables -t nat -A PREROUTING -p tcp -m multiport --dport 80 -m set --match-set denyip src -j DNAT --to-destination 11.11.11.1:80
/sbin/iptables -A FORWARD -s 11.11.11.1 -j ACCEPT
/sbin/iptables -A FORWARD -d 11.11.11.1 -j ACCEPT
/sbin/iptables -P FORWARD DROP

Перед ipset командой можно также добавить проверку на существование списка, но чем проще скрипты, тем лучше производительность:

allownet=`/sbin/ipset -L |grep allowip |sed 's/ //'|awk -F: '{ print $2 }'`
if [ "${allownet}" = "" ]; then
/sbin/ipset -N allowip iphash
fi;

Замечу что при дублирующихся сессиях, будут пропадать IP из списков, так как в списке не может быть одинаковых адресов, а если например есть две дублирующиеся сессии и одна из них завершается, то соответственно и IP будет уделен из списка, соответственно если вторая сессия останется онлайн, то уже без IP в списке.
Поэтому можно отказаться от ipset allowip настроив ip-unnumbered, а в ipset denyip добавлять адреса через L4-redirect и вовсе отказаться от этих скриптов, ну и решить проблему с дублирующимися IP если она есть.

Смотрите также мои статьи:
Скрипт добавления IP адресов из файла в ipset
Сборка и установка accel-ppp

Скрипт добавления IP адресов из файла в ipset

Понадобилось однажды написать скрипт чтобы добавить в ipset все IP для которых били подняты сессии на сервере доступа, использовался биллинг Abills, поэтому я решил взять IP адреса из MySQL таблицы биллинга.

Первым делом создадим тестовый ipset:

ipset create test iphash

Создадим файл скрипта:

nano iplist.sh

Добавим в него содержимое:

mysql -u root -e "SELECT INET_NTOA(framed_ip_address) FROM abills.internet_online WHERE (status=1 or status>=3) AND guest=0;" -s -N > iplist.txt
iplist_data=$(cat iplist.txt)
for row_data in $iplist_data; do ipset -exist add test ${row_data}; done
rm iplist.txt

Выполняем скрипт и проверяем:

chmod +x iplist.sh
./iplist.sh
ipset list test | wc -l
ipset -L

Смотрите также мою статью — Скрипты ip-up и ip-down с ipset для Accel-ppp

Скрипт перезагрузки маршрутизаторов Asus

На старых прошивках маршрутизаторов Asus часто замечал, что не полностью открывается веб-интерфейс, отображается не все меню, соответственно настроить его невозможно и при удаленном доступе перезагрузить тоже нельзя, так как не отображается кнопка перезагрузки.
Поэтому взял маршрутизатор Asus RT-N12E, запустил сниффер Wireshark, открыл веб-интерфейс маршрутизатора и нажал кнопку перезагрузки.
В перехваченных пакетах было видно что для перезагрузки выполняется файл Reboot.asp в корневой директории.

Отсюда получился такой скрипт для перезагрузки маршрутизаторов Asus:

#!/bin/sh
ROUTER_IP="192.168.1.1"
USERNAME="admin"
PASSWORD="admin"

# exit if router is down
ping -q -c 1 "$ROUTER_IP" > /dev/null || exit

curl --basic --user "$USERNAME:$PASSWORD" -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" --refer "http://$ROUTER_IP" "$ROUTER_IP/Reboot.asp"

Содержимое скрипта поместим в новый файл, например используя редактор nano («CTRL+X» для выходя и «y» для сохранения изменений):

nano file.sh

Сделаем его исполняемым:

chmod 777 file.sh

После этого выполним:

./file.sh

Также можно в браузере вручную открыть ссылку http://192.168.1.1/Reboot.asp если необходимо один раз перезагрузить маршрутизатор.

Скрипт проверки на пустую директорию

Недавно заметил на одном из своих скриптов резервного копирования что он перестал работать и просто создавал пустую директорию с текущей датой, поэтому возникла идея добавить в него проверку на пустую директорию с отправкой уведомления на email.

Пример скрипта проверки на пустую директорию, с учетом скрытых файлов:

if [ `ls -a /backups/dir/ | grep -v "^\.$" | grep -v "^\..$" | wc -l` = "0" ]; then echo "Empty dir"; else echo "Non empty dir"; fi

Пример проверки директории с именем текущей даты и если она пуста — отправкой email:

if [ `ls -a /backups/`date +%Y-%m-%d`/ | grep -v "^\.$" | grep -v "^\..$" | wc -l` = "0" ]; then (echo "Subject:Empty dir"; echo "Empty dir";) | sendmail info@example.com; else echo "Non empty dir"; fi

Резервное копирование конфигурации TP-Link коммутаторов

Набросал скрипт для резервного копирования конфигурации TP-Link коммутаторов.
Скрипт выполняется на Linux где запущен TFTP сервер, он подключается по telnet к коммутатору и специальной командой конфигурация отправляется на указанный TFTP, по закрытию telnet соединения, файл перемещается в нужную директорию, а также последняя команда удаляет файлы которым больше 30 дней, так как больше их хранить мне не нужно.
Также можно ежемесячно делать например копию всех файлов в облако.
Как видно, перед вводом пароля в скрипте ставить паузу нельзя.

#!/bin/bash
{
echo "ПАРОЛЬ";
echo "enable";
echo "ПАРОЛЬ";
echo "copy startup-config tftp ip-address 192.168.0.5 filename tplink";
sleep 2;
echo "exit";
sleep 1;
echo "exit";
} | telnet 192.168.0.110

mv /srv/tftp/tplink.cfg /backups/devices/tplink/`date +%Y-%m-%d`_tplink.cfg
find /backups/devices/tplink/ -type f -mtime +30 -exec rm {} \;

PHP скрипт «ТОП должников АСРМ «Ника»»

Приведу пример PHP кода отображающего список должников из базы данных АСРМ «Ника»:

<?php
// данные доступа к базе данных
$db_host="192.168.1.1";
$db_user="user";
$db_password="password";
$db_name = "base";
$table_name = "abon";

// соединение с БД
mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error());
mysql_query("SET NAMES 'utf8'");

// запрос
$query = 'SELECT * FROM `'.$table_name.'` WHERE `depozit`<0 ORDER BY `depozit` ASC LIMIT 100;';
$sql = mysql_query($query);

// обрабатываем полученный результат
// количество
$num_rows = mysql_num_rows($sql);
echo $num_rows.' должников показано:<br />';

// выводим данные
while ($sql_data = mysql_fetch_array($sql)) {
    echo '<table cellpadding="5" cellspacing="3" border="0"><tr><td>';
    echo '<tr><td>'.$sql_data['depozit'].'</td><td>'.$sql_data['id'].'</td><td>'.$sql_data['first_name'].'</td><td>'.$sql_data['second_name'].'</td></tr>';
    echo '</tr></td></table>';
}
?>

Смотрите также:
Простое кеширование страниц

Скрипт конфигурации DHCP

Допустим в конфигурационный файл DHCP сервера нужно добавить много подсетей, например от 172.16.1.0 до 172.16.100.0, в этом случае поможет данный скрипт.
Скачать можно отсюда.

Скрипт необходимо сделать выполняемым и запустить из linux:

chmod 755 script_dhcp_conf.php
./script_dhcp_conf.php

Результат скопировать в буфер обмена и вставить в файл конфигурации DHCP (в putty копирование выполняется комбинацией клавиш Ctrl+Ins).

Пример скрипта:

#!/usr/bin/php

<?php

for($i=1; $i<=100; $i++)
{
print
("
subnet 172.16.$i.0 netmask 255.255.255.0 {
       option routers 172.16.$i.1;
       option domain-name-servers  8.8.8.8, 8.8.4.4;
       option subnet-mask 255.255.255.0;
       default-lease-time 86400;
       max-lease-time 86400;
       next-server 172.16.$i.1;

{#172.16.$i.2-254#}
}
");
}

?>

Резервное копирование конфигурации Cisco Catalyst 6500

Для теста набросал скрипт автоматического резервного копирования конфигурации Cisco Catalyst 6509-E.

Собственно сам скрипт:

#!/bin/bash
# Backup CISCO config
(
sleep 5
echo "user"
sleep 4
echo "password"
sleep 4
echo "copy running-config tftp:"
sleep 2
echo "192.168.1.4"
sleep 2
echo "cisco.cfg"
sleep 6

echo "exit"
) | telnet 192.168.1.5
mv /srv/tftp/cisco.cfg /backups/devices/cisco/`date +%Y-%m-%d`_cisco.cfg

find /backups/devices/cisco/ -type f -mtime +30 -exec rm {} \;

Содержимое скрипта добавим например в файл backup_cisco.sh и добавим его в cron, добавив указанную ниже строку в файл /etc/crontab:

0 2 * * * root /backups/scripts/backup_cisco.sh > /dev/null 2>&1

Файл можно открыть например в текстовом редакторе nano (Ctrl+X для выхода, y/n для сохранения или отмены изменений):

sudo nano /etc/crontab

Скрипт выполняет подключение по telnet к 192.168.1.5 и копирует конфигурацию на tftp сервер 192.168.1.4, потом файл перемещается в удобную директорию для хранения.
Последняя строчка в скрипте удаляет файлы старее 30 дней.
Как запустить tftp сервер смотрите в моих статьях: Установка и настройка TFTP сервера в Ubuntu или Запуск TFTP сервера на Windows.
Смотрите также: Использование и настройка CRON.

Скрипт архивирования файлов за прошлый месяц

Понадобилось как-то написать скрипт который должен был каждого первого числа архивировать из одной папки только файлы с датой прошлого месяца, помещать архив в отдельную директорию и удалять файлы которые архивировались.

Вот собственно сам скрипт:

zip -rm -tt $(date +%Y-%m-01) -t $(date +%Y-%m-01 -d 'last month') "/srv/samba/archive/$(date +%Y-%m-%d)" /srv/samba/dir/

Пример добавления в /etc/crontab для автоматического запуска каждого первого числа месяца в 9 часов 30 минут:

30 9 1 * * root /backups/scripts/ktb/zip_checks.sh > /dev/null 2>&1

Скрипт резервного копирования конфигурации DOCSIS ARRIS Cadant C3 CMTS

Собственно вот мой скрипт:

#!/bin/bash
# Backup DOCSIS CADANTS config
(
sleep 5
echo "user"
sleep 5
echo "password"
sleep 5
echo "enable"
sleep 2
echo "password"
sleep 2
echo "copy startup-configuration tftp://192.168.0.1/cadant1.xml"
sleep 5
echo "exit"
) | telnet 192.168.0.50
mv /srv/tftp/cadant1.xml /backups/devices/docsis/`date +%Y-%m-%d`_cadant1.xml

Где 192.168.0.50 — cadant, 192.168.0.1 — tftp сервер.

Вы можете добавить скрипт в /etc/crontab для автоматического выполнения (например, каждый день в час ночи):

0 1 * * * root /path/to/script/backup_cadants.sh > /dev/null 2>&1