1

IPTABLES — руководство: часть 1 — основы IPTABLES

IPTABLES — руководство: часть 2 — управление IPTABLES

IPTABLES — руководство: часть 4 — цели для правил

Содержание:

Ниже приведены параметры, которые могут использованы при создании правил и примеры с ними.

Основные параметры правил

-p, --protocol

— правило сработает для протокола; имя протокола должно быть указано явно, в видеTCP, UDP или ICMP, и должно присутствовать в файле

/etc/protocols

Примеры:

iptables -A INPUT -p tcp
-s, --src, --source

— фильтр по исходному (source — источник) адресу; можно указать как один адрес — так и подсеть; при установленном флаге ! перед указанием фильтра — значение будет инвертировано (обратное значение: —source адрес является >  —source ! адрес не является);

Примеры:

iptables -A INPUT -s 192.168.1.1
iptables -A INPUT -s ! 192.168.1.1
-d, --dst, --destination  - фильтр по адресу назначения (destination - назначение); остальные правила аналогичны --source

Пример:

iptables -A INPUT -d 192.168.1.1
-i, --in-interface

— правило для входящего трафика на указанном интерфейсе; используется только в цепочках INPUT, FORWAR и PREROUTING; допустимо использовать маски, например + — для всех интерфейсов, или eth+ — для всех интерфейсов eth0, eth1  и т.д.; допустимо использование инвертации;

Примеры:

iptables -A INPUT -i eth0
iptables -A INPUT -i eth+
iptables -A INPUT -i ! eth0
-o, --out-interface

— правило для исходящего трафика на указанном интерфейсе; остальные правила аналогичны

--in-interface

Параметры правил TCP

--sport, --source-port

— правило для порта-источника; если не указан порт — сработает для всех портов; можно указывать имя сервиса, либо порт в виде цифр; при указании имени сервиса — оно должно присутствовать в файле

/etc/services

использование портов вместо имён сервисов уменьшит нагрузку и ускорит обработку; допустимо указать диапазон портов, например 80:1024 — для всех портов от 80 до 1024 включительно, либо :80 — для всех портов от 0 до 80 включительно; допустимо инвертирование значения (!);

Примеры:

iptables -A INPUT -p tcp --sport 22
iptables -A INPUT -p tcp --sport ssh
iptables -A INPUT -p tcp --sport 80:1024
iptables -A INPUT -p tcp --sport :80
iptables -A INPUT -p tcp --sport ! 80
--dport, --destination-port

— правило для порта назначения; остальные правила аналогичны

--source-port

Примеры:

iptables -A INPUT -p tcp --dport 22
--tcp-flags

— правило сработает при наличии TCP-флагов;

Пример:

iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

Параметры правил UDP

--sport, --source-port

— аналогично

--source-port

TCP

--dport, --destination-port

  — аналогично

--destination-port

TCP

Параметры правил ICMP

iptables -A INPUT -p icmp --icmp-type 8
--icmp-type

— проверяет соответствие типа ICMP — пакета;,

Дополнительные модули и параметры

Перечислю только наиболее интересные и используемые.

Модули подключаются с помощью опции

-m

.

Addrtype — фильтрация на основе типа адреса.

--src-type

— фильтр на основе типа адреса источника; можно указать один или несколько типов, разделив их запятой; допустимо инвертирование значения (!);

Примеры:

iptables -A INPUT -m addrtype --src-type UNICAST
iptables -A INPUT -m addrtype --src-type ! UNICAST
iptables -A INPUT -m addrtype --src-type MULTICAST, BROADCAST

—dst-type — то же самое, но для адреса получателя пакета;

Модуль Comment — добавление своего комментария к фильтру.

--comment

— добавление своего комментария к фильтру; максимальное значение — 256 символов;

Пример:

iptables -A INPUT -m comment --comment "This is comment"

Модуль Connmark — действие на основе метки, установленной действием

CONNMARK

или

MARK --set-mark

(действия смотрите в следующей части).

--mark

— фильтр на основе наличия указанной метки;

Примеры

iptables -A INPUT -m connmark --mark 12 -j ACCEPT

Модуль IP range — расширенный аналог

--source

и

--destination

. Позволяет указывать даиапазонIP.

--src-range

— диапазон IP источников; в отличии от

--source

и

--destination

позволяет указать диапазон между двумя конкретными адресами, а не подсетью; допустимо инвертирование (!);

Пример:

iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.13-192.168.2.19
--dst-range

— аналогично

--src-range

, но для адресов назначения;

Модуль Length — фильтрация по длине пакета.

--length

— допустимо указание диапазона размеров, например 1400:1500; допустимо инвертирование значения;

Примеры:

iptables -A INPUT -p tcp -m length --length 1400
iptables -A INPUT -p tcp -m length --length 1400:1500

Модуль Limit — ограничение количества пакетов в единицу времени. Хорошо описан тут>>>.

--limit

— средняя скорость заполнения «счётчика»; это же значение учитывается для уменьшения счётчика в

--limit-burst

указывается в виде число пакетов/время, где время указывается в виде /second /minute /hour /day; по-умолчанию 3 пакета в час, или 3/hour; использование инвертирования невозможно;

Пример:

iptables -A INPUT -m limit --limit 3/hour
--limit-burst

— максимальное значение счётчика для срабатывания правила;  каждый раз, когда значение 

--limit

превышается — счётчик увеличивается на единицу, пока не достигнет

--limit-burst

, после чего срабатывает правило, в котором используется

--limit-burst

Пример:

iptables -A INPUT -m limit --limit-burst 5

Модуль Mac — фильтрация по MAC (Ethernet Media Access Control).

--mac-source

MAC-адрес источника; допустимо использование инвертирования (!); используется только в цеочках P

REROUTING, FORWARD

и

INPUT

Примеры

iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

Модуль Mark — фильтр на основе метки (действия 

CONNMARK

 и

MARK

см. в следующем посте).

--mark 

— метка, установленная

MARK

Пример:

iptables -t mangle -A INPUT -m mark --mark 1

Модуль Multiport — фильтр по нескольким портам. В отличии от

--sport

  допускает использование нескольких независимых портов, а не диапазона.

--source-port

— список портов источника; максимум 15 значений, разделённых запятыми; должен использоваться только с

-p tcp

или

-p udp

Пример:

iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
--destination-port

— аналогично

--source-port

, но для портов назначения;

Пример:

iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
--port

— аналогично для обоих значений

--source-port

  и

--destination-port

, для обоих направлений; сработает только в случае, если порт источника и порт назначения идентичны;

Пример:

iptables -A INPUT -p tcp -m multiport --port 22,53,80,110

Модуль Owner — фильтры на основе владельца пакета.

--cmd-owner

— фильтр по имени сервиса, который сгенерировал пакет; допустимо использование инвертации с помощью(!);

Пример:

iptables -A OUTPUT -m owner --cmd-owner httpd
--uid-owner

 — фильтр по UID (User ID) пользователя, который сгенерировал пакет;

Пример:

iptables -A OUTPUT -m owner --uid-owner 500
--gid-owner

— аналогично, но для GID (Group ID);

Пример:

iptables -A OUTPUT -m owner --gid-owner 0
 --pid-owner

— аналогично, но для PID (Process ID);

Пример:

iptables -A OUTPUT -m owner --pid-owner 78
--sid-owner

— аналогично, но для SID (Service ID);

Пример:

iptables -A OUTPUT -m owner --sid-owner 100

Модуль Packet type — фильтры на основе типа адресации пакета.

--pkt-type

— допустимо использование  unicast , broadcast или multicast типов; допустим использование инвертации;

Пример:

iptables -A OUTPUT -m pkttype --pkt-type unicast

Модуль State — фильтры на основе состояния соединения.

--state

— указывает состояние пакета в соединении; могут быть использованы четыре тип состояния —INVALID, ESTABLISHED, NEW и RELATED. INVALID означает, что пакет ассоциируется с неизвестным стримом или соединением и может содержать некорретные данные или заголовки. ESTABLISHED — пакет принадлежит к уже установленному в обоих направлениях соединению и полностью валиден. NEW — пакет устанавливает или будет устанавливать новое соединение, или пакет соединения,у которого ещё не было передачи данных в обоих направлениях; RELATED — пакет, который устанавливает новое соединение, которое ассциировано с уже установленным соединением (пример — пассивный режим FTP, или ошибкаICMP, связанная с каким-то TCP или UDP соединением );

Пример:

iptables -A INPUT -m state --state RELATED,ESTABLISHED

В последнее время особую популярность обретают различные «облачные» сервисы, в том числе резервное копирование. В интернете можно найти десяток сайтов представляющих подобные услуги, в том числе на платной основе.

Рассмотрим настройку автоматического бекапа веб-сервера с помощью архиватора 7z и сервиса Dropbox в Debian/Ubuntu Linux.

Создадим непривилегированного пользователя из-под которого будет запущен клиент Dropbox.

root@localhost:~$ useradd backupus

Далее в соответсвии с официальной вики устанавливаем консольного клиента, для созданного ранее пользователя

backupus@localhost:~$ cd ~/
backupus@localhost:~$ wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86
backupus@localhost:~$ tar -zxof dropbox.tar.gz

Запускаем клиента

backupus@localhost:~$ ~/.dropbox-dist/dropboxd

Через несколько секунд в консоле появится ссылка для привязки данного компьютера к вашему аккаунту.

Изменяем каталог за которым следит демон Dropbox на «/backup»:

backupus@localhost:~$ cp ~/.dropbox/dropbox.db dropbox.db.backup
backupus@localhost:~$ wget http://dl.dropbox.com/u/119154/permalink/dropboxdir.py
backupus@localhost:~$ chmod +x dropboxdir.py
backupus@localhost:~$ mv ~/Dropbox /backup
backupus@localhost:~$ ./dropboxdir.py --setfolder=/backup

Добавим скрипт автозапуска /etc/init.d/dropbox

# dropbox service
DROPBOX_USERS="backupus"
 
DAEMON=.dropbox-dist/dropbox
 
start() {
    echo "Starting dropbox..."
    for dbuser in $DROPBOX_USERS; do
        HOMEDIR=`getent passwd $dbuser | cut -d: -f6`
        if [ -x $HOMEDIR/$DAEMON ]; then
            HOME="$HOMEDIR" start-stop-daemon -b -o -c $dbuser -S -u $dbuser -x $HOMEDIR/$DAEMON
        fi
    done
}
 
stop() {
    echo "Stopping dropbox..."
    for dbuser in $DROPBOX_USERS; do
        HOMEDIR=`getent passwd $dbuser | cut -d: -f6`
        if [ -x $HOMEDIR/$DAEMON ]; then
            start-stop-daemon -o -c $dbuser -K -u $dbuser -x $HOMEDIR/$DAEMON
        fi
    done
}
 
status() {
    for dbuser in $DROPBOX_USERS; do
        dbpid=`pgrep -u $dbuser dropbox`
        if [ -z $dbpid ] ; then
            echo "dropboxd for USER $dbuser: not running."
        else
            echo "dropboxd for USER $dbuser: running (pid $dbpid)"
        fi
    done
}
 
 
case "$1" in
  start)
    start
    ;;
 
  stop)
    stop
    ;;
 
  restart|reload|force-reload)
    stop
    start
    ;;
 
  status)
    status
    ;;
 
  *)
    echo "Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}"
    exit 1
 
esac
 
exit 0

Делаем исполняемым, разрешаем запуск при загрузке и запускаем:

root@localhost:~$ chmod +x /etc/init.d/dropbox
root@localhost:~$ update-rc.d dropbox defaults
root@localhost:~$ /etc/init.d/dropbox start

Синхронизация файлов с онлайн-хранилищем работает, перейдем непосредственно к бекапу:

#!/bin/sh
 
DATE=`/bin/date +%Y%m%d`
BACKUP_DIR="/backup/${DATE}"
 
SZ_CMD="/usr/bin/7za"
SZ_PSW="secret"
SZ_OPT="a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on -p${SZ_PSW}"
 
SITES="example.org site.com blog.me"
 
MYSQL_USR="backup"
MYSQL_PSW="secret"
MYSQL_DBS="mysql example_org site_com blog_me"
 
# Create Dirs
/bin/mkdir ${BACKUP_DIR}
/bin/mkdir ${BACKUP_DIR}/db
/bin/mkdir ${BACKUP_DIR}/www
 
# Installed packages
/usr/bin/dpkg --list | $SZ_CMD $SZ_OPT -si ${BACKUP_DIR}/dpkg.list.7z
 
# Configs
$SZ_CMD $SZ_OPT ${BACKUP_DIR}/etc.7z /etc/
 
# Crontabs
$SZ_CMD $SZ_OPT ${BACKUP_DIR}/crontabs.7z /var/spool/cron/crontabs/
 
# Sites
for SITE in $SITES; do
    $SZ_CMD $SZ_OPT ${BACKUP_DIR}/www/${SITE}.7z /srv/www/${SITE}/
done
 
# MySQL
for DB in $MYSQL_DBS; do
    /usr/bin/mysqldump --opt -u $MYSQL_USR -p${MYSQL_PSW} $DB | $SZ_CMD
    $SZ_OPT -si ${BACKUP_DIR}/db/${DB}.sql.7z
done

Итак, что делает это скрипт:

  • Слепок установленных пакетов
  • Резервную копию конфигов и кронтабов
  • Резервную копию сайтов example.org, site.com и blog.me
  • Резервную копию mysql баз mysql, example_org, site_com и blog_me

Архивы в данном скрипте шифруются с помощью пароля $SZ_PSW, так как доверять никому не стоит