[Linux.wiki] Как закрыть доступ к ssh с помощью iptables.

Для повышения безопастности своего сервера путём ограничения доступа к вашему серверу по определённым протоколам и/или ip-address можно воспользоваться утилитой iptables.
iptables – это утилита которая предназначена для фильтрации пакетов и NAT (из man page).
iptables — administration tool for IPv4 packet filtering and NAT

С помощью iptables можно закрыть полностью или ограничить доступ, например к какому-либо TCP/UDP порту на вашем сервере, можно закрыть доступ к вашему серверу с какого-либо адреса или наоборот, разрешить доступ к какому-либо порту/протоколу только с определённого ip.
Вариантов очень много.

В данном посте я буду рассматривать работу iptables для ограничения доступа к ssh.
Если вы периодически смотрите на файл auth.log
cat /var/log/auth.log | grep sshd

,то через какое-то время после установки вашего сервера сможете заменить периодические попытки подломить ваш сервер. Лично у меня в логах фиксируются попытки подключения и подбора пароля для пользователя root с китайских ip-address.
Пользователем root подключиться к моему серверу нельзя, но кто знает, узнают ли они мой логин. Вдруг подберут или какой-нибудь backdoor найдётся в sshd.
В общем можно ограничить доступ по ssh к вашему сервер только с определённых ip-address.
Например, вы хотите иметь доступ к вашему серверу с домашнего ip-address и с рабочего. Возможно с какого-либо диапазона адресов, если у вас дома нет постоянного адреса…

Итак создаёт простой фильтр для ограничения доступа к ssh (Допустим у вас ssh слушается на стандартном порту 22):
# сбрасываем все настройки iptables:
sudo iptables -F
# открываем доступ для уже установленных соединений (или для пакетов приходящих в ответ на запросы с вашего сервера).
# В данном примере правило не нужно, но лучше его иметь всегда, чтобы не потерять доступ к серверу.
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Открываем доступ к серверу с адреса 192.168.56.2 к TCP порту 22:
# -j ACCEPT – разрешить доступ.
sudo iptables -A INPUT -s 192.168.56.2/32 -p tcp --dport 22 -j ACCEPT
# Открываем доступ с определённого диапазона адресов. Например, с диапазона адресов вашего провайдера домашнего Интернета:
sudo iptables -A INPUT -s 172.26.0.0/16 -p tcp --dport 22 -j ACCEPT
# Закрываем доступ к порту ssh/22 с любых других адресов:
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

Если у вас есть виртуальный сервер, то доступ к нему в случае какой-либо проблемы вы сможете получить через консоль.
Если доступа к консоли нет, то сервер можно просто перезагрузить в личном кабинете(обычно такая возможность есть). После перезагрузки iptables обнулятся.

Когда всё работает так как нужно и вы разобрались в iptables, то можно сделать следующее для сохранения настроек и работы iptables после перезапуска сервера:
# создаём файл в которвый будем сохранять настройки iptables и экспортируем текущие настройки туда:
sudo sh -c "iptables-save > /etc/iptables.rules"
# переходим в сетевые настройки и добаляем к настройкам нужного интерфейса комманду “pre-up iprables-restore < /etc/iptables.rules". При старте интерфейса она подтянет настройки из файла в iptables. # Так же можно добавить "post-down iptables-save > /etc/iptables.rules” для того чтобы сетевая служба сохраняла настройки iptables в случае отключения интерфейса.
sudo vim /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
post-down iptables-save > /etc/iptables.rules
pre-up iprables-restore < /etc/iptables.rules

Итоговый результат можно посмотерть так:
server:~$ sudo iptables-save
# Generated by iptables-save v1.4.21 on Mon Jul 14 18:40:29 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [41:4148]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.56.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 172.26.0.0/16 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT

или так:
server:~$ sudo iptables -L -v --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 406 26448 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
2 0 0 ACCEPT tcp -- any any 192.168.56.2 anywhere tcp dpt:ssh
3 0 0 ACCEPT tcp -- any any 172.26.0.0/16 anywhere tcp dpt:ssh
4 0 0 DROP tcp -- any any anywhere anywhere tcp dpt:ssh

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 256 packets, 24466 bytes)
num pkts bytes target prot opt in out source destination

Удачи!

!----------!
Links:
Раз
Два
Три-видео
Четыре-видео
Пять
Шесть
Семь
!----------!