Запретить все входящие соединения с iptables?


17

Я хочу сделать несколько простых правил iptables, чтобы запретить все входящие соединения и разрешать исходящие. Как я могу это сделать?

Ответы:


26

Попробуйте это с правами 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.


2
Когда я выполняю первую строчку вашего правила, меня отключают от SSH
holms

7
Вопрос «запретить все входящие подключения», а не «запретить все входящие подключения, кроме SSH» :)
Yohann

Я прочитал предупреждение @holms о первом правиле слишком поздно ...
ДенисКолодин

Обратите внимание, что это не влияет на трафик ipv6. Прочтите мой ответ ниже, если у вас включен ipv6.
Bhelm

13

Если вы работаете удаленно через SSH, вы можете добавить это ( -Iвставляет перед всеми другими правилами INPUT):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

Если ваша служба SSH прослушивает другой порт, вам придется использовать этот порт вместо 22.

В противном случае вы можете случайно потерять доступ.


2

Имейте в виду, что другие ответы не охватывают IPv6! Если ваша система принимает трафик IPv6, ни одно правило iptables не будет применяться к трафику ipv6.

вместо непосредственного использования iptables / ip6tables, я рекомендую использовать iptables-restore и save. Эти инструменты позволяют указать конфигурацию iptables с несколькими правилами и легко загрузить ее одной командой.

создайте файл (я назвал его iptables.rules) со следующим содержанием:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

Обратите внимание, я добавил несколько дополнительных примеров, если вы хотите разрешить ICMP и трафик на определенные порты.

Теперь вы можете загрузить его с помощью следующих команд:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

Теперь ваши правила распространяются также на ipv6 и просты в управлении.

Дополнительное примечание для пользователей Debian: если вы удовлетворены своими правилами, вы можете apt install iptables-persistentвосстановить правила после перезагрузки. Правила не сохраняются автоматически при выключении, поэтому запустите netfilter-persistent saveдля обновления постоянных правил.


1

Оба ответа выше как-то верны, но они недостаточно точны, чтобы дать ответ. (Извините, у меня недостаточно репутации, чтобы добавить комментарий, поэтому пишите полный ответ).

В моем случае я встретил перегруженный сервер 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чтобы сохранить исходящий трафик (он не будет отправлять маяк отклонения)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.