Відповіді:
Спробуйте це з кореневим доступом:
# 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
):
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
Якщо ваша служба SSH прослуховується на іншому порту, вам доведеться використовувати цей порт замість 22
.
В іншому випадку ви можете випадково втратити доступ.
Майте на увазі, що інші відповіді не стосуються 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
щоб оновити стійкі правила.
Обидві відповіді вище якось правильні, але вони недостатньо точні, щоб відповісти на походження. (Вибачте, у мене недостатньо репутації, щоб додати коментар, тому пишуть повну відповідь).
У моєму випадку я зустрів перевантажений сервер 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
щоб зберегти вихідний трафік (він не надсилатиме маяк відхилення)