Child pages
  • Network Firewall - IPTABLES
Skip to end of metadata
Go to start of metadata

NAT

SSH Time-locks

XTABLES

Инфа по IPTABLES:

iptables -L
Iptables -L --line-numbers  # посмотреть правила с нумерацией строк

3 цепочки IPTABLES:

INPUT - входящий траффик

FORWARD - транзитный траффик

OUTPUT - исходящий траффик

Установка базовой политики IPTABLES (POLICY):

Политика - это базовое правило по умолчанию, которое работает, если других правил нет.

iptables INPUT -P ACCEPT # разрешить весь входящий траффик
iptables INPUT -P DROP # запретить весь входящий траффик
iptables OUTPUT -P ACCEPT  # разрешить весь исходящий траффик
iptables FORWARD -P DROP  # запретить весь транзитный траффик

Удаление правил в IPTABLES - FLUSH:

Если в политике входящих/исходящих пакетов не прописано ALLOW, сервер вышибет из SSH сессии после этой команды.

iptables -F # убить вообще все правила, кроме базовых политик

Добавление (APPEND) правил в IPTABLES:

По интерфейсам:

iptables -A INPUT -i lo -j ACCEPT # разрешить пакеты на входе в loopback интерфейс
iptables -A INPUT -i eth0 -j ACCEPT # разрешить пакеты на входе eth0
iptables -A INPUT -i ppp0 -j ACCEPT # разрешить пакеты на входе по модемному соединению

По статусу пакетов:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 
подгрузить модуль (-m) инспекции пакетов, разрешить пакеты на вход лишь 
со статусами ESTABLISHED и RELATED из уже установленных сессий. К новым 
пакетам (статус NEW) правило не применяется.

По портам:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT # разрешить порт SSH, dport = "destination port", sport = "source port"
iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT # разрешить группу TCP портов с 6881 по 6890

По IP адресам, подсетям, MAC-адресам:

iptables -A INPUT -s 192.168.0.4 -j ACCEPT # разрешить пакеты с одного IP
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT  # разрешить пакеты из подсети
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT # разрешить пакеты из подсети
iptables -A INPUT -s 192.168.0.4 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT # фильтр по IP и по MAC

Комбинирование правил:

iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT # разрешить SSH только с выбранной подсети IP

Удаление правил:

iptables -D <chain-name> <line-number> | <rule>  # 
удалить правило с цепочке по номеру строки или правилу (правило должно 
четко соответствовать существующему)

Применение и сохранение правил в IPTABLES (CentOS):

sudo ./sbin/service iptables save

Применение и сохранение правил в IPTABLES (Ubuntu Server):

apt-get install iptables-persistent
iptables-save > /etc/iptables/rules


NAT

Активация NAT в RHEL:

By default, the IPv4 policy in Red Hat Enterprise Linux kernels disables support for IP forwarding, which prevents boxes running Red Hat Enterprise Linux from functioning as dedicated edge routers. To enable IP forwarding, run the following command:

sysctl -w net.ipv4.ip_forward=1

To make permanent change, edit file /etc/sysctl.conf

net.ipv4.ip_forward = 0

# Execute the following command to enable the change to the sysctl.conf file:
sysctl -p /etc/sysctl.conf

Удаление таблиц NAT:

iptables -t nat -F

Переадресация привилегированного root-порта (<1024) на менее защищенный порт (local PAT):

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8090

Активация NAT для выпуска систем с приватным IP адресом наружу в публичные адреса (MASQUERADE NAT):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Активация входного NAT для доступа к HTTP веб-серверу на локальном IP 192.168.1.10 извне (DESTINATION NAT):

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.10:80

Если политика по умолчанию для цепи FORWARD блокирует пакеты (DROP), для работы входного NAT нужно добавить разрешающее правило:

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 192.168.1.10 -j ACCEPT

Пример NAT с фильтрацией

 

#$SERVER: 192.168.0.2
#$SOURCE: 172.16.0.1

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination $SERVER:8080
iptables -A FORWARD -i eth0 -o eth1 -p tcp -s $SOURCE --dport 8080 -m state --state NEW -j ACCEPT
 

Маршрутизация пакетов из внутренней сети на сервера в DMZ (например, из внутренней сети 192.168.1.0/24 в DMZ-сеть 10.0.0.0/8 на конкретный HTTP web-server):

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.4.2:80

Посмотреть таблицу правил NAT:

iptables -t nat -L
iptables -t nat -L  -n -v | grep 'something'
iptables -t nat -L -n -v

Утилита netstat-nat

Утилита требует установки.

# To display all NAT connections, type:
netstat-nat -n
# To display SNAT connections, type:
netstat-nat -S
# To display DNAT connections, type:
netstat-nat -D

SSH time-lock tricks

You can use different iptables parameters to limit connections to the SSH service for specific time periods. You can use the /second, /minute, /hour, or /day switch in any of the following examples.

In the first example, if a user enters the wrong password, access to the SSH service is blocked for one minute, and the user gets only one login try per minute from that moment on:
iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP

In a second example, iptables are set to allow only host 193.180.177.13 to connect to the SSH service. After three failed login tries, iptables allows the host only one login try per minute:
iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP

SSLH - SSH/HTTP Multiplexor: http://www.rutschle.net/tech/sslh.shtml

SSH via UDP with session saving: http://mosh.mit.edu/

ICMP time-lock tricks
10 pings a minute is good and safe; a limit-burst of 20 is generous, and not enough to knock the server down:
iptables -A INPUT -p ICMP --icmp-type echo-request -m limit --limit 10/minute --limit-burst 20 -j ACCEPT

Mangle таблица

Служит для изменения типа услуг (Type of Service) и изменения TTL в заголовках пакетов. Для увеличения TTL на 5:

iptables -t mangle -A PREROUTING -j TTL --ttl-inc 5

Провайдеры отслеживают наличие подсети или множества подсетей с множеством систем в домашней сети, замеряя TTL исходящих пакетов (TTL из одного источника разные - значит много подсетей). Либо провайдеры ограничивают входящие TTL=1, чтобы пакеты не проходили более 1 марщрутизатора. Команда выше борется с этим.

Web-Server config

#!/bin/bash
#####################################################################

# 1) Clear old Rules
iptables -F                                                 # Delete all existing rules

# 2) Default Drop
iptables -P INPUT DROP                                            # Set default chain policies to DROP
iptables -P FORWARD DROP                                        # Set default chain policies to DROP
iptables -P OUTPUT DROP                                            # Set default chain policies to DROP

# 3) Loopback                                                     
iptables -A INPUT -i lo -j ACCEPT                                    # Allow loopback access from INPUT
iptables -A OUTPUT -o lo -j ACCEPT                                    # Allow loopback access from Output

# 4) BLACKLIST IP's
# iptables -A INPUT -s "BLOCK_THIS_IP" -j DROP                                # Block a specific ip-address
# iptables -A INPUT -s "BLOCK_THIS_IP" -j DROP                                # Block a specific ip-address
# iptables -A INPUT -s "BLOCK_THIS_IP" -j DROP                                # Block a specific ip-address
# iptables -A INPUT -s "BLOCK_THIS_IP" -j DROP                                # Block a specific ip-address

# 5) WHITELIST IP's
iptables -A INPUT -s 127.0.0.1/32 -j ACCEPT                                # Allow Anything from localhost     
iptables -A INPUT -s "ALLOW_THIS_IP"/32 -j ACCEPT                                # Allow Anything from KeyServer


# 6) ALLOWED SERVICES
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT            # PORT 25   SMTP   - Allow connections to outbound
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT                            # PORT 54   DNS    - Allow connections to outbound
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT            # PORT 80   httpd  - Allow connections from anywhere
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT        # PORT 80   httpd  - Rate Limit from outside
iptables -A INPUT -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT            # PORT 443  SSL    - Allow connections from anywhere
iptables -A INPUT -p tcp -m tcp --dport 2082 -m state --state NEW,ESTABLISHED -j ACCEPT            # PORT 2082 cPanel - Allow connections to outbound
iptables -A INPUT -p tcp -m tcp --dport 2083 -m state --state NEW,ESTABLISHED -j ACCEPT            # PORT 2083 cPanel - Allow connections to outbound
iptables -A INPUT -p tcp -m tcp --dport 2086 -m state --state NEW,ESTABLISHED -j ACCEPT            # PORT 2086 WHM    - Allow connections to outbound
iptables -A INPUT -p tcp -m tcp --dport 2087 -m state --state NEW,ESTABLISHED -j ACCEPT            # PORT 2087 WHM    - Allow connections to outbound

# 7) PING
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP                # Drop Ping from address-mask-request
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP                    # Drop Ping from timestamp-request
iptables -A INPUT -p icmp -m icmp -m limit --limit 1/second -j ACCEPT                     # Rate Limit Ping from outside

# 8) Validate packets
iptables -A INPUT   -m state --state INVALID -j DROP                            # Drop invalid packets
iptables -A FORWARD -m state --state INVALID -j DROP                            # Drop invalid packets
iptables -A OUTPUT  -m state --state INVALID -j DROP                            # Drop invalid packets
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP                    # Drop TCP - SYN,FIN packets
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP                    # Drop TCP - SYN,RST packets

# 9) Reject Invalid networks (Spoof)
iptables -A INPUT -s 10.0.0.0/8       -j DROP                                # (Spoofed network)
iptables -a INPUT -s 192.0.0.1/24     -j DROP                                # (Spoofed network)
iptables -A INPUT -s 169.254.0.0/16   -j DROP                                # (Spoofed network)
iptables -A INPUT -s 172.16.0.0/12    -j DROP                                # (Spoofed network)
iptables -A INPUT -s 224.0.0.0/4      -j DROP                                # (Spoofed network)
iptables -A INPUT -d 224.0.0.0/4      -j DROP                                # (Spoofed network)
iptables -A INPUT -s 240.0.0.0/5      -j DROP                                # (Spoofed network)
iptables -A INPUT -d 240.0.0.0/5      -j DROP                                # (Spoofed network)
iptables -A INPUT -s 0.0.0.0/8        -j DROP                                # (Spoofed network)
iptables -A INPUT -d 0.0.0.0/8        -j DROP                                # (Spoofed network)
iptables -A INPUT -d 239.255.255.0/24 -j DROP                                # (Spoofed network)
iptables -A INPUT -d 255.255.255.255  -j DROP                                # (Spoofed network)


# 10) CHAINS

# FTP_BRUTE CHAIN
iptables -A INPUT -p tcp -m multiport --dports 20,21 -m state --state NEW -m recent --set --name FTP_BRUTE
iptables -A INPUT -p tcp -m multiport --dports 20,21 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name FTP_BRUTE -j DROP

# SYNFLOOD CHAIN
iptables -A INPUT -m state --state NEW -p tcp -m tcp --syn -m recent --name SYNFLOOD--set                        
iptables -A INPUT -m state --state NEW -p tcp -m tcp --syn -m recent --name SYNFLOOD --update --seconds 1 --hitcount 60 -j DROP

# Logging CHAIN
iptables -N LOGGING                                                # Create `LOGGING` chain for logging denied packets
iptables -A INPUT -j LOGGING                                            # Create `LOGGING` chain for logging denied packets     
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 6    # Log denied packets to /var/log/messages
iptables -A LOGGING -j DROP                                            # Drop everything

Pasted from <http://www.linux.org/article/view/base-iptables-rules-that-will-apply-to-virtually-any-web-server>

Ubuntu/Debian saving iptables

Edit current iptables rules then save by using tool iptables-save (needs iptables-persistent packet to be installed):

iptables-save > /etc/iptables/rules.v4

Or directly edit file /etc/iptables/rules.v4 .

 

XTables-Addons

xt_geoip - geo firewall

xt_ipp2p - p2p traffic filter

xt_pknock - port knocking

xt_lscan - port scann detect

Installation (in Debian)

Для работы xtables-addons достаточно наличия ядра версии >=2.6.17 и iptables >= 1.4.3 (впрочем, в случае использования ipset 5 требования становятся несколько более жесткими — версия ядра не менее 2.6.35, дополнительно требуется библиотека libmnl).

sudo aptitude install module-assistant xtables-addons-source linux-headers-`uname -r`
sudo module-assistant prepare
sudo module-assistant auto-install xtables-addons-source
sudo depmod -a

Installation of GeoIP

 sudo aptitude install libtext-csv-xs-perl unzip
wget http://sourceforge.net/projects/xtables-addons/files/Xtables-addons/1.28/xtables-addons-1.28.tar.xz
tar vfx xtables-addons-1.28.tar.xz 
cd xtables-addons-1.28/geoip/

#Сборка geoip:
./geoip_download.sh 
mkdir -p /usr/share/xt_geoip/LE 
./geoip_build_db.pl -D /usr/share/xt_geoip/LE < GeoIPCountryWhois.csv

sudo modprobe xt_geoip
echo "xt_geoip" >> /etc/modules

Installation (in Ubuntu 12.04)

sudo apt-get install xtables-addons-dkms
#ipset:
sudo apt-get install ipset 

Compiling (in CentOS 6)

При установке нам надо помнить, что для ядра >= 3.7 надо использовать xtables версии 2.x. Для < 3.7 надо использовать xtables версии 1.x.

Смотрим версию ядра:

$ uname -r 2.6.32-358.2.1.el6.i686

Версия соответствует xtables версии 1.x. Переходим сюда и скачиваем дистрибутив xtables

Устанавливаем зависимости сборки:

yum -y install gcc gcc-c++ make automake unzip zip xz kernel-devel-`uname -r` iptables-devel 

Подключаем репозиторий rpm-forge:

rpm -i http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm  

Устанавливаем ещё одну зависимость:

yum -y install perl-Text-CSV_XS

Распаковываем и переходим в директорию с исходниками, делаем сборку:

tar xvf xtables-addons-1.47.1.tar.xz 
cd xtables-addons-1.47.1
./configure 
make 
make install

При установке на CentOS OpenVZ нужно скачать заголовки ядра Linuxe Headers и Linux Devel (vzkernel-devel) пакеты:

http://download.openvz.org/kernel/branches/rhel6-2.6.32/042stab094.7/

В случае ошибок с IPv6:

В /lib/modules/2.6.32-431.el6.x86_64/build/include/linux/autoconf.h
закомментировать #define CONFIG_IP6_NF_IPTABLES_MODULE 1

 

Сборка GeoIP

./xt_geoip_dl 
mkdir -p /usr/share/xt_geoip 
./xt_geoip_build GeoIPCountryWhois.csv 
cp -r {BE,LE} /usr/share/xt_geoip/

XT_PKNOCK

iptables -A INPUT -p tcp -m pknock --knockports 4002,31200,2190 --strict --name SSH --time 30 --autoclose 5 --dport 22 -j ACCEPT

--knockports - список портов, на которые стучаться

--strict - нужна точная последовательность портов, как указано

--name - присвоение имени данному правилу, через которое в /proc/net/xt_pknock можно посмотреть инфу о попытках knocking

--time 30 - ограничение времени в секундах между постукиваниями

--autoclose 5 - закрывает порт через 5 минут

 

Access can be made using hping2 for WIN or hping3 NIX utility:

sudo hping3 -c 1 -S 192.168.1.1 -p 4002
sudo hping3 -c 1 -S 192.168.1.1 -p 31200
sudo hping3 -c 1 -S 192.168.1.1 -p 2190

1 packet with SYN bit is sent to target ports. This opens SSH for 5 minutes.

XT_GEOIP

Блокировка стран - Италия, Германия:

sudo iptables -I INPUT -m geoip --src-cc IT -j DROP
sudo iptables -I INPUT -m geoip -p tcp --dport 4111 --src-cc DE -j DROP
#Забаним на сервере весь трафик от/до хостов, которые расположены не в Германии, Украине или России:
iptables -I INPUT ! -i lo -m geoip ! --src-cc DE,UA,RU -j DROP
#Тоже самое, но только для 80го порта, с доступом только из России:
iptables -I INPUT -p tcp --dport 80 ! -i lo -m geoip ! --src-cc RU -j DROP
#Забаним китай:
iptables -I INPUT ! -i lo -m geoip --src-cc CN -j DROP

XT_TIME

Учет времени и даты в iptables:

sudo iptables -A INPUT -m tcp -p tcp --dport 80 -s 192.168.0.2 -m time --timestart 9:00 --timestop 19:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

Источники

http://blogs.hub21.ru/blog/sysadmins/173.html