YAIS (Yet Another IPFW Script)

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
lazhu
сержант
Сообщения: 209
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

YAIS (Yet Another IPFW Script)

Непрочитанное сообщение lazhu » 2013-11-13 10:09:21

Их уже тьма тьмущая, но вопросов от этого меньше не становится.
Так что может кому и пригодится.
L2TP, таблицы, ядреный нат, прозрачный сквид, openvpn

Код: Выделить всё

#!/bin/sh

# Firewall command
fwcmd='/sbin/ipfw -q'

# Network interfaces
int_if="bge0" # Internal
ext_if="re0" # External (ISP network)
l2tp_if="ng0" # L2TP/PPTP (Internet)
vpn_if="tun0" # OpenVPN

# L2TP/PPTP IP address
l2tp_ip=`ifconfig ${l2tp_if} | awk '$1=="inet"{print $2}'`

# Netbios ports
netbios="81,137,138,139"

# Tables
nonroute="table(0)" # Nonroutable networks
squid="table(1)" # Squid users

# Flush all rules and tables
${fwcmd} flush
${fwcmd} table all flush

# Populate tables
for file in /etc/ipfw_*; do
        table=`echo ${file} | awk -F '_' '{print $2}'`
        for ip in `grep "^[0-9]" ${file}`; do
                case ${table} in
                        nonroute)
                                ${fwcmd} table 0 add ${ip};;
                        squid)
                                ${fwcmd} table 1 add ${ip};;
                esac
        done
done

# Allow all on loopback
${fwcmd} add allow ip from any to any via lo0

# Transparent squid
${fwcmd} add fwd 127.0.0.1,3129 tcp from ${squid} to not me 80 in recv ${int_if}

# Allow all on local and OpenVPN networks
${fwcmd} add allow all from any to any via ${int_if}
${fwcmd} add allow all from any to any via ${vpn_if}

# Deny nonroutable networks and netbios incoming traffic on internet interface
${fwcmd} add deny ip from any to ${nonroute} in recv ${l2tp_if}
${fwcmd} add deny ip from ${nonroute} to any in recv ${l2tp_if}
${fwcmd} add deny ip from any ${netbios} to any in recv ${l2tp_if}

# Deny fragmented and broadcasted icmp packets
${fwcmd} add deny icmp from any to any frag
${fwcmd} add deny icmp from any to 255.255.255.255 via ${l2tp_if}

# NAT on external interface (ISP network)
${fwcmd} nat 1 config log if ${ext_if} reset same_ports deny_in
${fwcmd} add nat 1 ip from any to any via ${ext_if}

# NAT on L2TP/PPTP interface (Internet)
${fwcmd} nat 2 config log if ${l2tp_if} reset same_ports deny_in\
 redirect_port udp ${l2tp_ip}:1194 1194\ # Local OpenVPN server
 redirect_port tcp ${l2tp_ip}:80 80\ # Local Web server
${fwcmd} add nat 2 ip from any to any via ${l2tp_if}

# Default deny
${fwcmd} add deny log all from any to any

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35182
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: YAIS (Yet Another IPFW Script)

Непрочитанное сообщение Alex Keda » 2014-01-30 22:42:25

у меня круче есть - оно ещё само порты которые банить надо определяет по именам файлов =)
--
на хостинге юзаю, чтоб автопилоты тупо IP скидывали в файлы, а файрволл на старте сам разбирался из какого файла какой порт надо побанить

Код: Выделить всё

#!/bin/sh

# path
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
# бинариник файрволла
FwCMD="/sbin/ipfw -q"
# директория где живём
basedir="/root/scripts/ipfw"
# файлы локальных таблиц
basedir_local="/root/scripts/db"

# ограничиваем полосу
IdIn="1"
IdOut="2"
IdMail="3"
IdUDP="4"
LanLocal="91.227.16.0/22,77.73.24.0/21" # our lan, gptel lan
BwIn="70"       # 70 Mbit
BwOut="80"      # 80 Mbit
BwMail="64"     # bit/s
BwUDP="1"

# tmp file
tmp="/tmp/$$"

# файлы таблиц
table_list="`ls $basedir | grep table`"
table_list_local="`ls $basedir_local | grep table`"

# список портов
port_list="`ls $basedir | grep table | awk -F '.' '{print $2}'`"
port_list_local="`ls $basedir_local | grep table | awk -F '.' '{print $2}'`"

#echo $table_list


# отключаем файрволл
#${FwCMD} disable firewall

# сбрасываем все правила
${FwCMD} -f flush
# сбрасываем все pipe
${FwCMD} -f pipe flush
# сбрасываем очереди
${FwCMD} -f queue flush

# разрешаем ходить самому на себя
${FwCMD} add allow all from me to me

# Запрещаем заблокированным хостам указанные порты - глобально
for port in $port_list
do
        # строим временный файл для загрузки парвил
        echo -n > $tmp.$port.global
        for ip in `cat $basedir/table.$port.txt | grep -v ^# | grep -v ^\$ | sort | uniq`
        do
                echo "table $port add $ip" >> $tmp.$port.global
        done
        # очищаем таблицу
        ${FwCMD} table $port flush
        # добавляем правило в файрволл
        ${FwCMD} add drop ip from "table($port)" to me $port
        # заполняем таблицу из временного файла
        ${FwCMD} $tmp.$port.global &
done

# Запрещаем заблокированным хостам указанные порты - локально
for port in $port_list_local
do
        # добавляем правило в файрволл - если такой таблицы нет локально
        if test -f $basedir/table.$port.txt
        then
                # есть
        else
                ${FwCMD} table $port flush
                ${FwCMD} add drop ip from "table($port)" to me $port
        fi
        # строим временный файл для загрузки прaвил
        echo -n > $tmp.$port.local
        for ip in `cat $basedir_local/table.$port.txt | grep -v ^# | grep -v ^\$ | sort | uniq`
        do
                echo "table $port add $ip" >> $tmp.$port.local
        done
        # заполняем таблицу из временного файла
        ${FwCMD} $tmp.$port.local &
done


# Запрет X-сканирования:
${FwCMD} add reject log tcp from any to any tcpflags fin, syn, rst, psh, ack, urg
# Запрет N-сканирования:
${FwCMD} add reject log tcp from any to any tcpflags !fin, !syn, !rst, !psh, !ack, !urg
# Запрет FIN-сканирования:
${FwCMD} add reject log tcp from any to any not established tcpflags fin
# Защита от спуфинга
${FwCMD} add drop log ip from any to any not verrevpath in

# прикрываем memcached снаружи
${FwCMD} add drop tcp from not me to me 11211
${FwCMD} add drop udp from not me to me 11211

# запрещаем доступ к неоторым адресам/сетям
if test -f $basedir_local/ipfw.drop.from.me.txt
then
        ${FwCMD} table 1 flush
        for ip in `cat $basedir_local/ipfw.drop.from.me.txt | grep -v ^# | grep -v ^\$ | sort | uniq`
        do
                ${FwCMD} table 1 add $ip
        done
        ${FwCMD} add drop ip from me to "table(1)"
fi

# named странно себя ведёт. создаёт большой трафф на другие сервера.
#${FwCMD} add drop log udp from me to not 91.227.16.10,91.227.17.11 dst-port 53 uid bind

# ограничиваем полосу
if [ `hostname -s` != "bkp0" ]
then

        ${FwCMD} pipe $IdIn config bw ${BwIn}Mbit/s
        ${FwCMD} pipe $IdOut config bw ${BwOut}Mbit/s
        ${FwCMD} pipe $IdMail config bw ${BwMail}bit/s
        ${FwCMD} pipe $IdUDP config bw ${BwUDP}Mbit/s

        ${FwCMD} add pipe $IdOut ip from me to not $LanLocal
        ${FwCMD} add pipe $IdUDP udp from not $LanLocal to me
        ${FwCMD} add pipe $IdIn ip from not $LanLocal to me
        ${FwCMD} add pipe $IdMail tcp from me to not me 25 not uid mailnull
fi

# Ограничиваем кол-во подключений с одного IP
# FTP
${FwCMD} add allow tcp from not me to me 21 setup limit src-addr 16
# просто разрешаем подключения на 80 порт. проблемы числа коннектов 
# придётся переложить на nginx - пока, больше проблем от ограничения на
# число динамических правил...
${FwCMD} add allow tcp from not me to me 80 #setup limit src-addr 32
# SSL
${FwCMD} add allow tcp from not me to me 443 setup limit src-addr 16
# apache
${FwCMD} add allow tcp from not me to me 8080 setup limit src-addr 1


# limit all ports
${FwCMD} add allow tcp from any to me setup limit src-addr 32
# ограничиваем число одновременных соединений наружу с сервера на 25 порт других
# серверов, для всех кроме юзера mailnull
if [ "`hostname -s`" != "bkp0" ]
then
        ${FwCMD} add allow log logamount 100000 tcp from me to not me 25 not uid mailnull setup limit src-addr 1
fi
#else
#       # unlimit connects to mysql
#       ${FwCMD} add allow tcp from any to me not 3306 setup limit src-addr 32
#       ${FwCMD} add allow tcp from any to me 3306 setup limit src-addr 50
#fi

# added by lissyara 2009-10-04 in 01:44
${FwCMD} add allow tcp from any to any
${FwCMD} add allow udp from any to any
${FwCMD} add allow all from any to any

# включаем файрволл
${FwCMD} enable firewall
/sbin/sysctl net.inet.ip.fw.enable=1

# удаляем врменный файл
sleep 5 && rm -f $tmp.* &
# удаляем кору, если она есть
rm -f ipfw.core
но это так, на посмотреть.
такие вещщи пишутся индивидуально
Убей их всех! Бог потом рассортирует...