我希望阻止所有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。
当您尝试从您的(动态)IP 地址连接到 sshd 时,tcpwrappers 会对您的 IP 地址进行反向 DNS 查找。如果该地址解析为 xxx.yourisp.com,则它将无法在 hosts.allow 或(也可能是 hosts.deny)中找到匹配项,因此它不会允许从您的 IP 连接到 sshd。
作为一种解决方法,您可能需要考虑将 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 会考虑其规则的顺序。
祝你好运。