Вступление
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