Заборонити всі вхідні з'єднання з iptables?


17

Я хочу зробити кілька простих правил iptables, щоб заперечувати всі вхідні з'єднання та дозволяти вихідні. Як я можу це зробити?

Відповіді:


27

Спробуйте це з кореневим доступом:

# 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 про перше правило занадто пізно ...
— DenisKolodin

Зауважте, що це не впливає на ipv6 Traffic. Прочитайте мою відповідь нижче, якщо ввімкнено ipv6.
— bhelm

13

Якщо ви працюєте віддалено через SSH, ви можете додати це ( -Iвставляє його перед усіма іншими правилами в INPUT):

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

Якщо ваша служба SSH прослуховується на іншому порту, вам доведеться використовувати цей порт замість 22.

В іншому випадку ви можете випадково втратити доступ.


3

Майте на увазі, що інші відповіді не стосуються IPv6! Якщо ваша система приймає трафік IPv6, до трафіку ipv6 не застосовуватиметься жодне правило iptables.

замість використання iptables / ip6tables безпосередньо, я рекомендую використовувати iptables-відновлення та збереження. Ці інструменти дозволяють задати конфігурацію 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.