Як переконатися, що порт SSH відкритий лише для певної IP-адреси?


42

Це моє /etc/sysconfig/iptables:

Він має два порти, відкриті 80 апаш і 22 для сш.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Для порту 22 (SSH) я хочу переконатися, що ніхто не може підключитися до цього порту, крім конкретної ip-адреси.

example ip:

1.2.3.4

Будь ласка, ігноруйте будь-який нагляд / занепокоєння щодо того, що робити, якщо мій ip зміниться, і я більше не можу SSH на свій сервер.

Відповіді:


47

якщо я отримав питання правильно, ви хочете, щоб ваш сервер був доступний лише з певної IP-адреси на порт 22, ви можете оновити Iptables для цього:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

У такому випадку ви відкриваєте порт ssh лише для вашогоIPIP, якщо вам потрібно відкрити DNS для вашої внутрішньої мережі:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

Після додавання та відкриття для цих IP-адрес вам потрібно закрити двері для решти IP-адрес

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(Переконайтеся, що ви встановили правила у правильному положенні у вашому наборі правил. iptables -A INPUTДодайте правила до кінця того, INPUTяк є зараз.)

або як сказав Джоел, ви можете замість цього додати одне правило:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

або ви можете просто встановити політику за замовчуванням на брандмауері за допомогою

iptables -P INPUT DROP

Коротко, як це представлено в цьому запитанні про SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

2
Також варто зауважити, що iptablesпідтримує інверсію з оператором нахилу, якщо ви хочете зробити цілеспрямований DROP. Приклад:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Братчлі

1
Крім того, безумовні DROP's дійсно не потрібні, ви можете просто встановити політику за замовчуванням на брандмауері iptables -P INPUT DROPі відпустити це на цьому. Ви, ймовірно, також хочете зробити їх як додаток, якщо зробите їх таким чином, інакше весь трафік буде зачеплений DROPі ніколи не досягне вашого ACCEPTправила.
Братчлі

1
Для мене це не спрацювало, тому що за замовчуванням для -I (insert) є вставляти як правило №1, тому DROP вставляється як правило №1 і оцінюється спочатку, і тому випадає всі пакети ssh, ніколи не оцінюючи правило ACCEPT. Ви повинні виконати, iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPа iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROP"3" після INPUT означає вставити як Вхідне правило №3 (якщо припустити, що ви вставляєте два ACCEPTS, інакше, якщо лише один ACCEPT, тоді використовуйте "2" для INPUT.
Kevin Triplett

@Networker Використання -Iвставить нові правила iptables вгорі. Як такий, ви можете в кінцевому підсумку подати краплі ще дозволити Я пропоную використовувати -Aнатомість
BlueCacti

1
ну я заблокував себе, gj
ngwdaniel

6

Хоча я рекомендую використовувати ключі SSH, я дам вам пояснення.

Вам не доведеться використовувати IPtables для того, що ви намагаєтеся досягти. Є кілька способів. Це спосіб IPtables:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = Ваш домашній IP (досить простий)

[SSH_PORT] = Порт, на якому запущено SSH (за замовчуванням 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

Це гарантує, що ніхто, крім вашого IP-адреси, не може входити в SSH.

Є ще один спосіб - додавання чогось до sshd_config.

Додайте наступне:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Це дозволяє увійти в SSH як rootкористувач із своєї IP-адреси, не запитуючи пароль.

Будь ласка, майте на увазі, що кроніог с

iptables -X
iptables -F

може бути розумним, тому ви не будете заблоковані з вашого сервера за допомогою SSH (cronjob скидає IPtables, тому ви знову отримаєте доступ). Якщо у вас все ще є доступ, ви можете видалити cronjob і знову налаштувати свої IPtables.


Кронйобіт просто видалить брандмауер. Навіщо встановлювати iptablesв першу чергу? Певна форма доступу поза діапазону - це звичайний метод. knockdінша.
Метт

@mtm Так, коли ви заблокували, cronjob скине налаштування ваших IPtables, тож ви зможете знову отримати доступ до SSH. Причини, через які люди використовують IPtable, різні, на мою думку, це ефективний, простий та гнучкий брандмауер.
Вільям Едвардс

2
оїк. ви маєте на увазі запустити флеш один раз під час налаштування, а не регулярно планувати. atробить це.
Метт

4
Білий список лише вашого IP-адреси, а потім дозволяти кореневий логін без пароля здається жахливою ідеєю.
Alex W

1
@AlexW Я знаю, що минув час, але я все ж хотів прокоментувати: Without-Passwordозначає, що автентифікація пароля заборонена, тому вам доведеться використовувати автентифікацію ключа SSH. Це дійсно трохи незрозуміло назвати цей метод аутентифікації. Але це не означає, що вам не потрібен пароль для входу як root. Тим не менш, більш безпечним методом є встановлення PermitRootLogin noта використання іншого акаунта sudo для входу, оскільки root є загальною ціллю
BlueCacti

5

Інші відповіді використовують iptables -Iу своїх прикладах, що часто не є тим, що вам слід використовувати.

iptables виконає перше правило, яке відповідає, тому порядок правил дуже важливий. -Iє командою "вставити", і її слід використовувати з параметром індексу, щоб вказати, де в списку належить дане правило. -A- це команда "додати", яка додасть правило до кінця списку.

У деяких дистрибутивах (можливо, у всіх) використання -Iбез параметра індексу додасть правило до індексу, зробивши його першим правилом перевіреним. У цьому випадку, якщо остання команда, яку ви запускаєте, iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPто iptables знизить увесь трафік, незалежно від того, чи є у вас ACCEPTпізні правила в ланцюжку чи ні.

Ось зразок налаштування правила, яке дозволяє SSH лише з одного IP:

Початок без правил:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Додайте нове правило "дозволити SSH від 1.2.3.4":

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

Блокуйте SSH від усіх інших IP-адрес:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

Тепер ваш ланцюжок INPUT буде виглядати так:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Пізніше, якщо вам потрібно додати в білий список другий IP, ви можете використовувати -Iпараметр, щоб розмістити його перед правилом чорного списку.

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Зауважте, що, використовуючи -I INPUT 2додане нове правило, як правило №2, і стикається правило DROP на номер 3.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.