温馨提示×

如何在Debian SFTP中配置IP白名单

小樊
44
2026-01-08 09:59:56
栏目: 智能运维

在 Debian 上为 SFTP 配置 IP 白名单

一、推荐做法 使用防火墙限制来源 IP

  • 说明:SFTP 基于 SSH,最稳妥、可运维性最好的方式是在防火墙层限制到端口 22 的来源地址,这样无需改动 SSH 认证逻辑,且对全系统生效。
  • UFW 示例(Debian 常见):
    • 允许单个 IP:sudo ufw allow from 203.0.113.10 to any port 22
    • 允许网段:sudo ufw allow from 203.0.113.0/24 to any port 22
    • 启用防火墙:sudo ufw enable
  • nftables 示例(若系统使用 nftables):
    • 允许单个 IP:sudo nft add rule ip filter input tcp dport 22 ip saddr 203.0.113.10 accept
    • 允许网段:sudo nft add rule ip filter input tcp dport 22 ip saddr 203.0.113.0/24 accept
    • 丢弃其他来源(请确保已有默认策略或放开管理来源,避免锁死):sudo nft add rule ip filter input tcp dport 22 drop
  • 如需改端口(可选),在 /etc/ssh/sshd_config 中设置 Port 后再按新端口放行,例如 Port 2222,然后放行该端口的来源 IP。

二、备选做法 使用 TCP Wrappers 进行访问控制

  • 说明:通过 /etc/hosts.allow/etc/hosts.deny 对 sshd 进行来源限制,适合简单场景;若主机启用了防火墙,以防火墙为准。
  • 配置步骤:
    • 编辑白名单:echo ‘sshd: 203.0.113.10 198.51.100.0/24’ | sudo tee -a /etc/hosts.allow
    • 默认拒绝其他来源:echo ‘sshd: ALL’ | sudo tee -a /etc/hosts.deny
  • 注意:某些环境可能未安装或未启用 TCP Wrappers,生效与否取决于 inetd/xinetd 或 sshd 是否链接了 libwrap;建议优先使用防火墙方案。

三、在 SSH 层面做细粒度控制(按用户或组)

  • 说明:可在 /etc/ssh/sshd_configAllowUsers/DenyUsers 限制“哪些用户可以从哪些主机登录”,适合精确到“用户+来源 IP”的场景。
  • 示例(放到文件末尾,注意 Match 块与全局配置隔离):
    • 仅允许 alice 从指定 IP 登录:AllowUsers alice@203.0.113.10
    • 拒绝 bob 从某网段登录:DenyUsers bob@198.51.100.0/24
    • 也可按组限制:AllowGroups sftpusers,再结合上面的用户级规则
  • 修改后执行:sudo systemctl restart ssh,并用 tail -f /var/log/auth.log 观察登录结果与拒绝原因。

四、SFTP 安全加固与验证

  • 基本加固(建议与白名单配合):
    • 使用 SSH 密钥认证,禁用密码:PasswordAuthentication no;PubkeyAuthentication yes
    • 禁用不必要功能:AllowTcpForwarding no,X11Forwarding no
    • 仅允许 SFTP:在 /etc/ssh/sshd_config 的 Match 块中使用 ForceCommand internal-sftp,并合理设置 ChrootDirectory(如 %h/home/%u),同时确保 Chroot 目录属主为 root:root 且权限为 755,可写目录单独授权给相应用户
  • 验证与回滚:
    • 验证:从白名单内/外分别连接测试,例如 sftp alice@your_server_ip;观察 /var/log/auth.log 的 Accepted/Failed 记录
    • 回滚:若采用 nftables,删除规则或在变更前保存规则集;若采用 UFW,使用 ufw delete allow from … to any port 22;若采用 hosts.allow/deny,删除对应行;SSH 配置变更后可用 sshd -t 检查语法,再重启服务。

0