|
|
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
|