MySQL只允许指定IP访问

时间:2024-11-02 13:28:53

1. 使用GRANT命令(推荐):
```sql
# 语法
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'ip_address' IDENTIFIED BY 'password';

# 示例:允许特定IP访问所有数据库
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.100' IDENTIFIED BY 'your_password';

# 允许特定IP访问特定数据库
GRANT ALL PRIVILEGES ON mydatabase.* TO 'user1'@'192.168.1.100' IDENTIFIED BY 'your_password';

# 刷新权限
FLUSH PRIVILEGES;
```

2. 修改用户表(alternative方法):
```sql
# 更新user表
UPDATE mysql.user SET Host='192.168.1.100' WHERE User='username';
FLUSH PRIVILEGES;
```

3. 通过my.cnf配置文件(适用于MySQL 5.7及以上):
```ini
[mysqld]
bind-address = 192.168.1.100
```

4. 查看当前用户权限:
```sql
# 查看所有用户权限
SELECT user,host FROM mysql.user;

# 查看特定用户权限
SHOW GRANTS FOR 'username'@'ip_address';
```

5. 删除不需要的访问权限:
```sql
# 删除用户的特定主机访问权限
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'ip_address';

# 删除用户
DROP USER 'username'@'ip_address';

# 刷新权限
FLUSH PRIVILEGES;
```

6. 允许多个IP访问:
```sql
# 使用通配符允许整个子网
GRANT ALL PRIVILEGES ON *.* TO 'username'@'192.168.1.%' IDENTIFIED BY 'password';

# 为多个具体IP创建访问权限
GRANT ALL PRIVILEGES ON *.* TO 'username'@'192.168.1.100' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'192.168.1.101' IDENTIFIED BY 'password';
```

注意事项:
1. 安全建议:
   - 只授予必要的权限
   - 使用强密码
   - 定期审查访问权限
   - 禁用不使用的账户

2. 配置后检查:
   - 确保防火墙设置正确
   - 测试指定IP能否访问
   - 测试其他IP是否被正确阻止

3. 常见错误处理:
   - 如果修改后无法访问,检查:
     - 防火墙设置
     - MySQL配置文件
     - 用户权限表
     - 网络连接

4. 最佳实践:
   - 记录所有授权的IP
   - 定期检查访问日志
   - 保持权限最小化
   - 定期更新密码

如果需要更严格的访问控制,还可以考虑:
- 使用SSL/TLS加密连接
- 设置访问时间限制
- 配置失败登录限制
- 启用审计日志