|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Sergey Korolew 2:6053/1.2 19 May 2004 01:14:08 To : All Subject : Простенькая антиспуффинговая система -------------------------------------------------------------------------------- Отдаю недавно сделанный скрипт. Работает как ip-up и ip-down для mpd и ppp. Основные задачи: добавление/удаление антиспуффинговых правил для туннельных интерфейсов и работа с ddns. Исторически сложилось, что vpn у нас работает на mpd, а модемные линки на ppp. Соответствующие vpn-пользователи заносятся в зону vpn.int, а модемные - в dialup.int, различение идет по названию интерфейса. Что еще сказать.. получение ip-адреса для ddns-delete производится через вызов host, потому что нет желания патчить mpd для выдачи бОльшего числа параметров для ip-down скрипта. По количеству параметров же определяется, вызвали нас для up или down. Правила вставляются следующие: ipfw add $RULE skipto $SKIPTO ip from $IPADDR to any in recv $IFACE ipfw add $RULE skipto $SKIPTO ip from any to $IPADDR out xmit $IFACE ipfw add $RULE deny ip from any to any via $IFACE В данном примере $RULE=1000 для ng-интерфейсов (1000 - ng0, 1001 - ng1 итд) и 1500 для tun-интерфейсов. $SKIPTO=2000. Использование в mpd.conf: set iface up-script /usr/local/sbin/ddns set iface down-script /usr/local/sbin/ddns Использование в ppp.linkup: метка: !bg /usr/local/sbin/ddns INTERFACE inet MYADDR HISADDR USER И в ppp.linkdown: метка: !bg /usr/local/sbin/ddns INTERFACE inet USER Сам скрипт (завернувшиеся строки я обозначил \ ): #!/bin/sh # add arguments # $1 - interface name # $2 - "inet" # $3 - local-ip # $4 - remote-ip # $5 - authname # # delete arguments # $1 - interface name # $2 - "inet" # $3 - authname KEY="/etc/namedb/Kint.+165+63294.private" SERVER="127.0.0.1" ZONE="vpn.int" RULE="1000" SKIPTO="2000" LOGFILE="/var/log/nsupdate.log" IF_NAME=${1%%[0-9]*} RULE=$(($RULE+${1##*[^0-9]})) if [ "$IF_NAME" = "tun" ]; then RULE=$(($RULE+500)) ZONE="dialup.int" fi /sbin/ipfw -q delete $RULE >/dev/null HOSTNAME=$5 if [ "x$HOSTNAME" = "x" ]; then HOSTNAME=$3 REVIP=`/usr/bin/host $HOSTNAME.$ZONE | /usr/bin/awk '{if ($3 == "address") \ {split ($4,ip,"."); print ip[3] "." ip[2] "." ip[1]}}'`.in-addr.arpa. ( echo "$(date) Running $0-delete with arguments \"$*\"" cat <<EOF | /usr/bin/nsupdate -k $KEY server $SERVER update delete $HOSTNAME.$ZONE. send update delete $REVIP send EOF RC=$? if [ $RC != 0 ]; then echo "$(date) Updating $HOSTNAME.$ZONE failed. (RC=$RC)" else echo fi ) >>$LOGFILE 2>&1 else IPADDR=$4 /sbin/ipfw -q add $RULE skipto $SKIPTO ip from $IPADDR to any in recv $1 /sbin/ipfw -q add $RULE skipto $SKIPTO ip from any to $IPADDR out xmit $1 /sbin/ipfw -q add $RULE deny ip from any to any via $1 REVIP=`echo $IPADDR | /usr/bin/awk 'split($1,ip,".") {print ip[4] "." ip[3] \ "." ip[2] "." ip[1]}'`.in-addr.arpa. ( echo "$(date) Running $0-add with arguments \"$*\"" cat <<EOF | /usr/bin/nsupdate -k $KEY server $SERVER update delete $HOSTNAME.$ZONE. update add $HOSTNAME.$ZONE. 60 A $IPADDR send update delete $REVIP update add $REVIP 60 PTR $HOSTNAME.$ZONE. send EOF RC=$? if [ $RC != 0 ]; then echo "$(date) Updating $HOSTNAME.$ZONE failed. (RC=$RC)" else echo fi ) >>$LOGFILE 2>&1 fi exit $RC Всего наилучшего, Sergey aka DS --- GoldED+/W32 snapshot-2001.03.04 * Origin: Hету. Придумывать лень. (2:6053/1.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/222040aa8061.html, оценка из 5, голосов 10
|