
Я хочу ЗАБЛОКИРОВАТЬ все sshd
соединения, КРОМЕ одного динамического IP-адреса, назначенного, <subdomain>.ddns.net
поэтому я ввожу это /etc/hosts.deny
:
sshd: ALL EXCEPT <subdomain>.ddns.net
Это не позволяет мне подключиться к SSH.
Вместо этого, если я помещаю IP, разрешенный ( dig <subdomain>.ddns.net
подтверждает его) этим именем хоста, это работает:
sshd: ALL EXCEPT <ipv4.resolved.by.hostname>
Я также пробовал с UseDNS yes
или no
в sshd_config
, но это ничего не меняет.
Межсетевой экран (UFW) открыт по правилуufw limit ssh
Мой реальный /etc/ssh/sshd_config
здесь ниже:
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
KexAlgorithms [email protected]
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
MACs [email protected],[email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
PermitRootLogin no
AllowUsers remotessh
IgnoreRhosts yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
PrintMotd no
PubkeyAuthentication yes
AllowTcpForwarding no
AllowStreamLocalForwarding no
GatewayPorts no
PermitTunnel no
UseDNS no
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
решение1
Проблема, скорее всего, связана с тем, что IP-адрес, с которого вы подключаетесь, обращается к xxx.yourisp.com, а не к subdomain.ddns.net.
Когда вы пытаетесь подключиться к sshd с вашего (динамического) IP-адреса, tcpwrappers выполняет обратный DNS-поиск по вашему IP-адресу. Если он разрешается в xxx.yourisp.com, то он не найдет соответствия в hosts.allow или (hosts.deny, как это может быть), и, следовательно, он не разрешит подключение к sshd с вашего IP-адреса.
В качестве обходного пути вы можете рассмотреть возможность добавления subdomain.ddns.net в файл /etc/hosts и создания задания cron, которое будет запускаться каждые несколько минут и обновлять эту запись вашим динамическим IP-адресом при каждом его изменении. Это не очень элегантное решение, но это лучшее, что я смог придумать, когда сам недавно столкнулся с этой проблемой. Если кто-то знает более чистое решение, пожалуйста, прокомментируйте.
решение2
Для этого вы будете использовать и , и /etc/hosts.allow
. В , поместите следующее:/etc/hosts.deny
/etc/hosts.allow
sshd: blablabla.ddns.net
В /etc/hosts.deny вставьте следующее содержимое:
sshd: ALL
Это будет работать, потому что /etc/hosts.allow
перекрывает /etc/hosts.deny
. Но есть одна загвоздка: если ваш сервер находится за шпилькой NAT (некоторые также называют это отражением NAT), некоторые соединения будут отображаться с внутренним IP-адресом вашего шлюза к вашему серверу, поэтому их может быть сложно заблокировать.
Другой вариант — использовать iptables, например:
iptables -t filter -A INPUT -s blablabla.ddns.net -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport -j DROP
Просто имейте в виду, что iptables учитывает порядок своих правил.
Удачи.
решение3
Я использую скрипт для создания списка доменов в списке IP-адресов и включаю его в hosts.allow
Описание здесь: