Заборонити всі вхідні з'єднання з 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.