Вступление
iptablesэто мощный инструмент, используемый для настройки встроенного брандмауэра ядра Linux. Он предустановлен в большинстве дистрибутивов Ubuntu, однако, если вы используете настроенную версию Ubuntu или работаете внутри контейнера, вам, скорее всего, придется установить ее вручную.
sudo apt-get install iptables iptables-persistent
После установки, если вас спросят, сохранять ли ваши текущие правила, это не имеет значения в данный момент, поскольку вы собираетесь удалить или создать новые правила позже.
подсказки
Вы можете использовать netcatкоманду (на компьютере, отличном от вашего сервера), чтобы проверить, какие порты открыты или закрыты.
nc -z -w5 -v SERVER_IP PORT
nc это команда netcat
-z просто отправьте пакет без полезной нагрузки.
-w5 подождите до 5 секунд ответа.
-v подробный режим.
- Замените
SERVER_IPадрес вашего сервера.
- Замените
PORTна порт, который вы хотите проверить, если он открыт (например 22).
На вашем сервере вы можете использовать netstatкоманду, чтобы увидеть, какие порты в настоящее время прослушивают соединения.
sudo netstat -tulpn
Примечание. Хотя netstatэто удобно для поиска портов, с которыми вы хотите работать, вы должны знать о приложениях, которые вы в настоящее время установили на своем сервере, и какие порты прослушиваются, вам не нужно разрешать каждый порт, который вы найдете в netstatвыходных данных .
Синтаксис
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
-A INPUTдобавить правило в INPUTцепочку, цепочка - это группа правил, которыми мы чаще всего будем пользоваться в этом руководстве INPUT, OUTPUTи PREROUTING.
-p tcpустановить tcpв качестве протокола, к которому будет применяться это правило, также можно использовать другие протоколы, такие как udp, icmpили all.
-m tcpиспользовать tcpмодуль. iptablesподдерживает дополнительные функции через модули, некоторые из которых уже предустановлены, iptablesа другие, например, geoipмодуль.
--dport 22Команды, начинающиеся с, --указывают на дополнительные опции для ранее использованного модуля, в этом случае мы сообщим, что tcpмодуль применяется только к порту 22.
-m geoipиспользовать geoipмодуль. Он будет ограничивать пакеты в зависимости от страны (дополнительная информация на шаге 5).
--src-cc PEскажите geoipмодулю ограничить входящие пакеты теми, которые приходят из Перу. Для получения дополнительных кодов стран ищите ISO 3166 country codesв Интернете.
-j ACCEPT-jаргумент указывает , iptablesчто делать , если пакет соответствует ограничениям , указанным в предыдущих рассуждениях. В этом случае это будут ACCEPTте пакеты, другие варианты REJECT, DROPи многое другое. Вы можете найти больше вариантов, выполнив поиск iptables jump targetsв Интернете.
1. Основы
Перечислите все правила.
sudo iptables -L
Перечислите все команды, которые использовались для создания используемых в настоящее время правил, полезных для редактирования или удаления правил.
sudo iptables -S
Чтобы удалить конкретное правило, выберите правило sudo iptables -Sи замените его -Aна -D.
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Перечислите все пронумерованные правила в INPUTцепочке.
sudo iptables -L INPUT --line-numbers
Удалить пронумерованное правило.
sudo iptables -D INPUT 2
Очистить все правила.
sudo iptables -F
Предупреждение: вы можете потерять соединение, если подключены по SSH .
Очистить только правила в OUTPUTцепочке.
sudo iptables -F OUTPUT
2. Создайте начальные правила
Разрешить SSHна eth0интерфейсе
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-i eth0 применить правило к определенному интерфейсу, чтобы разрешить из любого интерфейса удалить эту команду.
Чтобы ограничить входящие пакеты определенным IP (т.е. 10.0.3.1/32).
sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-s 10.0.3.1/32 указывает IP / подсеть, из которой разрешены соединения.
Установить правила цепочки по умолчанию.
Предупреждение: перед продолжением убедитесь, что вы применили правильные правила SSH при работе на удаленном сервере .
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
-P INPUT DROP запрещает все входящие пакеты (т.е. никто не сможет подключиться к вашим работающим серверам, таким как Apache, SQL и т. д.).
-P FORWARD DROP запрещает все перенаправленные пакеты (т.е. когда вы используете свою систему в качестве маршрутизатора).
-P OUTPUT ACCEPTразрешает все исходящие пакеты (т.е. когда вы выполняете HTTPзапрос).
Разрешить весь трафик по интерфейсу обратной связи ( рекомендуется ).
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
3. Сделайте правила постоянными
Сохранить текущие iptablesправила.
sudo netfilter-persistent save
sudo netfilter-persistent reload
Если вы работаете внутри контейнера, netfilter-persistentкоманда, скорее всего, не будет работать, поэтому вам нужно перенастроить iptables-persistentпакет.
sudo dpkg-reconfigure iptables-persistent
4. Разрешить исходящие соединения
Разрешить DNS-запросы.
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Используйте stateмодуль для разрешения RELATEDи ESTABLISHEDисходящих пакетов.
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Разрешить желаемые порты; в этом случае HTTPпорты.
sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
Больше портов вы можете использовать.
FTP: TCP в порту 21
HTTPS: tcp в порту 443
DHCP: udp в порту 67
NTP: udp в порту 123
Примечание. Если вы хотите разрешить, apt-getможет потребоваться разрешить FTPиHTTPS .
Разрешить возвращаемый трафик только для RELATEDуже ESTABLISHEDподключенных соединений ( рекомендуется, поскольку иногда требуется двунаправленная связь).
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Другие полезные правила
Разрешить пинг запросы извне.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Форвард трафик на eth0порт 2200в 10.0.3.21:22(полезно , если вы хотите , чтобы открыть сервер SSH , который работает внутри контейнера).
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22
Если вы успешно войдете на свой сервер с помощью SSH, будет создано постоянное соединение (т.е. никаких новых соединений, даже если вы подключены более 1 часа). Если вы ошибетесь и попытаетесь войти снова, будет создано новое соединение. Это заблокирует непрерывные попытки входа по SSH, ограничивая количество новых подключений в час.
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP
Перенаправить все запросы от порта 443к порту 4430(полезно, если вы хотите привязать порт 443без root).
sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
ens3 сетевой интерфейс.
-m geoip модуль блока страны (см. шаг 5).
Предупреждение: не используйте lo, ОС будет отбрасывать все пакеты, перенаправленные на интерфейс обратной связи .
5. Разрешить или заблокировать целые страны
5.1 Установить xtables-addons
Вы можете установить xtables-addonsмодуль, используя различные методы, не стесняйтесь использовать метод установки, который подходит вам лучше всего.
-
Установите с помощью apt-get.
sudo apt-get install xtables-addons-common
-
Установите с помощью module-assistant.
sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant --verbose --text-mode auto-install xtables-addons
-
Установить из источника.
sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
cd xtables-addons
./autogen.sh
./configure
make
sudo make install
Создайте базу данных "стран".
sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv
Перезагрузите вашу систему.
sudo reboot
После xtables-addonsуспешной установки, после первой перезагрузки, запустите, depmodиначе блокировка страны не будет работать должным образом (это требуется только в первый раз).
sudo depmod
Создайте скрипт /etc/cron.monthly/geoip-updaterдля обновления geoipбазы данных ежемесячно.
#!/usr/bin/env bash
# this script is intended to run with sudo privileges
echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip
echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl
echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater
Сделать /etc/cron.monthly/geoip-updaterисполняемым.
sudo chmod +x /etc/cron.monthly/geoip-updater
5.2 Пример правил
_Примечание: Если вы получаете сообщение iptables: No chain/target/match by that nameоб ошибке при попытке применить geoipправило, возможно, xtables-addonsоно установлено неправильно. Попробуйте другой способ установки.
Блокируйте все входящие пакеты из Китая, Гонконга, России и Кореи.
sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP
Разрешить входящие пакеты через порт 80отовсюду, кроме стран выше.
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Разрешить входящие пакеты на ens3интерфейс через порт 22только из Перу (не стесняйтесь выбирать код страны, из которой вы хотите принимать пакеты, например, USдля Соединенных Штатов).
sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT
Разрешить входящие пакеты на порт 443только из Перу.
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT