我希望阻止所有sshd
连接,但将一个动态 IP 分配给 a <subdomain>.ddns.net
,因此我将其放入/etc/hosts.deny
:
sshd: ALL EXCEPT <subdomain>.ddns.net
这不允许我连接到 SSH。
相反,如果我dig <subdomain>.ddns.net
通过该主机名放置 IP 解析(a 确认),它可以工作:
sshd: ALL EXCEPT <ipv4.resolved.by.hostname>
我也尝试过 withUseDNS yes
或no
in 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
问题很可能是由于您连接的 ip 地址反向到 xxx.yourisp.com,而不是 subdomain.ddns.net。
当您尝试从您的(动态)IP 地址连接到 sshd 时,tcpwrappers 会对您的 IP 地址进行反向 dns 查找。如果这解析为 xxx.yourisp.com,那么它不会在 hosts.allow 或(可能是hosts.deny)中找到匹配项,因此它不会允许从您的 ip 连接到 sshd。
作为一种解决方法,您可能需要考虑将 subdomain.ddns.net 添加到您的 /etc/hosts 文件中,并创建一个每隔几分钟运行一次的 cron 作业,并在此条目更改时使用您的动态 IP 地址更新该条目。这不是一个非常优雅的解决方案,但是当我最近自己遇到这个问题时,这是我能想到的最好的解决方案。如果有人知道更清洁的解决方案,请发表评论。
您将同时使用
/etc/hosts.allow
并/etc/hosts.deny
完成此操作。在/etc/hosts.allow
处,输入以下内容:在 /etc/hosts.deny 中,插入以下内容:
它将起作用,因为
/etc/hosts.allow
重叠/etc/hosts.deny
。但是有一个问题:如果您的服务器位于发夹式 NAT 后面(有些人也称其为 NAT 反射),那么您的网关的内部 IP 地址将出现一些连接到您的服务器,因此可能很难阻止。另一种选择是使用 iptables,如下所示:
请注意,iptables 会考虑其规则的顺序。
祝你好运。
我正在使用脚本将域列表添加到 ip 列表并将其包含到 hosts.allow
描述在这里:
https://serverfault.com/a/1105670/974219