Ограничение количества подключений

Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт с одного ip адреса до нескольких раз в минуту, после чего блокировать попытки подключения для данного ip.

## Создание цепочки правил sshguard
# Максимум 2 новых запроса в минуту для одного ip
/sbin/iptables -N sshguard
# Вкл. лог по желанию
#/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --rcheck --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH-shield: "
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --update --seconds 60 --hitcount 2 -j DROP
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --set -j ACCEPT
/sbin/iptables -A sshguard -j ACCEPT
 
## Применение для трафика ssh цепочку sshguard
/sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard

recent — это модуль ядра (Core Netfilter Configuration), позволяет создавать динамические списки адресов IP. Модуль поддерживает ряд опций

  • --name name : имя списка, с которым работает команда. По умолчанию для списка используется имя DEFAULT
  • --rcheck : опция будет проверять наличие адреса отправителя пакета в списке При отсутствии адреса в списке возвращается значение false.
  • --update : опция будет проверять наличие адреса отправителя пакета в списке. Если адрес присутствует, соответствующая запись обновляется. При отсутствии адреса в списке возвращается значение false.
  • --hitcount hits : счетчик, возвращает true при наличии адреса в списке, когда число принятых пакетов с адреса больше или равно заданного значения. Используется совместно с rcheck или update
  • --seconds seconds : определяет период (от момента занесения адреса в список), в течение которого адрес может находиться в списке
  • --set : служит для добавления адреса отправителя пакета в список. Если такой адрес уже есть в списке, запись будет обновлена
  • --remove : удалить адрес из списка. Если адрес не обнаружен вернет false.

Опции могут использоваться с инверсией (!)

Использование update, а не rcheck, заставляет выдержать интервал перед следующий попыткой подключения. Если не выдержав интервал сделать попытки подключения, то это приведет к тому, что придется выдержать снова 60 секунд с момента последний попытки подключения.

Динамическое открытие/закрытие ssh порта

Небольшое правило для iptables помогающее лишний раз не держать порты открытыми.

Пример для доступа к SSH, хотя как сами понимаете можно использовать как угодно.

Суть правила проста — для того чтобы открыть доступ к шеллу нужно сначала стукнуться на 1500 порт:
telnet'ом например:

telnet myserver 1500

или через браузер:

http://192.168.0.100:1500

соответственно если стукнуть на 1499 — то порт закроется

iptables -N sshguard
# Если адрес в списке, то подключение разрешено
iptables -A sshguard -m state --state NEW -m recent --rcheck --name SSH -j ACCEPT
# Разрешить пакеты для уже установленных соединений
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A sshguard -j DROP
 
# Заносит адрес в список
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -j LOG --log-prefix "SSH-open: "
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -m recent --name SSH --set -j DROP
# Удаляет адрес из списка
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1499 -m recent --name SSH --remove -j DROP
 
# Применение для трафика ssh цепочку sshguard
iptables -A INPUT -p tcp --dport 22 -j sshguard
Порт открывается только для ip с которого был открыт

Открытие порта ssh на заданное время

Еще один пример демонстрирует способ открытия порта ssh для определенного ip на заданное время.

## определяем цепочку для SSH трафика
iptables -N sshguard
iptables -F sshguard
# Разрешить подключение если ip есть в списке и последнее подключение осуществлялось не позднее 108000 секунд (30 часов) 
iptables -A sshguard -m state --state NEW -m recent --update --seconds 108000 --name SSH -j ACCEPT
# Разрешить пакеты для уже установленных соединений
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
# Заблокировать если нет в списке
iptables -A sshguard -j DROP
 
## Открытие SSH
iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
## Фильтрация ssh трафика через цепочку sshguard
iptables -A INPUT -p tcp --dport 22 -j sshguard

Теперь, чтобы получить ssh доступ нужно сперва постучаться на порт 222, например так:

ssh user@server.name -p 222

после этого доступ для вашего ip на 22 порт будет разрешен на указанное время, при этом каждый новый коннект на ssh будет продлевать это время. Если вы не хотите продления времени то замените --update --seconds 108000 на --rcheck.

Порт открывается только для ip с которого был открыт

Также можно узнать каким ip адресам разрешен доступ к ssh:
cat /proc/net/ipt_recent/SSH

Навожу еще один простой способ обезопасить сервер от сканирования. В данном случаи будем использовать только iptables. В зависимости от того, какие у нас работают сервисы на серверах, набор портов будет разный. Для начала создадим свою цепочку, в которую добавим список IP адресов, которым позволено/запрещено иметь доступ к списку портов.

1
2
3
4
root@srv-19:~# iptables -N antiscan
root@srv-19:~# iptables -A antiscan -s 195.34.25.11 -j ACCEPT
root@srv-19:~# iptables -A antiscan -s 195.34.25.12 -j ACCEPT
root@srv-19:~# iptables -A antiscan -j DROP

В данном случае разрешено доступ только для двух IP-адресов. Теперь нужно добавить в цепочку INPUT список портов, к которым ограничивается доступ. Для начала добавим TCP порты.

1
2
3
4
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 25 -j antiscan
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 82 -j antiscan
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 3306 -j antiscan
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 8083 -j antiscan

Далее добавим UDP порты.

1
2
root@srv-19:~# iptables -I INPUT -m udp -p udp --dport 111 -j antiscan
root@srv-19:~# iptables -I INPUT -m udp -p udp --dport 161 -j antiscan

Теперь можно добавить правила в автозагрузку.

1
2
3
4
5
root@srv-19:~# iptables-save > /etc/iptables.rules
root@srv-19:~# cat > /etc/network/if-pre-up.d/iptablesup << EOF
#!/bin/bash
iptables-restore </etc/iptables.rulesexit 0 EOF
root@srv-19:~# chmod +x /etc/network/if-pre-up.d/iptablesup

Можно написать маленький скрипт, который добавлять все нужные цепочки и правила.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
root@srv-19:~# cat antiscan.sh
#!/bin/bash
WHITEIP=( `cat /opt/cdn/utils/iptables/whitelist.ip` )
PORTS_TCP=(
25
82
3306
8083 )
PORTS_UDP=(
111
161 )
if [ ! -f/opt/cdn/utils/iptables/whitelist.ip ]
then
        echo "Please add white list /opt/cdn/utils/iptables/whitelist.ip"
        exit 1
fi
iptables -N antiscan &&echo "Antiscan chain was added" ||echo "Failed to create Antiscan chain"
echo "============== Adding white list ==============="
for IPsin "${WHITEIP[@]}"
do
        iptables -A antiscan -s ${IPs} -j ACCEPT &&echo "${IPs} was added to Antiscan chain" ||echo "Failed to add ${IPs} to Antiscan chain"
done
echo "============== Adding TCP ports ==============="
for TCPPORTin "${PORTS_TCP[@]}"
do
        iptables -I INPUT -m tcp -p tcp --dport ${TCPPORT} -j antiscan &&echo "Adding Antiscan chain for ${TCPPORT} port to INPUT chain" ||echo "Failed to add Antiscan chain for ${TCPPORT} port to INPUT chain"
done
echo "============== Adding UDP ports ==============="
for UDPPORTin "${PORTS_UDP[@]}"
do
        iptables -I INPUT -m udp -p udp --dport ${UDPPORT} -j antiscan &&echo "Adding Antiscan chain for ${UDPPORT} port to INPUT chain" ||echo "Failed to add Antiscan chain for ${UDPPORT} port to INPUT chain"
done
iptables -A antiscan -j DROP &&echo "Adding DROP rule for Antiscan chain" ||echo "Failed to add DROP rule to Antiscan chain"
echo "================= ADD rules to autostart ==================="
iptables-save |grep -v fail2ban >/etc/iptables.rules
cat >/etc/network/if-pre-up.d/iptablesup << EOF
#!/bin/bash
iptables-restore </etc/iptables.rules
exit 0
EOF
chmod +x/etc/network/if-pre-up.d/iptablesup
echo "================= DONE ==================="
exit 0

/opt/cdn/utils/iptables/whitelist.ip – это список IP адресов, которые имеют доступ к портам.
Так же можно написать маленький скрипт для добавления нового IP в белый список.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@srv-19:~# cat antiscan_append.sh
#!/bin/bash
usage() {
         echo -e"nUsage: $0 IP-address"
         echo -e"Example:n $0 82.50.92.45"
         exit 1
}
if [ $# -lt 1  ]
        then
                echo "Please enter IP to add to white list"
                usage
fi
echo "============== Check if exist ========================"
iptables -C antiscan -s $1 -j ACCEPT &&echo "Already exist" &&exit 1
echo "============== Adding IP to white list ==============="
iptables -I antiscan 1 -s $1 -j ACCEPT &&echo "$1 was added to Antiscan chain" ||echo "Failed to add $1 to Antiscan chain"
echo "================= Saving rules to autostart ==================="
iptables-save |grep -v fail2ban >/etc/iptables.rules
echo "================= DONE ==================="
exit 0

Так же можно написать маленький скрипт для добавления нового IP в белый список.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@srv-19:~# cat antiscan_clean.sh
#!/bin/bash
PORTS_TCP=(
25
82
3306
8083 )
PORTS_UDP=(
111
161 )
iptables -F antiscan &&echo "Antiscan chain was flushed" ||echo "Failed to flush antiscan chain"
for TCPPORTin "${PORTS_TCP[@]}"
do
        iptables -D INPUT -m tcp -p tcp --dport ${TCPPORT} -j antiscan &&echo "Delete Antiscan chain for ${TCPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${TCPPORT} port to INPUT chain"
done
for UDPPORTin "${PORTS_UDP[@]}"
do
        iptables -D INPUT -m udp -p udp --dport ${UDPPORT} -j antiscan &&echo "Delete Antiscan chain for ${UDPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${UDPPORT} port to INPUT chain"
done
iptables -X antiscan &&echo "Deleting antiscan chain" ||echo "Failed to delete antiscan chain"
echo "================= Deleting autostart rules ==================="
rm -f/etc/iptables.rules &&echo "Deleting /etc/iptables.rules" ||echo "Failed to delete /etc/iptables.rules"
rm -f/etc/network/if-pre-up.d/iptablesup  &&echo "Deleting /etc/network/if-pre-up.d/iptablesup" ||echo "Failed to delete /etc/network/if-pre-up.d/iptablesup"
exit 0

Также добавим скрипт для удаления и чистки всех правил

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@srv-19:~# cat antiscan_clean.sh
#!/bin/bash
PORTS_TCP=(
25
82
3306
8083 )
PORTS_UDP=(
111
161 )
iptables -F antiscan &&echo "Antiscan chain was flushed" ||echo "Failed to flush antiscan chain"
for TCPPORTin "${PORTS_TCP[@]}"
do
        iptables -D INPUT -m tcp -p tcp --dport ${TCPPORT} -j antiscan &&echo "Delete Antiscan chain for ${TCPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${TCPPORT} port to INPUT chain"
done
for UDPPORTin "${PORTS_UDP[@]}"
do
        iptables -D INPUT -m udp -p udp --dport ${UDPPORT} -j antiscan &&echo "Delete Antiscan chain for ${UDPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${UDPPORT} port to INPUT chain"
done
iptables -X antiscan &&echo "Deleting antiscan chain" ||echo "Failed to delete antiscan chain"
echo "================= Deleting autostart rules ==================="
rm -f/etc/iptables.rules &&echo "Deleting /etc/iptables.rules" ||echo "Failed to delete /etc/iptables.rules"
rm -f/etc/network/if-pre-up.d/iptablesup  &&echo "Deleting /etc/network/if-pre-up.d/iptablesup" ||echo "Failed to delete /etc/network/if-pre-up.d/iptablesup"
exit 0

Ну и маленький скрипт для удаления определенного IP со списка позволенных.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@srv-19:~# cat antiscan_del_ip.sh
#!/bin/bash
echo "============== Check if exist ========================"
iptables -C antiscan -s $1 -j ACCEPT
if [ $? -eq 0 ]
then
        echo "Entry exist"
        echo "Deleting..."
        iptables -D antiscan -s $1 -j ACCEPT &&echo "$1 was deleted from Antiscan chain" ||echo "Failed to delete $1 from Antiscan chain"
        echo "================= Saving rules to autostart ==================="
        iptables-save |grep -v fail2ban >/etc/iptables.rules
        echo "================= DONE ==================="
        exit 0
else
        echo "Entry doesn't exist"
        exit 1
fi

Пробуйте, может кому-то понадобится.

Когда-нибудь вам может потребоваться сервисы на компьютере за маршрутизатором или же вы просто хотите сделать жизнь проще, подключаясь к локальной сети из интернета. Возможно, вы захотите запустить серверы FTP, HTTP, SSH или VNC на одном или нескольких компьютерах за вашим маршрутизатором и подключаться к ним всем. Есть только одно ограничение — вы можете запускать только по одному сервису на компьютере на каждый порт. Например, невозможно настроить три FTP-сервера за вашим маршрутизатором и попробовать подключиться ко всем трем из интернета через порт 21; только один из них будет на порту 21, когда как остальные будут использовать, скажем, порты 123 и 567.

Все правила проброса портов имеют вид iptables -t nat -A PREROUTING [-p протокол] --dport [внешний порт маршрутизатора] -i ${WAN} -j DNAT --to [IP-адрес/порт для проброса]. К сожалению, iptables не принимает имена узлов при пробросе портов. Если вы пробрасываете внешний порт на порт с тем же номером для внутреннего компьютера, то вы можете опустить порт назначения. См. страницу помощи iptables (8) для большей информации.

Листинг 6.1: Выполнение команд iptables

Скопируйте и вставьте для примера...
# export LAN=eth0
# export WAN=eth1

Пробрасывание порта 2 на ssh внутреннего хоста
# iptables -t nat -A PREROUTING -p tcp --dport 2 -i ${WAN} -j DNAT --to 192.168.0.2:22

Пробрасывание FTP-трафика на внутренний компьютер
# iptables -t nat -A PREROUTING -p tcp --dport 21 -i ${WAN} -j DNAT --to 192.168.0.56

Пробрасывание HTTP-трафика на внутренний компьютер
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i ${WAN} -j DNAT --to 192.168.0.56

Пробрасывание VNC-трафика для внутренних компьютеров
# iptables -t nat -I PREROUTING -p tcp --dport 5900 -i ${WAN} -j DNAT --to 192.168.0.2
# iptables -t nat -I PREROUTING -p tcp --dport 5901 -i ${WAN} -j DNAT --to 192.168.0.3:5900
Теперь, если вам необходимо подключиться к VNC по адресу 192.168.0.3, то просто добавьте «:1» к имени маршрутизатора

Проброс трафика Bittorrent
# iptables -t nat -A PREROUTING -p tcp --dport 6881:6889 -i ${WAN} -j DNAT --to 192.168.0.2

Проброс трафика eDonkey/eMule
# iptables -t nat -A PREROUTING -p tcp --dport 4662 -i ${WAN} -j DNAT --to 192.168.0.55

Поддержка Game Cube Warp Pipe
# iptables -t nat -A PREROUTING -p udp --dport 4000 -i ${WAN} -j DNAT --to 192.168.0.56

Поддержка Playstation 2 Online
# iptables -t nat -A PREROUTING -p tcp --dport 10070:10080 -i ${WAN} -j DNAT --to 192.168.0.11
# iptables -t nat -A PREROUTING -p udp --dport 10070:10080 -i ${WAN} -j DNAT --to 192.168.0.11

Xbox Live
# iptables -t nat -A PREROUTING -p tcp --dport 3074 -i ${WAN} -j DNAT --to 192.168.0.69
# iptables -t nat -A PREROUTING -p udp --dport 3074 -i ${WAN} -j DNAT --to 192.168.0.69
# iptables -t nat -A PREROUTING -p udp --dport 88 -i ${WAN} -j DNAT --to 192.168.0.69

Файрвол в системе linux контролируется программой iptables (для ipv4) и ip6tables (для ipv6). В данной шпаргалке рассмотрены самые распространённые способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.

Знак # означает, что команда выполняется от root. Откройте заранее консоль с рутовыми правами — sudo -i в Debian-based системах или su в остальных.

1. Показать статус.

# iptables -L -n -v

Примерный вывод команды для неактивного файрвола:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Для активного файрвола:

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
  394 43586 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
   93 17292 ACCEPT     all  --  br0    *       0.0.0.0/0            0.0.0.0/0
    1   142 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  br0    br0     0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
    0     0 TCPMSS     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x06/0x02 TCPMSS clamp to PMTU
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 wanin      all  --  vlan2  *       0.0.0.0/0            0.0.0.0/0
    0     0 wanout     all  --  *      vlan2   0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  br0    *       0.0.0.0/0            0.0.0.0/0
Chain OUTPUT (policy ACCEPT 425 packets, 113K bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain wanin (1 references)
 pkts bytes target     prot opt in     out     source               destination
Chain wanout (1 references)
 pkts bytes target     prot opt in     out     source               destination

Где:
— L : Показать список правил.
— v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
— n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).

2. Отобразить список правил с номерами строк.

# iptables -n -L -v --line-numbers

Примерный вывод:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
3    TCPMSS     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x06/0x02 TCPMSS clamp to PMTU
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
5    wanin      all  --  0.0.0.0/0            0.0.0.0/0
6    wanout     all  --  0.0.0.0/0            0.0.0.0/0
7    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
Chain wanin (1 references)
num  target     prot opt source               destination
Chain wanout (1 references)
num  target     prot opt source               destination

Вы можете использовать номера строк для того, чтобы добавлять новые правила.

3. Отобразить INPUT или OUTPUT цепочки правил.

# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers

4. Остановить, запустить, перезапустить файрвол.

Силами самой системы:
# service ufw stop
# service ufw start

Можно также использовать команды iptables для того, чтобы остановить файрвол и удалить все правила:
# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

Где:
— F : Удалить (flush) все правила.
— X : Удалить цепочку.
— t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
— P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).

5. Удалить правила файрвола.

Чтобы отобразить номер строки с существующими правилами:
# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

Получим список IP адресов. Просто посмотрим на номер слева и удалим соответствующую строку. К примеру для номера 3:
# iptables -D INPUT 3

Или найдем IP адрес источника (202.54.1.1) и удалим из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP

Где:
— D : Удалить одно или несколько правил из цепочки.

6. Добавить правило в файрвол.

Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:
# iptables -L INPUT -n --line-numbers

Примерный вывод:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

Чтобы вставить правило между 1 и 2 строкой:
# iptables -I INPUT 2 -s 202.54.1.2 -j DROP

Проверим, обновилось ли правило:
# iptables -L INPUT -n --line-numbers

Вывод станет таким:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    DROP       all  --  202.54.1.2           0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

7. Сохраняем правила файрвола.

Через iptables-save:
# iptables-save > /etc/iptables.rules

8. Восстанавливаем правила.

Через iptables-restore
# iptables-restore < /etc/iptables.rules

9. Устанавливаем политики по умолчанию.

Чтобы сбрасывать весь трафик:
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n

После вышеперечисленных команд ни один пакет не покинет данный хост.
# ping google.com

10. Блокировать только входящие соединения.

Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -L -v -n

Пакеты исходящие и те, которые были запомнены в рамках установленных сессий — разрешены.
# ping google.com

11. Сбрасывать адреса изолированных сетей в публичной сети.

# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 ©
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

12. Блокировка определенного IP адреса.

Чтобы заблокировать адрес взломщика 1.2.3.4:
# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP

13. Заблокировать входящие запросы порта.

Чтобы заблокировать все входящие запросы порта 80:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

14. Заблокировать запросы на исходящий IP адрес.

Чтобы заблокировать определенный домен, узнаем его адрес:
# host -t a facebook.com

Вывод: facebook.com has address 69.171.228.40

Найдем CIDR для 69.171.228.40:
# whois 69.171.228.40 | grep CIDR

Вывод:
CIDR: 69.171.224.0/19

Заблокируем доступ на 69.171.224.0/19:
# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

Также можно использовать домен для блокировки:
# iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP

15. Записать событие и сбросить.

Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Проверим журнал (по умолчанию /var/log/messages):
# tail -f /var/log/messages
# grep -i --color 'IP SPOOF' /var/log/messages

16. Записать событие и сбросить (с ограничением на количество записей).

Чтобы не переполнить раздел раздутым журналом, ограничим количество записей с помощью -m. К примеру, чтобы записывать каждые 5 минут максимум 7 строк:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

16. Сбрасывать или разрешить трафик с определенных MAC адресов.

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *разрешить только для TCP port # 8080 с mac адреса 00:0F:EA:91:04:07 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

17. Разрешить или запретить ICMP Ping запросы.

Запрет Icmp-сообщений.
Хорошей практикой также является запрет ICMP-сообщений, которые могут выдать дополнительную информацию о хосте или быть использованы для выполнения различных злонамеренных действий (например, модификации таблицы маршрутизации). Ниже приведена таблица со списком возможных типов ICMP-сообщений:

Типы ICMP-сообщений.

0 — echo reply (echo-ответ, пинг)
3 — destination unreachable (адресат недосягаем)
4 — source quench (подавление источника, просьба посылать пакеты медленнее)
5 — redirect (редирект)
8 — echo request (echo-запрос, пинг)
9 — router advertisement (объявление маршрутизатора)
10 — router solicitation (ходатайство маршрутизатора)
11 — time-to-live exceeded (истечение срока жизни пакета)
12 — IP header bad (неправильный IPзаголовок пакета)
13 — timestamp request (запрос значения счетчика времени)
14 — timestamp reply (ответ на запрос значения счетчика времени)
15 — information request (запрос информации)
16 — information reply (ответ на запрос информации)
17 — address mask request (запрос маски сети)
18 — address mask reply (ответ на запрос маски сети)

Как видишь, ответ на некоторые ICMP-сообщения может привести к разглашению некоторой информации о хосте, в то время как другие — привести к модификации таблицы маршрутизации, поэтому их необходимо запретить.

Обычно выход во внешний мир разрешают ICMP-сообщениям 0, 3, 4, 11 и 12, в то время как на вход принимают только 3, 8 и 12. Вот как это реализуется в различных брандмауэрах:

Запрет опасных ICMP-сообщений.

iptables -A INPUT -p icmp --icmp-type 3,8,12 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0,3,4,11,12 -j ACCEPT

Чтобы запретить:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

Разрешить для определенных сетей / хостов:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Разрешить только часть ICMP запросов:
### ** предполагается, что политики по умолчанию для входящих установлены в DROP ** ###
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** разрешим отвечать на запрос ** ##
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT

iptables -A OUTPUT -i eth0 -p icmp --icmp-type 0 -j ACCEPT

18. Открыть диапазон портов.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

19. Открыть диапазон адресов.

## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 ##
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

## пример для nat ##
# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.

## ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

## cups (printing service) udp/tcp port 631 для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT

## time sync via NTP для локальной сети (udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

## tcp port 25 (smtp) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

# dns server ports ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

## http/https www server port ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

## tcp port 110 (pop3) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

## tcp port 143 (imap) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

## Samba file server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

## proxy server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT

## mysql server для локальной сети ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Для ограничений используется connlimit модуль. Чтобы разрешить только 3 ssh соединения на одного клиента:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Установить количество запросов HTTP до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

Где:
— connlimit-above 3 : Указывает, что правило действует только если количество соединений превышает 3.
— connlimit-mask 24 : Указывает маску сети.

Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man:
$ man iptables

Чтобы посмотреть помощь по определенным командам и целям:
# iptables -j DROP -h

Проверка правила iptables.

Проверяем открытость / закрытость портов:
# netstat -tulpn

Проверяем открытость / закрытость определенного порта:
# netstat -tulpn | grep :80

Проверим, что iptables разрешает соединение с 80 портом:
# iptables -L INPUT -v -n | grep 80

В противном случае откроем его для всех:
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

Проверяем с помощью telnet
$ telnet ya.ru 80

Можно использовать nmap для проверки:
$ nmap -sS -p 80 ya.ru

Автор статьи Platon Puhlechev aka iFalkorr разрешает печатать данный текст.

Iptables отличный инструмент в руках администратора. Если нужно легко и просто защититься в десктопной Ubuntu, то стоит знать, что есть удобная консольная надстройка над iptables под названием UFW, а к ней есть графическая программа GUFW. Сделать свою Ubuntu ещё более защищённой поможет видеоматериал.

Часть 1 — основы IPTABLES: структура IPTABLES, таблицы, цепочки, кроткий обзор правил и действий;

Часть 2 — управление IPTABLES: основы управления — опции, команды для создания-удаления правил, цепочек, таблиц, сохранение и восстановление правил;

Часть 3 — параметры правил: — наиболее полезные параметры для создания правил, модули;

Часть 4 — цели для правил — описание целей (действий) для пакетов, попадающих под параметры правил;

IPTABLES является утилитой (!), а не непосредственно фаерволом. Роль фаервола в Linux играет пакетNetfilter (в Linux с версии 2.4).

IPTABLES представляет собой утилиту для конфигурирования Netfilter.

Структура IPTABLES

Структуру можно представить так:

iptables -> Tables -> Chains -> Rules

Пакет приходит на IPTABLES > далее на таблицы (Tables) > попадает в цепочки (Chains) > проходит по правилам (Rules).

Фактически, IPTABLES состоит из трёх основных частей:

таблицы: фактически, являют собой набор цепочек;

цепочки: набор правил;

правила;

Таблицы IPTABLES

У IPTABLES имеется 4 встроенных типа таблиц.

1. Filter Table

Является таблицей по-умолчанию. Если при создании/изменении правила не указана таблица — используется именно filter. Используется в основном для фильтрации пакетов. К примеру, тут можно выполнить DROP, LOG, ACCEPT или REJECT без каких либо сложностей, как в других таблицах.  Использует 3 встроенных цепочки:

  • INPUT chain – входящие пакеты, используется только для пакетов, цель которых — сам сервер, не используется для транзитного (роутинга) трафика
  • OUTPUT chain – исходящие пакеты, созданные локально и отправленные «за пределы» сервера;
  • FORWARD chain – пакеты, предназначенные другому сетевому интерфейсу (роут на другие машины сети, например).

2. NAT table

Таблица nat используется главным образом для преобразования сетевых адресов (Network Address Translation). Через эту таблицу проходит только первый пакет из потока. Преобразования адресов автоматически применяется ко всем последующим пакетам. Это один из факторов, исходя из которых мы не должны осуществлять какую-либо фильтрацию в этой таблице.

  • PREROUTING chain – преобразование адресов DNAT (Destination Network Address Translation), фильтрация пакетов здесь допускается только в исключительных случаях;
  • POSTROUTING chain – выполняется преобразование  адресов SNAT (Source Network Address Translation), фильтрация пакетов здесь крайне нежелательна;
  • OUTPUT chain – NAT для локально сгенерированных пакетов;

3. Mangle table

Таблица Mangle предназначена только для внесения изменения в некоторые заголовки пакетов — TOS(Type of Service),  TTL (Time to Live), MARK (особая метка для IPTABLES или других служб). Важно: в действительности поле MARK не изменяется, но в памяти ядра заводится структура, которая сопровождает данный пакет все время его прохождения через машину, так что другие правила и приложения на данной машине (и только на данной машине) могут использовать это поле в своих целях.

Включает в себя такие цепочки:

  • PREROUTING chain
  • OUTPUT chain
  • FORWARD chain
  • INPUT chain
  • POSTROUTING chain

4. Raw table

Применяется до передачи пакета механизму определения состояний (state machine, connection tracking — система трассировки соединений, при помощи которой реализуется межсетевой экран на сеансовом уровне (stateful firewall), позволяет определить, к какому соединению или сеансу принадлежит пакет, анализирует все пакеты кроме тех, которые были помечены NOTRACK в таблице raw).

  • PREROUTING chain
  • OUTPUT chain

Цепочки IPTABLES

Существует 5 типов стандартных цепочек, встроенных в систему:

  • PREROUTING — для изначальной обработки входящих пакетов;
  • INPUT — для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу);
  • FORWARD — для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING);
  • OUTPUT — для пакетов генерируемых локальными процессами;
  • POSTROUTING — для окончательной обработки исходящих пакетов.

iptables-filter-nat-mangle-tables

Схематично путь пакетов через IPTABLES хорошо представлен на следующей схеме:

iptables_packet_flow

 

Правила IPTABLES

Правила имеют следующую структуру:

правило > цель > счётчик

Если пакет соответствует правилу, к нему применяется цель, и он учитывается счетчиком. Если правило(или критерий ) не задан — то цель применяется ко всем проходящим через цепочку пакетам. Если не указаны ни цель, ни правило — для правила будет срабатывать только счётчик пакетов. Если пакет не попадает под правило и цель — он передаётся следующему правилу в списке.

Параметры для формирования правил смотрите в посте Linux: IPTABLES — руководство: часть 3 — параметры правил.

Цели (targets) IPTABLES

Правило может содержать одно из следующих целей (или действий):

  • ACCEPT – принять пакет, и передать следующей цепочке  (или приложению, или передать для дальнейшего роутинга);
  • DNAT — (Destination Network Address Translation) используется для преобразования адреса места назначения в IP заголовке пакета; если пакет подпадает под критерий правила, выполняющегоDNAT, то этот пакет, и все последующие пакеты из этого же потока, будут подвергнуты преобразованию адреса назначения и переданы на требуемое устройство, хост или сеть; действие DNAT может выполняться только в цепочках PREROUTING и OUTPUT таблицы nat, и во вложенных под-цепочках; важно запомнить, что вложенные подцепочки, реализующие DNAT не должны вызываться из других цепочек, кроме PREROUTING и OUTPUT;
  • DROP – просто «сбрасывает» пакет и IPTABLES «забывает» о его существовании; «сброшенные» пакеты прекращают свое движение полностью, т.е. они не передаются в другие таблицы, как это происходит в случае с действием ACCEPT; следует помнить, что данное действие может иметь негативные последствия, поскольку может оставлять незакрытые «мертвые» сокеты как на стороне сервера, так и на стороне клиента, наилучшим способом защиты будет использование действия REJECT, особенно при защите от сканирования портов;
  • LOG — действие, которое служит для журналирования отдельных пакетов и событий; в журнал могут заноситься заголовки IP пакетов и другая полезная информация; информация из журнала может быть затем прочитана с помощью dmesg или syslogd, либо с помощью других программ; обратите ваше внимание так же на цель ULOG, которое позволяет выполнять запись информации не в системный журнал, а в базу данных MySQL и т.п.;
  • MARK — используется для установки меток для определенных пакетов; это действие может выполняться только в пределах таблицы mangle; установка меток обычно используется для нужд маршрутизации пакетов по различным маршрутам, для ограничения трафика и т.п.; «метка» пакета существует только в период времени пока пакет не покинул брандмауэр, т.е. метка не передается по сети;
  • MASQUERADE — в основе своей представляет то же самое, что и SNAT только не имеет ключа--to-source; причиной тому то, что маскарадинг может работать, например, с dialup подключением или DHCP, т.е. в тех случаях, когда IP адрес присваивается устройству динамически; если у вас имеется динамическое подключение, то нужно использовать маскарадинг, если же у вас статическое IP подключение, то лучше будет использование SNAT;
  • MIRROR — может использоваться вами только для экспериментов и в демонстрационных целях, поскольку это действие может привести к «зацикливанию» пакета и в результате к «Отказу от обслуживания»; в результате действия MIRROR в пакете, поля source и destination меняются местами и пакет отправляется в сеть;  допускается использовать только в цепочкахINPUT, FORWARD и PREROUTING, и в цепочках, вызываемых из этих трех;
  • QUEUE – ставит пакет в очередь на обработку пользовательскому процессу; оно может быть использовано для нужд учета, проксирования или дополнительной фильтрации пакетов;
  • REDIRECT — выполняет перенаправление пакетов и потоков на другой порт той же самой машины; можно пакеты, поступающие на HTTP порт перенаправить на порт HTTP-proxy; удобен для выполнения «прозрачного» проксирования (transparent proxy), когда машины в локальной сети даже не подозревают о существовании прокси; может использоваться только в цепочкахPREROUTING и OUTPUT таблицы nat;
  • REJECT — используется, как правило, в тех же самых ситуациях, что и DROP, но в отличие отDROP, команда REJECT выдает сообщение об ошибке на хост, передавший пакет;
  • RETURN — прекращает движение пакета по текущей цепочке правил и производит возврат следующему правилу в вызывающей (предыдущей) цепочке, если текущая цепочка была вложенной, или, если текущая цепочка лежит на самом верхнем уровне (например INPUT), то к пакету будет применена политика по-умолчанию; обычно, в качестве политики по-умолчанию назначают действия ACCEPT или DROP;
  • SNAT — используется для преобразования сетевых адресов (Source Network Address Translation), т.е. изменение исходящего IP адреса в IP в заголовке пакета; SNAT допускается выполнять только в таблице nat, в цепочке POSTROUTING; если первый пакет в соединении подвергся преобразованию исходящего адреса, то все последующие пакеты, из этого же соединения, будут преобразованы автоматически и не пойдут через эту цепочку правил;
  • TOS — используется для установки битов в поле Type of Service IP заголовка; поле TOS содержит 8 бит, которые используются для маршрутизации пакетов;  важно помнить, что данное поле может обрабатываться различными маршрутизаторами с целью выбора маршрута движения пакета;  в отличие от MARK, сохраняет свое значение при движении по сети, а поэтому может использоваться для маршрутизации пакета; лучше всего использовать это поле для своих нужд только в пределах WAN или LAN;
  • TTL — используется для изменения содержимого поля Time To Live в IP заголовоке;
  • ULOG — система журналирования пакетов, которая заменяет традиционное действие LOG, базирующееся на системном журнале; при использовании этого действия, пакет, через сокетыnetlink, передается специальному демону который может выполнять очень детальное журналирование в различных форматах (обычный текстовый файл, база данных MySQL и пр.), млжет формировать отчёты в CSV, XML, Netfilter’s LOG, Netfilter’s conntrack; подробнее смотрите на домашней странице проекта;

Параметры для формирования действий смотрите в посте Linux: IPTABLES — руководство: часть 4 — цели для правил.

Критерий так же может использовать состояние пакета для принятия решений:

  • NEW — пакет открывает новый сеанс, например — пакет TCP с флагом SYN;
  • ESTABLISHED — пакет является частью уже существующего сеанса;
  • RELATED — пакет открывает новый сеанс, связанный с уже открытым сеансом, например, во время сеанса пассивного FTP, клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов; в этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21);
  • INVALID — все прочие пакеты.

Ссылки на материалы

https://www.frozentux.net — полный мануал по IPTABLES + много информации по структуре сети и пакетов; обновлялся в 2006 году; IPTABLES 1.2.2;

http://www.opennet.ru — то же, но на русском, обновлялся в 2003, IPTABLES 1.1.9;

http://www.netfor2.com — краткое описание протокола TCP и структуры пакетов;

http://ipset.netfilter.org

http://www.opennet.ru

http://help.ubuntu.ru

http://www.cinetel.ru

http://fideloper.com

https://www.digitalocean.com

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

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

IPTABLES — руководство: часть 3 — параметры правил

Общий обзор действий был дан в первом посте — IPTABLES — руководство: часть 1 — основы IPTABLES.

Содержание:

Действие над попавшим под правило пакетом выполняется с помощью опий -j (--jump) или-g (--goto).

-j, --jump <i>цель</i> — цель (или действие) для пакетов, попадающих по действие правила; целью может быть цепочка, определённая пользователем (отличная от цепочки правила), одна из встроенных целей, определяющая окончательное действие над пакетом; если опция не задана в правиле (и ключ -g не использован), то сработает только счётчик количества правила;

-g, --goto <i>цепочка</i> — продолжить обработку в цепочке, определённой пользователем; в отличие от опции —jump, после действия RETURN из вызванной цепочки, применение правил будет продолжено не в текущей цепочке, а в той цепочке, которая вызвала текущую через --jump.

Для использования -j <em>chain</em> или -g <em>chain</em> — цепочка должна быть уже создана.

Пример:

1iptables -A INPUT -p tcp -j tcp_packet

Цели IPTABLES

ACCEPT – принять пакет, и передать следующей цепочке  (или приложению, или передать для дальнейшего роутинга);

У данного действия нет дополнительных опций. После выполнения ACCEPT пакет не будет более отслеживаться никаким правилом этой цепочки (но может попасть под правило в другой, например вPOSTROUTING).

Пример:

1iptables -A INPUT -s SOME_IP_HERE -j ACCEPT

CONNMARK — схожа с MARK. Позволяет установить метку на пакеты одной сессии или соединения. Можно использовать в любой цепочке, но при этом учтите, что в таблице nat проверяется только первый пакет, а потому метки на всех пакетах будут бесполезны.

--set-mark — устанавливает метку на паккет; значение может быть long int (от 0 до 4294967295l); можно установить метку на каждый бит пакета, например --set-mark 12/8;

Пример:

1iptables -t nat -A PREROUTING -p tcp --dport 80 -j CONNMARK --set-mark 4

--save-mark — используется для сохранения метки пакета на всё соединение;  например, если вы установили метку на пакет с помощью цели MARK — с помощью --save-mark вы можете переместить её на всё подключение целиком;

Пример:

1iptables -t mangle -A PREROUTING --dport 80 -j CONNMARK --save-mark

--restore-mark — восстановить метку пакета из метки всего соединения, заданного CONNMARK; допустимо  использование только в таблице mangle ;

Пример:

1iptables -t mangle -A PREROUTING --dport 80 -j CONNMARK --restore-mark

--mask  —  используется вместе с --save-mark и --restore-mark;

Пример:

1iptables -t mangle -A PREROUTING --dport 80 -j CONNMARK --restore-mark --mask 12

DNAT — используется для Destination Network Address Translation, перезаписывает Destination IP addressпакета. Допустимо использование только в цепочках PREROUTING и OUTPUT таблицы nat.

--to-destination — указывает механизму DNAT какой IP задать в IP-заголовке пакета, и куда его пересылать; в примере ниже все пакеты на адрес 15.45.23.67 будут перенаправляться на диапазон локальных адресов 192.168.1.1 — 192.168.1.10; можно указать порт назначения, например 192.168.1.1:80, или диапазон портов — 192.168.1.1:80-100;  обязательно указание протокола (-p tcp или -p udp):

Пример:

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

Больше информации тут>>>.

DROP — просто «сбрасывает» пакет и IPTABLES «забывает» о его существовании; «сброшенные» пакеты прекращают свое движение полностью, т.е. они не передаются в другие таблицы, как это происходит в случае с действием ACCEPT. Следует помнить, что данное действие может иметь негативные последствия, поскольку может оставлять незакрытые «мертвые» сокеты как на стороне сервера, так и на стороне клиента. Наилучшим способом защиты будет использование действия REJECT, особенно при защите от сканирования портов.

LOG  — действие, которое служит для журналирования отдельных пакетов и событий. В журнал могут заноситься заголовки IP пакетов и другая полезная информация. Информация из журнала может быть затем прочитана с помощью dmesg или syslogd, либо с помощью других программ. Обратите ваше внимание так же на цель ULOG, которое позволяет выполнять запись информации не в системный журнал, а в базу данных MySQL и т.п.

--log-level — указание log-level при логировании события;

Пример:

1iptables -A FORWARD -p tcp -j LOG --log-level debug

--log-prefix — добавляет префикс к сообщениям в лог-файле; допустимо максимум 29 символов,включая пробелы и другие специальные символы;

Пример:

1iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

--log-tcp-sequence — записывать в лог номер TCP Sequence;

Пример:

1iptables -A INPUT -p tcp -j LOG --log-tcp-sequence

--log-tcp-options — записывать  влог различные опции из заголовка TCP-пакета;

Пример:

1iptables -A FORWARD -p tcp -j LOG --log-tcp-options

MARK — устанавливает метку Netfilter, которая ассоциирована с определённым пакетом. Допустимо использование только в таблице mangle. Учтите — «метка» устанавливается не на сам пакет, а является неким значением для ядра, которое ассоциируется с пакетом. Т.е., если вы ожидаете увидеть данную метку на это пакете на другом хосте — у вас это не выйдет. Для таких целей лучше использовать TOS (в данном посте не описано, смотрите тут>>>), который устанавливает значение в IP-заголовок пакета.

--set-mark — устанавливается в виде int (целого числа), например для дальнейшей расширенной маршрутизации;

Пример:

1iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

MASQUERADE — в целом, сход по назначению с целью SNAT, но без  ключа  --to-source, так как в основном используется при динамических соединения — DHCP, DialUp, когда IP присваивается динамически и получает информацию об IP непосредственно с сетевого интерфейса. Использование MASQUERADE  допустимо  приналичии постоянного IP, но использует больше системных ресурсов, потому в таком случае предпочтительнее использование SNAT. Допускается использование только в цепочке POSTROUTING таблицы nat.

--to-ports — может быть использована для указания исходных порта или портов для исходящих пакетов; обязательно указание протокола (p- tcp или -p udp);

Пример:

1iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

NOTRACK — установка метки NOTRACK  на пакеты. Не имете дополнительных опций. Подробнее смотрите тут>>>.

REDIRECT — выполняет перенаправление пакетов и потоков на другой порт той же самой машины. Можно пакеты, поступающие на HTTP порт, перенаправить на порт HTTP-proxy. Удобен для выполнения «прозрачного» проксирования (transparent proxy), когда машины в локальной сети даже не подозревают о существовании прокси. Может использоваться только в цепочках PREROUTING и OUTPUT таблицы nat.

--to-ports — указывает порт или диапазон портов назначения; что бы указать диапазон — укажите их через тире; обязательно указание протокола (-p tcp или -p udp);

Пример:

1iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
1iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080-9090

REJECT — используется, как правило, в тех же самых ситуациях, что и DROP, но в отличие от DROP, цель REJECT выдает сообщение об ошибке на хост, передавший пакет. Допустимо использование в цепочках INPUT, FORWARD и OUTPUT, и их под-цепочках.

--reject-with — выполняет REJECT с указанным ответом; сначала будет выполнен REJECT, отправлен ответ, после чего — DROP пакета; допустимые значения:icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited and icmp-host-prohibited;

Пример:

1iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

RETURN — прекращает премещение пакета далее по правилам в текущей цепочке. Если это вложенная цепочка другой, вышестоящей, цепочки — пакет будет перемещён в неё, если это главная цепочка  — он будет обработан согласно действия по-умолчанию для данной цепочки. Не имеет дополнительных опций.

SNAT — используется для преобразования сетевых адресов (Source Network Address Translation), т.е. изменение исходящего IP адреса в IP в заголовке пакета. SNAT допускается выполнять только в таблицеnat, в цепочке POSTROUTING. Если первый пакет в соединении подвергся преобразованию исходящего адреса, то все последующие пакеты, из этого же соединения, будут преобразованы автоматически и не пойдут через эту цепочку правил.

--to-source — используется для указания исходного адреса пакета;  допустимо  указать диапазон адресов, разделённые тире — 194.236.50.155-194.236.50.160, в таком случае конкретный IP адрес будет выбираться случайным образом для каждого нового потока;

Пример:

1iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

ULOG — лучше ознакомится с информацией на домашней странице проекта.