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

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

Alligat0r

Путник
Пользователь
Сообщения
77
Розыгрыши
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

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

DarkEmpire, первым открываем, вторым лимитируем к-во соединений и при превышении дропаем лишние.
Не уверен что второе правило будет работать без первого (если по принципу запретить все кроме разрешенных).
 
так дроп же при условии что количество конектов будет превышено
 
Теперь я что-то засомневался в ценности данного правила :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
Назад
Сверху Снизу