"Огненная стена" или строим файрвол на базе iptables
[root@homerouter root]# rpm -qa | grep iptablesЕсли пакет не установлен, то установите его:
iptables-1.2.6a-1.asp
[root@homerouter root]# rpm -ihv iptables-version.rpmЕсли у поставщика дистрибутива или сторонних производителей имеется более свежая версия пакета, то обновите его:
[root@homerouter root]# rpm -Uhv iptables-version.rpmПри этом может потребоваться установка пакетов, удовлетворяющих зависимости, например, пакетов, содержащих исходные коды ядра.
[root@homerouter src]# bzip2 -d linux-version.tar.bz2
[root@homerouter src]# tar xpf linux-version.tar.bz2
[root@homerouter iptables]# bzip2 -d patch-o-matic-20031219.tar.bz2перейдите во вновь созданный каталог:
[root@homerouter iptables]# tar xpvf patch-o-matic-20031219.tar
[root@homerouter iptables]# cd patch-o-maticи запустите сценарий runme, сообщив ему где находятся исходные коды ядра и какую категорию патчей вы желаете использовать, например:
[root@homerouter patch-o-matic]# KERNEL_DIR=/usr/src/linux-2.4.25 ./runme pendingдалее в рамках диалога вам будет предложено протестировать применимость, установить или пропустить установку всех патчей из выбранной ранее категории (процесс напоминает конфигурирование исходных кодов ядра при использовании make config).
[root@homerouter iptables]# bzip2 -d iptables-1.2.9.tar.bz2Перейдите во вновь созданный каталог:
[root@homerouter iptables]# tar xpvf iptables-1.2.9.tar
[root@homerouter iptables]# cd iptables-1.2.9Откомпилируйте и проинсталируйте iptables/netfilter, создайте и сохраните список проинсталлированных файлов:
[root@homerouter iptables-1.2.9]# make KERNEL_DIR=/usr/src/linux-2.4.25 BINDIR=/sbin LIBDIR=/lib/ MANDIR=/usr/share/man/
[root@homerouter iptables-1.2.9]# find /* > ../iptables1
[root@homerouter iptables-1.2.9]# make KERNEL_DIR=/usr/src/linux-2.4.25 BINDIR=/sbin LIBDIR=/lib/ MANDIR=/usr/share/man/ install
[root@homerouter iptables-1.2.9]# find /* > ../iptables2
[root@homerouter iptables-1.2.9]# cd ..
[root@homerouter iptables]# diff iptables1 iptables2 > iptables.installed.YYYY.MM.YY
[root@homerouter iptables]# chmod 700 /etc/init.d/iptables
[root@homerouter iptables]# chown root.root /etc/init.d/iptables
[root@homerouter iptables]# chkconfig --add iptables
IPT="/sbin/iptables" IPTS="/sbin/iptables-save" IPTR="/sbin/iptables-restore" EXTERNAL_INTERFACE="eth0" # интерефейс подключенный к интеренету LOOPBACK_INTERFACE='lo' # интерфейс обратной петли IP_ADDR="213.87.X.X" # IP-адрес вашего компьютера ANYWHERE="any/0" # произвольный IP-адрес MY_ISP="my.isp.address.range" # диапазон IP-адресов провайдера LOOPBACK="127.0.0.0/8" # диапазон IP-адресов обратной петли CLASS_A="10.0.0.0/8" # адреса класса А, предназначенные для # внутреннего использования CLASS_B="172.16.00/22" # адреса класса B, предназначенные для # внутреннего использования CLASS_C="192.168.0.0/16"# адреса класса C, предназначенные для # внутреннего использования CLASS_D="244.0.0.0/4" # адреса класса А, предназначенные для # группового вещания CLASS_E="240.0.0.0/5" # зарезервированные адреса класса Е BROADCAST_SRC="0.0.0.0" # исходный широковещательный BROADCAST_DST="255.255.255.255"# целевой широковешательные PRIVPORTS="0:1023" # номера привелегированных портов UNPRIPORTS="1024:65535" # номера непривелегированных портов
# Сбрасываеим все правила $IPT -P INPUT ACCEPT $IPT -P FORWARD ACCEPT $IPT -P OUTPUT ACCEPT $IPT -t nat -P PREROUTING ACCEPT $IPT -t nat -P POSTROUTING ACCEPT $IPT -t nat -P OUTPUT ACCEPT $IPT -t mangle -P PREROUTING ACCEPT $IPT -t mangle -P OUTPUT ACCEPT # Удаление правил $IPT -F $IPT -t nat -F $IPT -t mangle -F # Очищаем нестандартные правила $IPT -X $IPT -t nat -X $IPT -t mangle -X
$IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT DROP $IPT -A INPUT -p ALL -i $LOOPBACK_INTERFACE -j ACCEPT $IPT -A OUTPUT -p ALL -o $LOOPBACK_INTERFACE -j ACCEPT
$IPT -N bad_packets $IPT -N bad_tcp_packets $IPT -N icmp_packets $IPT -N udp_inbound $IPT -N udp_outbound $IPT -N tcp_inbound $IPT -N tcp_outbound
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "fp=bad_tcp_packets:1 a=DROP " $IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP # All good, so return $IPT -A bad_tcp_packets -p tcp -j RETURNping - наводнение
$IPT -A icmp_packets --fragment -p ICMP -j LOG --log-prefix "fp=icmp_packets:1 a=DROP " $IPT -A icmp_packets --fragment -p ICMP -j DROPUDP - наводнение
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 113 -j REJECT $IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT $IPT -A udp_inbound -p UDP -j RETURN $IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPTICMP - перенаправление
$IPT -A icmp_packets --fragment -p ICMP -j LOG --log-prefix "fp=icmp_packets:1 a=DROP " $IPT -A icmp_packets --fragment -p ICMP -j DROP # Echo - uncomment to allow your system to be pinged. # Uncomment the LOG command if you also want to log PING attempts # # $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG --log-prefix "fp=icmp_packets:2 a=ACCEPT " # $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT # Time Exceeded $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT # Not matched, so return so it will be logged $IPT -A icmp_packets -p ICMP -j RETURN
iptables - t nat - A POSTROUTING - p tcp - o eth0 - j SNAT -- to- source 194.236.50.155-194.236.50.160:1024-32000Ключ -- to- source используется для указания адреса, который присваивается пакету. Все просто, вы указываете IP адрес, который будет подставлен в заголовок пакета в качестве исходящего. Если вы собираетесь перераспределять нагрузку между несколькими брандмауэрами, то можно указать диапазон адресов, где начальный и конечный адреса диапазона разделяются дефисом, например: 194.236.50.155-194.236.50.160. Тогда, конкретный IP адрес будет выбираться из диапазона случайным образом для каждого нового потока. Дополнительно можно указать диапазон портов, которые будут использоваться только для нужд SNAT. Все исходящие порты будут после этого перекартироваться в заданный диапазон. Если диапазон портов не задан, то исходные порты ниже 512 перекартируются в диапазоне 0-511, порты в диапазоне 512-1023 перекартируются в диапазоне 512-1023, и, наконец порты из диапазона 1024-65535 перекартируются в диапазоне 1024-65535. Что касается портов назначения, то они не подвергаются перекартированию.
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000Ключ --to-ports используется для указания порта источника или диапазона портов исходящего пакета. Можно указать один порт, например: --to-ports 1025, или диапазон портов как здесь: --to-ports 1024-3000. Этот ключ можно использовать только в правилах, где критерий содержит явное указание на протокол TCP или UDP с помощью ключа -- protocol.
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10>Ключ -- to - destination указывает, какой IP адрес должен быть подставлен в качестве адреса места назначения. В выше приведенном примере во всех пакетах, пришедших на адрес 15.45.23.67, адрес назначения будет изменен на один из диапазона от 192.168.1.1 до 192.168.1.10. Как уже указывалось выше, все пакеты из одного потока будут направляться на один и тот же адрес, а для каждого нового потока будет выбираться один из адресов в указанном диапазоне случайным образом. Можно также определить единственный IP адрес. Можно дополнительно указать порт или диапазон портов, на который (которые) будет перенаправлен траффик. Для этого после ip адреса через двоеточие укажите порт, например --to-destination 192.168.1.1:80, а указание диапазона портов выглядит так: --to-destination 192.168.1.1:80-100. Указание портов допускается только при работе с протоколом TCP или UDP, при наличии опции --protocol в критерии.
iptables -t nat -A PREROUTING --dst $INET_IP -p tcp --dport 80 -j DNAT --to-destination $HTTP_IPВ соответствии с этим правилом, все пакеты, поступающие на 80-й порт адреса $INET_IP перенаправляются на наш внутренний WEB-сервер. Если теперь обратиться к WEB-серверу из Интернет, то все будет работать прекрасно. Но что же произойдет, если попробовать соединиться с ним из локальной сети? Соединение просто не установится. Давайте посмотрим как маршрутизируются пакеты, идущие из Интернет на наш WEB-сервер. Для простоты изложения примем адрес клиента в Интернет равным $EXT_BOX.
iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT --to-source $LAN_IPТак как цепочка POSTROUTING обрабатывается самой последней и к этому моменту пакет уже прошел процедуру преобразования DNAT, поэтому критерий строится на базе адреса назначения $HTTP_IP.
iptables -t nat -A OUTPUT --dst $INET_IP -p tcp --dport 80 -j DNAT --to-destination $HTTP_IP
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080Ключ --to-ports определяет порт или диапазон портов назначения. Без указания ключа --to-ports, перенаправления не происходит, т.е. пакет идет на тот порт, куда и был назначен. В примере, приведенном выше, --to-ports 8080 указан один порт назначения. Если нужно указать диапазон портов, то мы должны написать нечто подобное --to-ports 8080-8090. Этот ключ можно использовать только в правилах, где критерий содержит явное указание на протокол TCP или UDP с помощью ключа --protocol.
#!/bin/sh # # Invoked from /etc/rc.d/init.d/iptables. # chkconfig: - 60 95 # description: Starts and stops the IPTABLES packet filter # used to provide firewall network services. # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. if [ ${NETWORKING} = "no" ] then exit 0 fi if [ ! -x /sbin/iptables ]; then exit 0 fi # See how we were called. case "$1" in start) echo -n "Starting Firewalling: " # ------------------------------------------------------------ ---------------- # Some definitions for easy maintenance. # EDIT THESE TO SUIT YOUR SYSTEM AND ISP. IPADDR="192.168.XXX.XXX" EXTERNAL_INTERFACE="eth0" # Infoline connected interface INTERNET_INTERFACE="ppp+" # Internet interface up when pptp up LOOPBACK_INTERFACE="lo" # Your local naming convention PRIMARY_NAMESERVER="194.135.60.3" # Your Primary Name Server SECONDARY_NAMESERVER="194.135.61.3" # Your Secondary Name Server Internal Server SMTP_SERVER="195.2.72.152" # Your Central Mail Hub Server LOOPBACK="127.0.0.0/8" # Reserved loopback addr range CLASS_A="10.0.0.0/8" # Class A private networks CLASS_B="172.16.0.0/12" # Class B private networks CLASS_C="192.168.0.0/16" # Class C private networks CLASS_D_MULTICAST="224.0.0.0/4" # Class D multicast addr CLASS_E_RESERVED_NET="240.0.0.0/5" # Class E reserved addr BROADCAST_SRC="0.0.0.0" # Broadcast source addr BROADCAST_DEST="255.255.255.255" # Broadcast destination addr PRIVPORTS="0:1023" # Privileged port range UNPRIVPORTS="1024:65535" # Unprivileged port range # ------------------------------------------------------------ ---------------- # The SSH client starts at 1023 and works down to 513 for each # additional simultaneous connection originating from a privileged port. # Clients can optionally be configured to use only unprivileged ports. SSH_LOCAL_PORTS="1022:65535" # Port range for local clients SSH_REMOTE_PORTS="513:65535" # Port range for remote clients # traceroute usually uses -S 32769:65535 -D 33434:33523 TRACEROUTE_SRC_PORTS="32769:65535" TRACEROUTE_DEST_PORTS="33434:33523" # ------------------------------------------------------------ ---------------- # Default policy is DENY # Explicitly accept desired INCOMING & OUTGOING connections # Remove all existing rules belonging to this filter iptables -F # Remove any existing user-defined chains. iptables -X # Set the default policy of the filter to deny. iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # ------------------------------------------------------------ ---------------- # LOOPBACK # -------- # Unlimited traffic on the loopback interface. iptables -A INPUT -i $LOOPBACK_INTERFACE -j ACCEPT iptables -A OUTPUT -o $LOOPBACK_INTERFACE -j ACCEPT # ------------------------------------------------------------ ---------------- # ------------------------------------------------------------ ---------------- #Для VPN iptables -A INPUT -p 47 -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT iptables -A OUTPUT -p TCP --dport 1723 -o eth0 -j ACCEPT iptables -A OUTPUT -p 47 -o eth0 -j ACCEPT # ------------------------------------------------------------ ---------------- # Network Ghouls # Deny access to jerks # -------------------- # /etc/rc.d/rc.firewall.blocked contains a list of # iptables -A INPUT -i $EXTERNAL_INTERFACE -s address -j DROP # rules to block from any access. # Refuse any connection from problem sites if [ -f /etc/rc.d/rc.firewall.blocked ]; then deny_file="/etc/rc.d/rc.firewall.blocked" temp_file="/tmp/temp.ip.addresses" cat $deny_file | sed -n -e "s/^[ ]*\([0-9.]*\).*$/\1/p" | awk ' $1 ' > $temp_file while read ip_addy do case $ip_addy in *) iptables -A INPUT -i $EXTERNAL_INTERFACE -s $ip_addy -j DROP iptables -A INPUT -i $EXTERNAL_INTERFACE -d $ip_addy -j DROP iptables -A OUTPUT -o $EXTERNAL_INTERFACE -s $ip_addy -j REJECT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -d $ip_addy -j REJECT ;; esac done < $temp_file rm -f $temp_file > /dev/null 2>&1 unset temp_file unset deny_file fi # ------------------------------------------------------------ ---------------- # SPOOFING & BAD ADDRESSES # Refuse spoofed packets. # Ignore blatantly illegal source addresses. # Protect yourself from sending to bad addresses. # Refuse incoming packets pretending to be from the external address. iptables -A INPUT -s $IPADDR -j DROP # Refuse incoming packets claiming to be from a Class A, B or C private network iptables -A INPUT -s $CLASS_A -j DROP iptables -A INPUT -s $CLASS_B -j DROP #iptables -A INPUT -s $CLASS_C -j DROP # Refuse broadcast address SOURCE packets iptables -A INPUT -s $BROADCAST_DEST -j DROP iptables -A INPUT -d $BROADCAST_SRC -j DROP # Refuse Class D multicast addresses # Multicast is illegal as a source address. # Multicast uses UDP. iptables -A INPUT -s $CLASS_D_MULTICAST -j DROP # Refuse Class E reserved IP addresses iptables -A INPUT -s $CLASS_E_RESERVED_NET -j DROP # Refuse special addresses defined as reserved by the IANA. # Note: The remaining reserved addresses are not included # filtering them causes problems as reserved blocks are # being allocated more often now. The following are based on # reservations as listed by IANA as of 2001/01/04. Please regularly # check at http://www.iana.org/ for the latest status. # Note: this list includes the loopback, multicast, & reserved addresses. # 0.*.*.* - Can't be blocked for DHCP users. # 127.*.*.* - LoopBack # 169.254.*.* - Link Local Networks # 192.0.2.* - TEST-NET # 224-255.*.*.* - Classes D & E, plus unallocated. iptables -A INPUT -s 0.0.0.0/8 -j DROP iptables -A INPUT -s 127.0.0.0/8 -j DROP iptables -A INPUT -s 169.254.0.0/16 -j DROP iptables -A INPUT -s 192.0.2.0/24 -j DROP iptables -A INPUT -s 224.0.0.0/3 -j DROP # ------------------------------------------------------------ ---------------- # UDP TRACEROUTE # -------------- # Traceroute usually uses -S 32769:65535 -D 33434:33523 iptables -A INPUT -i $INTERNET_INTERFACE -p udp --source-port $TRACEROUTE_SRC_PORTS --destination-port $TRACEROUTE_DEST_PORTS -j DROP iptables -A OUTPUT -o $INTERNET_INTERFACE -p udp --source-port $TRACEROUTE_SRC_PORTS --destination-port $TRACEROUTE_DEST_PORTS -j ACCEPT #Для локалки iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --source-port $TRACEROUTE_SRC_PORTS -d $IPADDR --destination-port $TRACEROUTE_DEST_PORTS -j DROP iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port $TRACEROUTE_SRC_PORTS --destination-port $TRACEROUTE_DEST_PORTS -j ACCEPT # ------------------------------------------------------------ ---------------- # DNS forward-only nameserver (53) # -------------------------------- iptables -A INPUT -i $INTERNET_INTERFACE -p udp -s $PRIMARY_NAMESERVER --source-port 53 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p udp --source-port $UNPRIVPORTS -d $PRIMARY_NAMESERVER --destination-port 53 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn -s $PRIMARY_NAMESERVER --source-port 53 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $PRIMARY_NAMESERVER --destination-port 53 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p udp -s $SECONDARY_NAMESERVER --source-port 53 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p udp --source-port $UNPRIVPORTS -d $SECONDARY_NAMESERVER --destination-port 53 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn -s $SECONDARY_NAMESERVER --source-port 53 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $SECONDARY_NAMESERVER --destination-port 53 -j ACCEPT # ------------------------------------------------------------ ------ # HTTP server (80) # ---------------- #iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 80 -j ACCEPT #iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 80 --destination-port $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------ ------ # HTTPS server (443) # ------------------ #iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 443 -j ACCEPT #iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 443 --destination-port $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------ # MySQL server (3306) # ------------------- # iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 3306 -j ACCEPT # iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 3306 --destination-port $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------ # SSH server (22) # --------------- #iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $SSH_REMOTE_PORTS -d $IPADDR --destination-port 22 -j ACCEPT #iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 22 --destination-port $SSH_REMOTE_PORTS -j ACCEPT # SSH client (22) # --------------- iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $SSH_LOCAL_PORTS --destination-port 22 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 22 --destination-port $SSH_LOCAL_PORTS -j ACCEPT #Для внутренней сетки iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 22 -d $IPADDR --destination-port $SSH_LOCAL_PORTS -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $SSH_LOCAL_PORTS --destination-port 22 -j ACCEPT # ------------------------------------------------------------ ------ # IMAP server (143) # ----------------- # iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 143 -j ACCEPT # iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 143 --destination-port $UNPRIVPORTS -j ACCEPT # IMAP client (143) # ----------------- # iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 143 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT # iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 143 -j ACCEPT # ------------------------------------------------------------ ------ # SMTP client (25) # ---------------- iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 25 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 25 -j ACCEPT # ------------------------------------------------------------ ------ # POP client (110) # ---------------- iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 110 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 110 -j ACCEPT # ------------------------------------------------------------ ------ # HTTP client (80) # ---------------- iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 80 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 80 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 8083 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 8083 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 8080 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 8080 -j ACCEPT #Для внутренней сетки # ---------------- iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 80 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 80 -j ACCEPT # ------------------------------------------------------------ ------ # ------------------------------------------------------------ ------ # HTTPS client (443) # ---------------- iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 443 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 443 -j ACCEPT # ------------------------------------------------------------ ------ # IRC client (6667) # ----------------- iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 6667 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 6667 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------ ------ # IRC client (6667) Для внутренней сетки # ----------------- iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 6667 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 6667 -j ACCEPT iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------ ------ # ------------------------------------------------------------ ------ # FTP server (21) # --------------- # incoming request #iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 21 -j ACCEPT #iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 21 --destination-port $UNPRIVPORTS -j ACCEPT # PORT MODE data channel responses #iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 20 --destination-port $UNPRIVPORTS -j ACCEPT #iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port $UNPRIVPORTS -d $IPADDR --destination-port 20 -j ACCEPT # PASSIVE MODE data channel responses #iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT #iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port $UNPRIVPORTS --destination-port $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------ ------ # SYSLOG client (514) # ------------------- # iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port 514 -d $SYSLOG_SERVER --destination-port $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------ ------ # FTP client (21) # --------------- # outgoing request iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp --source-port $UNPRIVPORTS --destination-port 21 -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p tcp ! --syn --source-port 21 --destination-port $UNPRIVPORTS -j ACCEPT # PORT mode data channel iptables -A INPUT -i $INTERNET_INTERFACE -p tcp --source-port 20 --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p tcp ! --syn --source-port $UNPRIVPORTS --destination-port 20 -j ACCEPT # --------------- #Для внутренней сетки # outgoing request iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 21 -j ACCEPT iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 21 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT # PORT mode data channel iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port 20 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port $UNPRIVPORTS --destination-port 20 -j ACCEPT # ------------------------------------------------------------ # ICMP # -------------------- # To prevent denial of service attacks based on ICMP bombs, filter # incoming Redirect (5) and outgoing Destination Unreachable (3). # Note, however, disabling Destination Unreachable (3) is not # advisable, as it is used to negotiate packet fragment size. # For bi-directional ping. # Message Types: Echo_Reply (0), Echo_Request (8) # To prevent attacks, limit the src addresses to your ISP range. # # For outgoing traceroute. # Message Types: INCOMING Dest_Unreachable (3), Time_Exceeded (11) # default UDP base: 33434 to base+nhops-1 # # For incoming traceroute. # Message Types: OUTGOING Dest_Unreachable (3), Time_Exceeded (11) # To block this, deny OUTGOING 3 and 11 # 0: echo-reply (pong) # 3: destination-unreachable, port-unreachable, fragmentation-needed, etc. # 4: source-quench # 5: redirect # 8: echo-request (ping) # 11: time-exceeded # 12: parameter-problem iptables -A INPUT -i $INTERNET_INTERFACE -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p icmp --icmp-type source-quench -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A INPUT -i $INTERNET_INTERFACE -p icmp --icmp-type parameter-problem -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p icmp --icmp-type fragmentation-needed -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p icmp --icmp-type source-quench -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -o $INTERNET_INTERFACE -p icmp --icmp-type parameter-problem -j ACCEPT # ------------------------------------------------------------ ---------------- #Для внутренней сетки iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type echo-reply -d $IPADDR -j ACCEPT iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type destination-unreachable -d $IPADDR -j ACCEPT iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type source-quench -d $IPADDR -j ACCEPT iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type time-exceeded -d $IPADDR -j ACCEPT iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type parameter-problem -d $IPADDR -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type fragmentation-needed -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type source-quench -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type parameter-problem -j ACCEPT # ------------------------------------------------------------ ---------------- # Enable logging for selected denied packets iptables -A INPUT -i $INTERNET_INTERFACE -p tcp -j DROP iptables -A INPUT -i $INTERNET_INTERFACE -p udp --destination-port $PRIVPORTS -j DROP iptables -A INPUT -i $INTERNET_INTERFACE -p udp --destination-port $UNPRIVPORTS -j DROP iptables -A INPUT -i $INTERNET_INTERFACE -p icmp --icmp-type 5 -j DROP iptables -A INPUT -i $INTERNET_INTERFACE -p icmp --icmp-type 13/255 -j DROP iptables -A OUTPUT -o $INTERNET_INTERFACE -j REJECT #Для локальной сети iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -j DROP iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --destination-port $PRIVPORTS -j DROP iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --destination-port $UNPRIVPORTS -j DROP iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 5 -j DROP iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 13/255 -j DROP iptables -A OUTPUT -o $EXTERNAL_INTERFACE -j REJECT # ------------------------------------------------------------ ---------------- ;; stop) echo -n "Shutting Firewalling: " # Remove all existing rules belonging to this filter iptables -F # Delete all user-defined chain to this filter iptables -X # Reset the default policy of the filter to accept. iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; status) status iptables ;; restart|reload) $0 stop $0 start ;; *) echo "Usage: iptables {start|stop|status|restart|reload}" exit 1 esac echo "done" exit 0