温馨提示×

怎样限制FTP访问IP

小樊
44
2025-12-22 01:00:09
栏目: 编程语言

限制 FTP 访问 IP 的实用做法

一、前置说明

  • 建议优先采用“白名单”策略(仅允许指定 IP/网段),并在变更前备份配置与服务。
  • FTP 有主动模式被动模式之分:控制通道为 TCP 21;被动模式数据通道使用一段端口范围(如 10000–10100)。若启用被动模式,需同时放通该端口范围与服务器公网 IP(如设置 pasv_address)。

二、方法一 防火墙限制(推荐,简单可靠)

  • 使用 iptables(通用 Linux)

    • 仅允许单个 IP(示例:203.0.113.10)访问 FTP 控制端口:
      sudo iptables -A INPUT -p tcp --dport 21 -s 203.0.113.10 -j ACCEPT
      sudo iptables -A INPUT -p tcp --dport 21 -j DROP
      
    • 允许一个网段(示例:192.168.1.0/24):
      sudo iptables -A INPUT -p tcp --dport 21 -s 192.168.1.0/24 -j ACCEPT
      sudo iptables -A INPUT -p tcp --dport 21 -j DROP
      
    • 若启用被动模式,还需放通数据端口范围(示例:10000–10100):
      sudo iptables -A INPUT -p tcp --dport 10000:10100 -j ACCEPT
      
    • 保存规则(Debian/Ubuntu 常见做法):
      sudo iptables-save > /etc/iptables/rules.v4
      
    • 提示:规则顺序很重要,确保“放行规则”在“拒绝规则”之前匹配。
  • 使用 firewalld(CentOS/RHEL/Fedora)

    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="21" protocol="tcp" accept'
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="21" protocol="tcp" drop'
    sudo firewall-cmd --permanent --add-port=10000-10100/tcp    # 被动端口范围
    sudo firewall-cmd --reload
    
  • 使用 ufw(Ubuntu)

    sudo ufw allow from 203.0.113.10 to any port 21
    sudo ufw deny 21/tcp
    sudo ufw reload
    

三、方法二 在 FTP 服务内限制(以 vsftpd 为例)

  • 启用 tcp_wrappers 并用 hosts.allow/hosts.deny 控制
    1. 编辑 /etc/vsftpd.conf
      tcp_wrappers=YES
      
    2. 配置白名单:
      # /etc/hosts.deny
      vsftpd: ALL
      # /etc/hosts.allow
      vsftpd: 203.0.113.10
      # 或允许网段
      vsftpd: 192.168.1.0/24
      
    3. 重启服务:
      sudo systemctl restart vsftpd
      
  • 被动模式端口与公网 IP(如需要)
    pasv_enable=YES
    pasv_address=你的服务器公网IP
    pasv_min_port=10000
    pasv_max_port=10100
    
    并确保防火墙已放通上述端口范围。

四、方法三 进阶与运维建议

  • 结合用户级控制
    • 使用 /etc/ftpusers 禁止特定系统用户登录 FTP(每行一个用户名)。
    • 使用 vsftpd 用户列表 做精细化控制(示例):
      # /etc/vsftpd.conf
      userlist_enable=YES
      userlist_file=/etc/vsftpd/user_list
      userlist_deny=NO   # 仅列表内用户可登录
      
  • 入侵防护
    • 使用 fail2ban 自动封禁暴力尝试的 IP(示例 jail.local 片段):
      [DEFAULT]
      bantime = 600
      findtime = 600
      maxretry = 3
      [vsftpd]
      enabled = true
      port = ftp
      filter = vsftpd
      logpath = /var/log/vsftpd.log
      banaction = iptables-multiport
      
  • 安全加固
    • 如启用 SELinux,按需设置布尔值与上下文(示例):
      sudo setsebool -P ftp_home_dir on
      sudo chcon -Rv --type=ftp_home_t /home/用户名
      
  • 验证要点
    • 从被允许与被拒绝的 IP 分别测试登录与数据传输。
    • 若使用被动模式,确认客户端能正常建立数据通道(放通 pasv_min_port–pasv_max_port)。

0