在 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_config 用 AllowUsers/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 检查语法,再重启服务。