package cc.mrbird.febs.firewall.nginx; import cc.mrbird.febs.firewall.entity.FirewallIpWhite; import cc.mrbird.febs.firewall.entity.FirewallSite; import cc.mrbird.febs.firewall.mapper.FirewallIpWhiteMapper; import cc.mrbird.febs.firewall.mapper.FirewallSiteMapper; import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.List; /** * Nginx IP白名单配置文件生成器 *
* 白名单模式:如果表中有启用的IP记录,则仅允许这些IP访问;表为空则放行所有IP。 *
* 输出文件: /etc/nginx/conf.d/firewall_ipwhite_{siteId}.conf * * @author auto-generated * @date 2026-07-31 */ @Slf4j @Component @RequiredArgsConstructor public class IpWhitelistNginxConfigGenerator { private final FirewallIpWhiteMapper ipWhiteMapper; private final FirewallSiteMapper siteMapper; /** Nginx 配置目录 */ private static final String NGINX_CONF_DIR = "/etc/nginx/conf.d/"; /** 配置文件前缀 */ private static final String CONF_PREFIX = "firewall_ipwhite_"; /** * 生成 IP 白名单 map 配置 *
* # 有白名单IP时:
* map $remote_addr $allow_ip_1 {
* default 0;
* 1.2.3.4 1;
* 5.6.7.8 1;
* }
*
* # 无白名单IP时:
* map $remote_addr $allow_ip_1 {
* default 1;
* }
*
* 有IP时 default 0(默认拒绝,仅白名单放行);
* 无IP时 default 1(全部放行)。
*
* Nginx 中判断: if ($allow_ip_1 = 0) { return 403; }
*
* @param siteId 站点ID
*/
public void generate(Long siteId) {
FirewallSite site = siteMapper.selectById(siteId);
if (site == null) {
log.warn("防火墙站点不存在: siteId={}", siteId);
return;
}
// 查询站点下所有启用的白名单IP(未过期或永久有效)
List