Что такое Iptables?
Это прикладная программа, которая позволяет системному администратору настраивать таблицы, предоставляемые брандмауэром ядра Linux (реализованы в виде различных модулей Netfilter), цепей и правил.
Для того чтобы защищать от попыток взлома и фильтровать открытые порты на вашем виртуальном сервере, необходима правильная настройка брандмауэра.
Для того, чтобы сделать управление правилами брандмауэра вашего сервера проще, мы предоставим вам простой скрипт, который поможет с управлением правил брандмауэра. В принципе, всякий раз, когда вам необходимо изменить правила брандмауэра, вы будете использовать этот скрипт для добавления/удаления желаемого правила(ы).
Установка правил межсетевого экрана
Перед тем как записать правила в сценарии, давайте разобьем его на разделы, так что вы можете знать конструкцию брандмауэра и какие правила будут на месте.
Очистка старых правил
Правила брандмауэра могут быть сброшены с помощью следующих команд:
## iptables --flush ## iptables --delete-chain ## iptables --table nat --flush ## iptables --table nat --delete-chain
Сервис распознавания портов
Вы должны знать, какие порты у вас открыты, так что вы можете установить соответствующие правила для них. Один из способов найти какие порты прослушиваются можно с использованием команды netstat
или ss
:
## netstat -tunlp or ## ss -tunlp
например, мы используем один из наших виртуальных серверов Ubuntu 12.04 LTS и следующий вывод команды netstat
:
## netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 296/mysqld tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 449/sendmail: MTA: tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 590/apache2 tcp 0 0 209.135.140.77:53 0.0.0.0:* LISTEN 353/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 353/named tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 173/vsftpd tcp 0 0 0.0.0.0:5622 0.0.0.0:* LISTEN 630/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 449/sendmail: MTA: tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 353/named tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 590/apache2 tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 261/dovecot tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 261/dovecot udp 0 0 209.135.140.77:53 0.0.0.0:* 353/named udp 0 0 127.0.0.1:53 0.0.0.0:* 353/named
это означает, что мы открыли следующие порты для публики:
- 25 (SMTP)
- 587 (подача SMTP)
- 110 (pop3)
- 143 (IMAP)
- 993 (IMAP SSL)
- 995 (pop3 SSL)
- 80 (HTTP)
- 443 (HTTPS)
- 53 (DNS)
- 21 (FTP)
- 5622 (SSH)
Установка политики
ОК, так что теперь мы можем настроить политику нашего брандмауэра, настроить на DROP, INPUT и FORWARD и разрешить прохождение трафика в цепочке OUTPUT.
таблица по умолчанию filter
содержит три встроенных цепочки:
- Входящий трафик на имя самой машины попадает на входную цепочку.
- Outbound, локально сгенерированный трафик попадает в цепочку OUTPUT.
- Уходящий трафик, который не должен быть доставлен локально попадает в цепь FORWARD.
Проверить можно, набрав команду man 8 iptables
для получения дополнительной информации.
Политику по умолчанию можно установить с помощью следующих команд:
## iptables -P INPUT DROP # <- не запускайте это через SSH, а то будете заперты ## iptables -P FORWARD DROP ## iptables -P OUTPUT ACCEPT
Установка правила межсетевого экрана
Следующее, что нужно сделать, это установить правила брандмауэра. В качестве INPUT цепь DROPPED, мы должны создать белый список услуг, которые будут прослушиваться на портах:
## iptables -A INPUT -i lo -j ACCEPT ## iptables -A OUTPUT -o lo -j ACCEPT ## iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ## iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Далее, давайте откроем наши порты служб с помощью правил брандмауэра, так:
### SSH ## iptables -A INPUT -p tcp --dport 5622 -m state --state NEW -j ACCEPT ### HTTP ## iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT ### SMTP ## iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
и так далее. После того, как все эти услуги будут занесены в белый список, необходимо разрешить ICMP-пакеты, LOG и DROP все остальное во входной цепи.
## iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT ## iptables -A INPUT -j LOG ## iptables -A INPUT -j DROP
Сохранение/разворачивание правил межсетевого экрана
Правила брандмауэра не сохраняются по умолчанию, что означает, что они будут потеряны при перезагрузке виртуального сервера. Чтобы сохранить текущий брандмауэр /etc/fwall.rules
вы должны использовать что – то вроде этого:
## iptables-save > /etc/fwall.rules
и для восстановления сохраненных правил, вы будете использовать что-то вроде:
## iptables-restore -c /etc/fwall.rules
Чтобы сделать правила автоматически восстанавливать на старте системы, вы должны либо использовать пакет с именем iptables-persistent
или вы можете просто создать сценарий в /etc/network/if-pre-up.d
в котором будет загружаться правила, сохраненные в /etc/fwall.rules
, например:
## vim /etc/network/if-pre-up.d/iptables #!/bin/bash test -e /etc/fwall.rules && iptables-restore -c /etc/fwall.rules ## chmod +x /etc/network/if-pre-up.d/iptables
Сценарий брандмауэра
Сохраним сценарий в /usr/local/bin/fwall-rules
и сделаем его исполняемым
#!/bin/bash IPTABLES=/sbin/iptables echo " * удаление старых правил" ${IPTABLES} --flush ${IPTABLES} --delete-chain ${IPTABLES} --table nat --flush ${IPTABLES} --table nat --delete-chain echo " * настройка политике по умолчанию" ${IPTABLES} -P INPUT DROP ${IPTABLES} -P FORWARD DROP ${IPTABLES} -P OUTPUT ACCEPT echo " * разрешение loopback devices" ${IPTABLES} -A INPUT -i lo -j ACCEPT ${IPTABLES} -A OUTPUT -o lo -j ACCEPT ${IPTABLES} -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ## здесь блокируются нежелательные IPs ## #echo " * BLACKLIST" #${IPTABLES} -A INPUT -s _ABUSIVE_IP_ -j DROP #${IPTABLES} -A INPUT -s _ABUSIVE_IP2_ -j DROP echo " * разрешение ssh по порту 5622" ${IPTABLES} -A INPUT -p tcp --dport 5622 -m state --state NEW -j ACCEPT echo " * разрешение ftp по порту 21" ${IPTABLES} -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT echo " * разрешение dns по порту 53 udp" ${IPTABLES} -A INPUT -p udp -m udp --dport 53 -j ACCEPT echo " * разрешение dns по порту 53 tcp" ${IPTABLES} -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT echo " * разрешение http по порту 80" ${IPTABLES} -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT echo " * разрешение https по порту 443" ${IPTABLES} -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT echo " * разрешение smtp по порту 25" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT echo " * разрешение submission по порту 587" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT echo " * разрешение imaps по порту 993" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT echo " * разрешение pop3s по порту 995" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT echo " * разрешение imap по порту 143" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT echo " * разрешение pop3 по порту 110" ${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT echo " * разрешение ping responses" ${IPTABLES} -A INPUT -p ICMP --icmp-type 8 -j ACCEPT # DROP everything else and Log it ${IPTABLES} -A INPUT -j LOG ${IPTABLES} -A INPUT -j DROP # # Сохранение настроек # echo " * СОХРАНЕНИЕ ПРАВИЛ" if [[ -d /etc/network/if-pre-up.d ]]; then if [[ ! -f /etc/network/if-pre-up.d/iptables ]]; then echo -e "#!/bin/bash" > /etc/network/if-pre-up.d/iptables echo -e "test -e /etc/iptables.rules && iptables-restore -c /etc/iptables.rules" >> /etc/network/if-pre-up.d/iptables chmod +x /etc/network/if-pre-up.d/iptables fi fi iptables-save > /etc/fwall.rules iptables-restore -c /etc/fwall.rules
## chmod +x /usr/local/bin/fwall-rules
для активации правил вы подготовили сценарии, просто выполните его
## fwall-rules
из командной строки. Чтобы добавить или удалить правило, вам просто нужно просто открыть скрипт, добавить или удалить желаемое правило, сохранить и запустить его снова, например:
## fwall-rules * удаление старых правил * настройка политики по умолчанию * разрешение loopback devices * разрешение ssh по порту 5622 * разрешение ftp по порту 21 * разрешение dns по порту 53 udp * разрешение dns по порту 53 tcp * разрешение http по порту 80 * разрешение https по порту 443 * разрешение smtp по порту 25 * разрешение submission по порту 587 * разрешение imaps по порту 993 * разрешение pop3s по порту 995 * разрешение imap по порту 143 * разрешение pop3 по порту 110 * разрешение ping responses * СОХРАНЕНИЕ ПРАВИЛ
В следующей статье мы покажем вам, как вы можете обеспечить и защитить виртуальный сервер Ubuntu или Debian с помощью брандмауэра Iptables.
PS. Если вам понравился этот пост, поделитесь им с друзьями в социальных сетях помощью кнопок внизу поста или просто оставьте комментарий ниже. Заранее благодарю.