Я хочу сделать несколько простых правил iptables, чтобы запретить все входящие соединения и разрешать исходящие. Как я могу это сделать?
17
Попробуйте это с правами root:
# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Обратите внимание, что это жестоко прервет все работающие соединения - это включает в себя такие вещи, как соединение SSH, которое вы можете использовать для администрирования сервера. Используйте это только если у вас есть доступ к локальной консоли.
См. Ответ Miphix о том, как добавить исключение для SSH.
Если вы работаете удаленно через SSH, вы можете добавить это (
-I
вставляет перед всеми другими правиламиINPUT
):Если ваша служба SSH прослушивает другой порт, вам придется использовать этот порт вместо
22
.В противном случае вы можете случайно потерять доступ.
источник
Имейте в виду, что другие ответы не охватывают IPv6! Если ваша система принимает трафик IPv6, ни одно правило iptables не будет применяться к трафику ipv6.
вместо непосредственного использования iptables / ip6tables, я рекомендую использовать iptables-restore и save. Эти инструменты позволяют указать конфигурацию iptables с несколькими правилами и легко загрузить ее одной командой.
создайте файл (я назвал его iptables.rules) со следующим содержанием:
Обратите внимание, я добавил несколько дополнительных примеров, если вы хотите разрешить ICMP и трафик на определенные порты.
Теперь вы можете загрузить его с помощью следующих команд:
Теперь ваши правила распространяются также на ipv6 и просты в управлении.
Дополнительное примечание для пользователей Debian: если вы удовлетворены своими правилами, вы можете
apt install iptables-persistent
восстановить правила после перезагрузки. Правила не сохраняются автоматически при выключении, поэтому запуститеnetfilter-persistent save
для обновления постоянных правил.источник
Оба ответа выше как-то верны, но они недостаточно точны, чтобы дать ответ. (Извините, у меня недостаточно репутации, чтобы добавить комментарий, поэтому пишите полный ответ).
В моем случае я встретил перегруженный сервер Apache, переполненный заданиями cron, чрезмерно использующий процессор. Пределы потоков были сохранены в базе данных SQL, но я встретил предел его соединений. Я хотел ограничить входящие соединения Apache от локального хоста (эта часть не является обязательной), но оставил все остальные соединения возможными. Включая те, которые были фактически установлены.
Я сделал это с командой
sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT
Это означает: для каждого входящего пакета tcp через порт 80 загрузите
state
модуль и, если это первый пакет (входящее соединение), отклоните его. Для localhost вы можете просто использовать-s 127.0.0.0/8
А для реального использования, в некоторых случаях вы можете добавить «INVALID» в состояния
NEW,INVALID
, потому что можно отправлять «вредоносные» пакеты, пытаясь обойти ваше правило. А также замените на,-j DROP
чтобы сохранить исходящий трафик (он не будет отправлять маяк отклонения)источник