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

Мануал Грамотная настройка 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
    Спасибо за в клад в развитие форума
а в чем смысл данного действия
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

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

так дроп же при условии что количество конектов будет превышено
 
Теперь я что-то засомневался в ценности данного правила :D Может коли мы открыли этот порт, нужно ограничить к-во соединений на него с одного айпи, дабы обезопасится от флуда на этапе брандмауэра (не порождать новые соединения слушателем этого порта).
Может как то так?
 
есть смысл сделать разве что наоборот

iptables -t filter -A INPUT -p tcp --dport 7777 -m connlimit --connlimit-above 10 -j DROP
iptables -t filter -A INPUT -p tcp --dport 7777 -j ACCEPT

ибо правила работают же сверху вниз

но у меня работает вот так

iptables -A INPUT -p tcp -i eth0 --dport 2106 -m connlimit --connlimit-above 5 -j DROP
iptables -A INPUT -p tcp -i eth0 --dport 2106 -m hashlimit --hashlimit 5/second --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name ls -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 2106 -j DROP
 
Когда-то давно заказывал скрипт под 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

Полезный скрипт али так се? ?‍♂️
Не более чем мануал о том, как НЕ надо делать.

Чуть косяк при изменении правил и вы лишаетесь доступа к своему серверу.
С политикой DROP надо быть осторожнее. Вначале надо перевести её в ACCEPT, установить все нужные правила и только потом перевести её в DROP. Но не как не в самом начале указывать ей на DROP, а потом чистить все правила...

Такое, кстати, ещё выбросит всех игроков с сервера если применить скрипт с правилами во время работы.

Непонятно зачем плодить кучу разнообразных цепочек в такой конфигурации, также непонятно зачем указывать дополнительные DROP правила, когда глобальная политика и так в 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

Это вообще бесполезно. Второе правило не сработает, т.к выше него стоит разрешающее.
А в условиях DROP политики, эти два правила можно заменить одним с --connlimit-upto 10 и ACCEPT
 
@Seven, хорошая попытка, но моя версия доступна в рамках услуги настройки сетевой безопасности, стоимостью от 1200р. Если вам интересно, можете её заказать.
 
@Seven, хорошая попытка, но моя версия доступна в рамках услуги настройки сетевой безопасности, стоимостью от 1200р. Если вам интересно, можете её заказать.
Экскьз муа,май энглиш из вери бэд...Не знал извиняюсь...Огласите весь список пжалста.!)
 
  • Вау
Реакции: Evas
Назад
Сверху Снизу