• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Иконка ресурса

Мануал Грамотная настройка Iptables на сервере

Alligat0r

Путник
Пользователь
Сообщения
76
Розыгрыши
0
Репутация
313
Реакции
77
Баллы
0
Описание на примере операционной системы CentOS 6/7
Чем она лучше дебиана это отдельная большая статься и может быть я как нибудь возьмусь написать ее.

И так имеем свежеустановленную операционную систему Centos на сервере.

Заходим по SSH под пользователем root и проводим следующие манипуляции:

Подключаем репозитарий epel, обновляемся и перезагружаемся

# yum install epel-release
# yum update -y
# shutdown -r 0


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

Отрубаем штатный скрипт фаервола

Если у нас CentOS 6

# service iptables stop
# service ip6tables stop

# chkconfig iptables off
# chkconfig ip6tables off


Если у нас CentOS 7

# systemctl stop iptables.service
# systemctl stop ip6tables.service
# systemctl disable iptables.service
# systemctl disable ip6tables.service


Если ругнется что ip6tables нет - не обращаем внимания, не во всех дистрибутивах присутствует.

Устанавливаем ipset для бана особо умных рекламщиков в игре которые умеют обходить бан по железу.

# yum install ipset

Создаем свой скрипт с правилами и даем права запуска
# touch /etc/init.d/rc.firewall
# chmod 755 /etc/init.d/rc.firewall


Редактируем

# vi /etc/init.d/rc.firewall

В открывшемся окне редактирования нажимаем 1 раз клавишу Insert и вписываем свои правила.

#!/bin/sh

IPT="/sbin/iptables"


# сбрасываем все при запуске
$IPT -F
$IPT -X
$IPT -Z

# Выставляем правила по умолчанию
# Все входящие неописанные правилами блокируем,
# все исходящие от имени сервера разрешаем

$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD DROP
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD

###Имя нашей сетевой карты (у меня она к примеру eth0 )

IFACE=eth0

# Активируем цепочки ipset
# banip - для бана по IP
# nabnet - для бана по подсети


ipset -N banip iphash
ipset -N nabnet nethash

# Дропаем все, что занесено в цепочки IPSET

$IPT -A INPUT -m set --set banip src -j DROP

# Разрешаем localhost и запрещаем спуфить на него через внешний интерфейс

$IPT -A INPUT -s 127.0.0.1/255.0.0.0 ! -i lo -j DROP
$IPT -A INPUT -i lo -j ACCEPT

# Дропаем битые пакеты и разрешаем уже установленные соединения

$IPT -A INPUT -m conntrack --ctstate INVALID -j DROP
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Разрешаем коннектиться на порт логин сервера (не более 3 подключений с одного IP )

$IPT -A INPUT -p tcp -i $IFACE --dport 2106 -m connlimit --connlimit-above 3 -j DROP
$IPT -A INPUT -p tcp -i $IFACE --dport 2106 -j ACCEPT

# Разрешаем коннектиться на порт гейм сервера (не более 5 подключений с одного IP )
# Если кто то захочет с одного компа поиграть в более 5 окон - его ждет разочарование

$IPT -A INPUT -p tcp -i $IFACE --dport 7777 -m connlimit --connlimit-above 5 -j DROP
$IPT -A INPUT -p tcp -i $IFACE --dport 7777 -j ACCEPT


# Разрешаем подключаться к порту MySQL только с разрешенных IP
# К примеру IP сервера где стоит вебобвязка и домашние IP
# Вместо xx.xx.xx.xx соответственно свои IP
# Если у Вас дома IP меняется то можно добавить целую сеть, к примеру вместо xx.xx.xx.xx 122.12.0.0/16

$IPT -A INPUT -m conntrack --ctstate NEW -p tcp -i $IFACE -d xx.xx.xx.xx --dport 3306 -j ACCEPT
$IPT -A INPUT -m conntrack --ctstate NEW -p tcp -i $IFACE -d xx.xx.xx.xx --dport 3306 -j ACCEPT
$IPT -A INPUT -m conntrack --ctstate NEW -p tcp -i $IFACE -d xx.xx.xx.xx --dport 3306 -j ACCEPT

# Разрешаем SSH порт для доверенных IP (то же самое что и 3306 только IP сервера с вебобвязкой не нужен)

$IPT -A INPUT -m conntrack --ctstate NEW -p tcp -i $IFACE -d xx.xx.xx.xx --dport 22 -j ACCEPT
$IPT -A INPUT -m conntrack --ctstate NEW -p tcp -i $IFACE -d xx.xx.xx.xx --dport 22 -j ACCEPT

# Все что не подпало под описанные правила - дропаем

$IPT -A INPUT -j DROP


Правим естественно под себя.
Далее нажимаем 1 раз Esc и далее Shift+ZZ

Активируем скрипт при запуске системы:

# chmod +x /etc/rc.d/rc.local
# vi /etc/rc.d/rc.local


Нажимаем Insert и дописываем туда:
/etc/init.d/rc.firewall

Выходим Shift+ZZ и перезагружаемся shutdown -r 0

Фаервол готов к работе.

Теперь как пользоваться утилитой IPSET которая описана у нас в скрипте фаервола для бана нерадивых нам IP адресов и сетей :)
Делается это очень просто и быстро. Заходим по SSH под пользователем root
Для бана какого нибудь IP даем команду:

ipset -A banip xx.xx.xx.xx (xx меняем на IP подлежащий бану)

И все, фаервол будет дропать все с этого IP и не пускать на сервер.

Для разбана этого IP можно дать команду
ipset -D banip xx.xx.xx.xx
После этого IP будет удален из списка бана.

Для бана целой сети используем:

ipset -A bannet 192.168.10.0/24 (где сеть меняем на нужную)
 
Последнее редактирование:

    kick

    Баллов: 48
    За сообщение

    Mangol

    Баллов: 46
    Спасибо за в клад в развитие форума

    ganGGame

    Баллов: 1
    Спасибо за в клад в развитие форума

если 7 centos то как правило еще я бы добавил
yum install iptables && yum install iptables-services
systemctl stop firewalld && systemctl mask firewalld
systemctl enable iptables && systemctl start iptables
 
Последнее редактирование модератором:
если 7 centos то как правило еще я бы добавил
yum install iptables && yum install iptables-services
systemctl stop firewalld && systemctl mask firewalld
systemctl enable iptables && systemctl start iptables

iptables - он там стоит по умолчанию. Получите ошибку что установлен.

Вы забыли про дропы или реджекты icmp трафика, по мимо этого о syn/ack/fin/urg/psh пакетов
+ ко всему можно подпилить ещё и sysctl.conf
+ по мимо коннлимитов можно запилить :
/sbin/iptables -N syn-flood
/sbin/iptables -A syn-flood -m limit --limit 10/sec --limit-burst 15 -j RETURN
/sbin/iptables -A syn-flood -j LOG --log-prefix "SYN flood: "
/sbin/iptables -A syn-flood -j DROP
, что будет записывать в логи и дропать более syn 15 соединений за 10 секуд

P.s немного дополню :
/
***Скрытый текст не может быть процитирован.***
Я ничего не забыл, эти правила Вас даже от hping3 не спасут, прос будет в 100% загрузки, поэтому и добавлять нет смысла.
 
Я ничего не забыл, эти правила Вас даже от hping3 не спасут, прос будет в 100% загрузки, поэтому и добавлять нет смысла.
ICMP закрывается в 99% случаев на аппаратке, по поводу правил от syn/ack и т.п пакетов - это помогает в случае того же VAC , который на 99.9% пропускает ACK/PTR флуд (я говорю о некоторых обходов самого вака)
 
iptables - он там стоит по умолчанию. Получите ошибку что установлен.
все зависит от того, что за машинка и где.
Оффтоп:
Like most other Linux distributions, CentOS 7 uses the netfilter framework inside the Linux kernel in order to access packets that flow through the network stack. This provides the necessary interface to inspect and manipulate packets in order to implement a firewall system.
Most distributions use the iptables firewall, which uses the netfilter hooks to enforce firewall rules. CentOS 7 comes with an alternative service called firewalld which fulfills this same purpose
 
ICMP закрывается в 99% случаев на аппаратке, по поводу правил от syn/ack и т.п пакетов - это помогает в случае того же VAC , который на 99.9% пропускает ACK/PTR флуд (я говорю о некоторых обходов самого вака)
Если на вас будет лететь 1 MPPS синфлуда и все адреса будут рандомные (спуфинг), а это в последнее время так и есть, вас никакой iptables не спасет.
icmp как вы видите на этом скрипте не описаны и будут дропаться по последней строке.

Цель же данного мануала не защита от DDoS а защита сервера от взлома, ибо от современных DDoS атак защититься можно только на аппаратном уровне.

все зависит от того, что за машинка и где.
Оффтоп:
Like most other Linux distributions, CentOS 7 uses the netfilter framework inside the Linux kernel in order to access packets that flow through the network stack. This provides the necessary interface to inspect and manipulate packets in order to implement a firewall system.
Most distributions use the iptables firewall, which uses the netfilter hooks to enforce firewall rules. CentOS 7 comes with an alternative service called firewalld which fulfills this same purpose

Не зависит, iptables включен по умолчанию во все дистрибутивы CentOS, начиная от 5 версии и до текущей седьмой. В дистрибутивы minimal-install от включен так же по дефолту.
 
Последнее редактирование:
Если на вас будет лететь 1 MPPS синфлуда и все адреса будут рандомные (спуфинг), а это в последнее время так и есть, вас никакой iptables не спасет.
icmp как вы видите на этом скрипте не описаны и будут дропаться по последней строке.

Цель же данного мануала не защита от DDoS а защита сервера от взлома, ибо от современных DDoS атак защититься можно только на аппаратном уровне.
Если будет лететь 1кк pps - то вакум включиться , а я говорю о обходе их sensor мода (берём любой бутер или стрессер - пинаем ovh аск флудом = проффит)
Я говорю о прикрытии косяков самой VAC
 
Все равно мы походу о разных вещах говорим. Хорошо, давайте пройдемся по Вашему дополнению.

/sbin/iptables -A syn-flood -m limit --limit 10/sec --limit-burst 15 -j RETURN
/sbin/iptables -A syn-flood -j LOG --log-prefix "SYN flood: "
/sbin/iptables -A syn-flood -j DROP


Данная конфигурация работает только в том случае, еслм флуд летит с одного IP адреса.
Теперь предположите ситуацию, когда на Вас летит скажем 10-20 тысяч SYN закетов запросов на соединение и каждый запрос с разного IP адреса (спуфинг), будет ли работать эта комбинация ? Очень сомневаюсь в этом :)

iptables -A syn-flood -j LOG --log-prefix "SYN flood: "

Вы хорошо подумали о том, чтобы при DDoS посыпать это в логи? Вам ресурсов сервера не жалко? В определенных случаях можно получить лог размером, который займет все место на харде.

Далее вернемся к iptables -A syn-flood -m limit --limit 10/sec --limit-burst 15 -j RETURN

Меня брутили используя несколько тысяч проксей по списку, при этом 1 запрос с одного прокси, второй с другого и так поочередности в несколько пакетов. Не будет у Вас работать эта комбинация при этом.

iptables -A INPUT -p icmp -j DROP

Посмотрите внимательно мой конфиг, там где нибудь описано icmp ? Нет? А раз нет, то для него правило одно, последнее $IPT -A INPUT -j DROP и смысла нет никакого вообще отдельно добавлять в конфиг дроп icmp протокола.

Теперь вернемся к флуду ACK-ами. У айпитаблеса с этим тяжеловато, причем ваш папирус который Вы указали выше не будет работать если Вас будут асками флудить. Не верите - проверьте.

В плане ACK на FreeBSD в фаерволе IPFW с этим можно бороться методом выставления в начало правил check-state а сразу же ниже рубить все аски, но в сами правила добавлять keep-state. Если соединение успешно установлено оно будет разрешаться check-state, при этом если летит ACK флуд то он будет прекрасно резаться правилом дропа асков после правила check-state.
Но тут нас ожидает то же засада, в таком режиме фаервол будет работать в режиме контроля состояния соединений и все коннекты на запрос коннекта и полуоткрытые будет держать в памяти, и если при этом на Вас полетит SYN флуд вместо ACK флуда - серверу крышка меньше чем за минуту, думаю догадываетесь из за чего :) .

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

А относительно DDoS - Эта уже другая тема. Фаерволами с этим бесполезно бороться.
Ибо есть железо специально для этого предназначенное. Только вот стоит оно как бентли и достать не так просто.
 
Последнее редактирование:
попробовал твои настройки
debian 8

тачка уходит в софтребут через 10-15 мин.

/del
это овх ложил мою тачку, ибо не мог достучатся до нее...

Хорошо что вспомнил про эту тему, у кого овх нужно дописать:
Вместо "x" ваш ип.

 
Последнее редактирование модератором:
Если уже бампнули тему полуторагодичной давности — добавлю и свои 5 монет.
# сбрасываем все при запуске
$IPT -F
$IPT -X
$IPT -Z
Это сбросит не все, а только то, что в таблице filter. Чтобы сбросить все таблицы — воспользуйся циклом.
Код:
for ipt_table in raw mangle nat filter security
do
        $ipt -t $ipt_table -F
        $ipt -t $ipt_table -X
        $ipt -t $ipt_table -Z
done


$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
Уже все очистили, зачем еще раз? Если цепочка не указана явно, то очищаются все (не только стандартные) существующие в таблице. Иными словами, $ipt -F равносильно
Код:
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F MY_CUSTOM_CHAIN
$IPT -F ...


# Разрешаем подключаться к порту MySQL только с разрешенных IP
Для веб-сервера это еще ладно, а вот разрешать целым подсетям коннект к базе — это так себе. Если у тебя динамический IP, то воспользуйся local port forwarding посредством ssh — очень полезная штука.

# Все что не подпало под описанные правила - дропаем
$IPT -A INPUT -j DROP
Это лишнее, так как все что не попало под описанные правила, будет обрабатываться политикой по умолчанию, которую ты указал в DROP ($IPT -P INPUT DROP)

Активируем скрипт при запуске системы:

# chmod +x /etc/rc.d/rc.local
# vi /etc/rc.d/rc.local


Нажимаем Insert и дописываем туда:
/etc/init.d/rc.firewall

В CentOS 7 используется systemd, поэтому чтобы добавлять правила при загрузке сервера выполни:
Код:
iptables-save > /etc/sysconfig/iptables
и
systemctl enable iptables
При старте сервера будет выполняться
Код:
iptables-restore < /etc/sysconfig/iptables
что, собственно, и загрузит сохраненные правила.
systemctl enable iptables сработает, если ты установил iptables-services ранее, как советовал Rekt4Life
yum install iptables-services
 
Для веб-сервера это еще ладно, а вот разрешать целым подсетям коннект к базе — это так себе. Если у тебя динамический IP, то воспользуйся local port forwarding посредством ssh — очень полезная штука.
а вот тут можно по подробнее?
 
DarkEmpire, из man:
-L [bind_address:]port:host:hostport
-L [bind_address:]port:remote_socket
-L local_socket:host:hostport
-L local_socket:remote_socket
Specifies that connections to the given TCP port or Unix socket
on the local (client) host are to be forwarded to the given host
and port, or Unix socket, on the remote side.
...
By default, the local port is bound in accordance with the
GatewayPorts setting. However, an explicit bind_address may be
used to bind the connection to a specific address. The
bind_address of “localhost” indicates that the listening port be
bound for local use only, while an empty address or ‘*’ indicates
that the port should be available from all interfaces.​
Например,
Код:
ssh user@server -L 1234:127.0.0.1:80
где 1234 — это порт на локальной машине, 127.0.0.1:80 — это адрес и порт на который сервер будет форвардить трафик, в данном примере на себя. Таким образом, если ты напишешь у себя в браузере (или через telnet) 127.0.0.1:1234, то попадешь на то, что слушает 80 порт на сервере. Это можеть быть веб-сервер или что-то другое.

Также можно форвардить трафик не только на себя, а куда угодно. Например, у тебя есть супер секретный сервер, доступ к которому есть только по ssh и только с определенных IP. Одним из таких IP является твой другой сервер, доступ к которому есть отовсюду. Теперь, чтобы не делать ssh сначало на обычный сервер, а потом с него ssh на супер секретный можно воспользоваться форвардингом:
Код:
ssh user@not_secret_server.com -L 1234:super_secret_server.com:22
После этого со своей машины пишешь ssh -p 1234 user@127.0.0.1 и попадаешь на секретный сервер.

Пример с MySQL будет выглядеть так:
Код:
ssh user@server -L 3306:127.0.0.1:3306
И потом в локальном phpMyAdmin или в том что ты используешь, указываешь коннект на 127.0.0.1 3306. Правда, последний раз когда я пользовался MySQL нужно было форвардить не порт, а сокет — благо, ssh это умеет.

Для удобности, можно добавить ключи -f и -N.
-f, отправит комманду в бэкграунд;
-N, не будет запускать bash. Очень удобно, и супер полезно, если на сервере у юзера стоит /bin/false или /bin/nologin.​
Таким образом конечная комманда будет:
Код:
ssh user@server -L 3306:127.0.0.1:3306 -fN
Также можно биндить не только на локальный 127.0.0.1, а и на 192.168.0.1 или на свой публичный адрес, позволяя коннет извне. Например:
Код:
ssh user@server -L 1.2.3.4:22:127.0.0.1:22
Как написано в man, контролируется это директивой GatewayPorts.

Ах да, это примеры для Linux клиента. В putty для винды этим тоже можно пользоваться, категория SSH -> Tunnels. И еще, существует и remote port forwarding (ключ -R) — это вообще, супер опасная тема в корпоративной среде. Дает возможность обходить файрволы на раз-два.
 
Хотел спросить, скрипт актуален на 2018г, или есть дополнения к нему?
Пользуюсь машиной ovh, нужно дописывать правила как в посте от DarkEmpire,
Хорошо что вспомнил про эту тему, у кого овх нужно дописать:
Вместо "x" ваш ип.

***Скрытый текст не может быть процитирован.***
Спасибо.
 
все таки сделаю некроспорт

--connlimit-above это конечно круто в связке с лсом и гсом, а кто то пробовал юзать --hashlimit-above?
если да, то как это правильно реализовать, если быть конкретнее: --connlimit-above ограничивает количество одновременных соединений клиента, а как ограничить количество получаемых пакетов в секунду от клиента

скорее всего на примере логина, это долго выглядеть примерно вот так:

Bash:
$IPT -A INPUT -p tcp -i $IFACE --dport 2106 -m connlimit --connlimit-above 5 -j DROP
$IPT -A INPUT -p tcp -i $IFACE --syn --dport 2106 -m hashlimit --hashlimit 5/second --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name ls -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE --syn --dport 2106 -j DROP
 
подкину вам запрет для IPTables на 10 стран. знающие поймут че к чему
 

Вложения

  • IPTabless.rar
    272,6 КБ · Просмотры: 20
подкину вам запрет для IPTables на 10 стран. знающие поймут че к чему
забыл про это, просто юзаю провайдеров с фаерволами в лк, типо ovh и hetzner
достаточно блочить конекты по 22 и 3306 порту и открыть только для своего пк\веб

даже есть решения без фаервола: меняешь порт ssh, так как все брутят дефолтные порты
а с бд, просто не юзать root и лочить к нему доступ из вне, так как в основном все брутят root и прочие дефолтные юзеры, а основого юзера нужно будет еще угадать
 
все таки сделаю некроспорт

--connlimit-above это конечно круто в связке с лсом и гсом, а кто то пробовал юзать --hashlimit-above?
если да, то как это правильно реализовать, если быть конкретнее: --connlimit-above ограничивает количество одновременных соединений клиента, а как ограничить количество получаемых пакетов в секунду от клиента

скорее всего на примере логина, это долго выглядеть примерно вот так:

Bash:
$IPT -A INPUT -p tcp -i $IFACE --dport 2106 -m connlimit --connlimit-above 5 -j DROP
$IPT -A INPUT -p tcp -i $IFACE --syn --dport 2106 -m hashlimit --hashlimit 5/second --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name ls -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE --syn --dport 2106 -j DROP
Тогда уже --hashlimit-mode srcip, если хотите ограничить кол-во пакетов получаемых от 1го конкретного ip.
И разумеется кол-во пакетов подбирается индивидуально и опытным путём для каждого случая.
 
Тогда уже --hashlimit-mode srcip
так и думал что где то косяк, не нашел описания данных переменных
на счет пакетов в секунду, да тут уже индивидуально разве что на гс
на логин 5 пакетов в секунду я думаю хватит
 
Когда-то давно заказывал скрипт под centos у сис.админа (fhost.ee) вот такой вот скрипт:
Код:
#!/bin/sh

modprobe ipt_TTL
modprobe ip_nat_ftp

########### сброс всего
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

### установка дефолтных правил
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT

### разные запреты
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

### Запрещаем пинг и UDP
iptables -t filter -A INPUT -p icmp -j DROP
iptables -t filter -A INPUT -p udp --sport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp -j DROP

### Blocked ip
#iptables -A INPUT -s xxx.xxx.xxx.xxx-j REJECT

### localhost
iptables -t filter -A INPUT -s 127.0.0.1 -j ACCEPT

### Разрешаем udp для ntp
iptables -A INPUT -s 192.168.0.0/16 -m state --state NEW -p udp --dport 123 -j ACCEPT

### Разрешоные TCP порты
#iptables -t filter -A INPUT -p tcp --dport 20202 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 5 -j DROP
iptables -t filter -A INPUT -p tcp --dport 2106 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 2106 -m connlimit --connlimit-above 5 -j DROP
iptables -t filter -A INPUT -p tcp --dport 7777 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 7777 -m connlimit --connlimit-above 10 -j DROP

### разрешаем уже устанновленные подключения
iptables --table filter --append INPUT -m conntrack --ctstate ESTABLISHED --jump ACCEPT
iptables --table filter --append OUTPUT -m conntrack --ctstate ESTABLISHED --jump ACCEPT
iptables --table filter --append INPUT -m conntrack --ctstate RELATED --jump ACCEPT
iptables --table filter --append OUTPUT -m conntrack --ctstate RELATED --jump ACCEPT
iptables --table filter --append INPUT --in-interface lo -m conntrack --ctstate NEW --jump ACCEPT
iptables --table filter --append OUTPUT --out-interface lo -m conntrack --ctstate NEW --jump ACCEPT

### Full access
#iptables -t filter -A INPUT -s xxx.xxx.xxx.xxx-j ACCEPT

Полезный скрипт али так се? ?‍♂️
 
Назад
Сверху Снизу