Как убедиться, что порт SSH открыт только для определенного IP-адреса?


42

Это мое /etc/sysconfig/iptables:

Он имеет два порта, открытых 80 Apache и 22 для SSH.

# 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-адреса.

пример ip:

1.2.3.4

Пожалуйста, не обращайте внимания на любые упущения / опасения относительно того, что если мой ip изменится и я не смогу больше использовать SSH на своем сервере.

Ответы:


47

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

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

В этом случае вы открываете ssh-порт только для YourIP, если вам нужно открыть 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поддерживает инверсию с оператором bang на тот случай, если вы хотите выполнить таргетинг DROP. Пример:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Братчли

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

1
Это не сработало для меня, потому что по умолчанию для -I (вставка) вставляется как правило # 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 ВВОДА (при условии, что вы вставляете два ПРИНЯТА, в противном случае, если только один ПРИНЯТ, тогда используйте «2» для ВВОДА.
Кевин Триплетт,

@Networker Using -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 без запроса пароля.

Пожалуйста, имейте в виду, что cronjob с

iptables -X
iptables -F

может быть умным, поэтому вы не будете заблокированы на сервере с помощью SSH (cronjob сбросит IPtables, чтобы вы снова получили доступ). Если у вас все еще есть доступ, вы можете удалить cronjob и снова настроить свои IPtables.


Cronjob просто удалил брандмауэр, хотя. Зачем настраивать iptablesв первую очередь? Некоторая форма внеполосного доступа является обычным методом. knockdДругой.
Мэтт

@mtm Да, когда вы заблокированы, cronjob сбросит настройки IPtables, чтобы вы снова могли получить доступ к SSH. Причины, по которым люди используют IPtables разные, я считаю, что это эффективный, простой и гибкий межсетевой экран.
Уильям Эдвардс

2
ова. Вы имеете в виду запускать сброс один раз во время установки, а не по расписанию. atделает это
Мэтт

4
Создание белого списка только вашего IP, а затем разрешение входа в систему без пароля кажется ужасной идеей.
Алекс W

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

5

Другие ответы используют iptables -Iв своих примерах, что часто не то, что вы должны использовать.

iptables выполнит первое соответствующее правило, поэтому порядок правил очень важен. -Iявляется командой «insert» и должна использоваться с параметром index, чтобы указать, где в списке принадлежит данное правило. -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.