Squid TCP_DENIED/407

文章讲述了作者在DNS升级后遇到连接问题,通过access.log追踪到TCP_DENIED错误,发现是同事误删了http_accessdenyall的注释,导致denyall规则被提前执行。这提醒我们在配置Squid等代理服务器时,规则的顺序至关重要。

最近处理了一次很无语的故障,做个记录

公司里的DNS做了升级。我就去squid.conf里更新了DNS的地址

但是随后发现用户访问网页都显示connection refused

从access.log里发现了大量的 TCP_DENIED/407报错

大量查阅了网上现存的讨论,并没有帮助。

最后是另一个同事发现,有人改了squid.conf的配置

把我们之前注释的http_access deny all前面的井号删除了

导致了squid的代理规则发生变化,从配置文件读取配置的时候,直接执行了deny all

提示:Squid和其它Proxy软件类似,执行规则的时候都是从上往下配置,deny all一定是要放到配置文件的最后

<think>我们有一个VirusScanner程序,它被设计为与Squid代理配合使用。Squid通过配置可以将某些请求重定向到我们的病毒扫描程序(VirusScanner)。VirusScanner的main方法作为入口点,通过标准输入与Squid交互。 目标:修改Squid配置,使所有流量都通过VirusScanner进行病毒扫描。 然而,在Squid的配置中,我们通常不会让所有流量都经过重定向器(redirector),因为这样可能会对性能造成很大影响。但根据需求,我们需要将所有流量都经过VirusScanner处理。 在Squid中,我们可以通过配置`url_rewrite_program`(或旧版本中的`redirect_program`)来指定重定向器程序。但是,默认情况下,重定向器只对匹配了`redirector_access`规则的请求生效。如果我们想要所有流量都经过重定向器,我们需要设置`redirector_access allow all`。 具体步骤: 1. 在Squid配置文件中(通常是`/etc/squid/squid.conf`),指定重定向器程序为运行我们的VirusScanner jar文件。假设我们使用Java命令运行jar包,并指定主类(如果manifest中没有指定主类,则需要明确指定主类)。 2. 配置重定向器访问规则,允许所有请求都通过重定向器。 3. 注意:重定向器程序(即我们的VirusScanner)需要能够通过标准输入输出与Squid交互。 在VirusScanner中,我们已经实现了`runAsSquidRedirector`方法,该方法从标准输入读取Squid传递的数据,处理并输出结果。 因此,Squid配置的关键部分如下: ``` # 指定重定向器程序 # 使用java命令运行jar包,并指定主类(如果manifest中已经指定了主类,则可以直接使用-jar) redirect_program /usr/bin/java -jar /opt/clamav/VirusScanner-1.0-SNAPSHOT-jar-with-dependencies.jar # 启动10个重定向器子进程 redirect_children 10 # 允许所有请求都经过重定向器 redirector_access allow all ``` 但是,请注意,我们之前在VirusScanner中处理的是Squid传递的每一行数据,格式为:URL 客户端IP 用户名 方法。然后我们输出“OK”或者带有状态码的阻断信息。 然而,将所有流量都经过重定向器可能会带来性能问题,因为每个请求都会调用重定向器程序。因此,需要确保重定向器程序(即我们的病毒扫描)足够高效。 另外,在VirusScanner中,我们已经在`runAsSquidRedirector`方法中处理了标准输入,并在`processSquidRequest`方法中对每个请求进行判断。如果我们要扫描所有流量,那么我们需要在`checkRequest`方法中适当调整逻辑,例如只对特定类型的请求(如下载文件)进行深度扫描,而其他请求则快速放行。但是,根据需求,我们要求所有流量都经过病毒扫描,这可能需要我们对每个请求都进行扫描(包括页面、图片等),这在实际中可能不现实。因此,通常我们只对文件下载进行扫描。 所以,如果用户坚持要所有流量都经过该程序,我们可以配置,但需要明确:非文件下载的请求,我们可能只是做一些基本检查(如检查攻击源、协议等),而不会去下载整个内容进行扫描(因为那样会非常慢且不必要)。 因此,在配置上,我们按照上述方式修改Squid配置,但需要在VirusScanner中调整`checkRequest`方法,避免对所有请求都进行文件下载和扫描,否则系统将无法承受。 调整建议:在`checkRequest`方法中,我们只对具有文件扩展名的URL进行文件下载和扫描,其他请求只进行基本检查(如白名单、攻击源、协议等)。这样,对于非文件下载请求,我们不会进行耗时的文件扫描。 总结Squid配置步骤: 1. 编辑Squid配置文件(如`/etc/squid/squid.conf`),在适当位置添加或修改以下配置: ```squid # 指定重定向器程序 redirect_program /usr/bin/java -jar /opt/clamav/VirusScanner-1.0-SNAPSHOT-jar-with-dependencies.jar # 启动10个子进程 redirect_children 10 # 允许所有请求都经过重定向器 redirector_access allow all ``` 2. 重启Squid服务使配置生效: ```bash sudo systemctl restart squid ``` 注意:确保Squid配置中没有其他`redirector_access`规则覆盖了`allow all`,否则可能不会生效。 同时,在VirusScanner程序中,我们需要确保`checkRequest`方法不会对非文件下载请求进行文件扫描,以避免性能问题。例如,我们可以这样修改: ```java private boolean checkRequest(String url, String clientIp, String user, String method) { // 基本检查:白名单、攻击源、协议 if (isWhitelisted(url, clientIp)) { return false; } if (attackSources.contains(clientIp)) { return true; } String protocol = getProtocolFromUrl(url); if (!protocols.contains(protocol)) { return true; } // 只对具有可疑文件扩展名的URL进行文件扫描 String fileExt = getFileExtensionFromUrl(url); if (!fileExt.isEmpty() && fileExtensions.contains(fileExt.toLowerCase())) { // 下载并扫描文件 try { Path tempFile = downloadFile(url); boolean isInfected = scanFileWithClamAV(tempFile); Files.deleteIfExists(tempFile); if (isInfected) { return true; } } catch (IOException e) { log("文件下载/扫描错误: " + e.getMessage()); return blockAction; } } return false; } ``` 这样,对于没有文件扩展名或者扩展名不在扫描列表中的请求,我们只进行基本检查,这样性能开销在可接受范围内。 最后,请确保VirusScanner的jar文件具有可执行权限,并且Java环境已经安装。 如果遇到问题,可以查看Squid的日志(通常在`/var/log/squid/access.log`和`cache.log`)以及VirusScanner的日志(由程序中的日志配置决定,默认为`virus_scanner.log`)。 根据引用[3][4][5]的内容,我们需要注意,如果我们的VirusScanner是通过Spring Boot构建的,那么我们需要确保在pom.xml中正确配置了spring-boot-maven-plugin,以便生成可执行的jar。否则,我们可能需要通过指定主类来运行。 如果jar不是可执行的(即manifest中没有指定Main-Class),那么我们可以使用以下方式指定主类: ``` redirect_program /usr/bin/java -cp /opt/clamav/VirusScanner-1.0-SNAPSHOT-jar-with-dependencies.jar org.cyasec.VirusScanner ``` 其中`org.cyasec.VirusScanner`是主类的全限定名。 综上所述,Squid配置修改为所有流量都经过病毒扫描程序的关键是设置`redirector_access allow all`,并确保重定向器程序正确运行。 相关问题: 1. 如何调整病毒扫描程序以处理非文件下载请求? 2. 如何优化病毒扫描程序的性能以应对高流量? 3. 如何确认Squid重定向器配置已生效? 4. 如何为没有Main-Class的JAR文件指定入口点? 5. 如何监控病毒扫描程序的运行状态?</think>### 如何配置Squid代理将所有流量通过Java病毒扫描程序 #### 修改Squid配置的核心步骤 在`/etc/squid/squid.conf`中添加以下配置: ```squid # 基本代理设置 http_port 3128 visible_hostname squid-virus-scan # 启用病毒扫描重定向器 redirect_program /usr/bin/java -jar /opt/clamav/VirusScanner-1.0-SNAPSHOT-jar-with-dependencies.jar redirect_children 10 redirector_bypass off # 强制所有流量通过扫描程序 redirector_access allow all # 访问控制(根据需求调整) acl localnet src 192.168.0.0/16 http_access allow localnet http_access deny all # 日志设置 access_log /var/log/squid/access.log cache_log /var/log/squid/cache.log ``` #### 关键配置说明: 1. **redirect_program** 指定Java命令执行病毒扫描JAR文件,格式为: `/usr/bin/java -jar /path/to/your.jar` - 确保Java路径正确(用`which java`查看) - JAR文件路径需与实际位置一致 2. **redirect_children** 设置并发处理进程数(建议5-10个) 3. **redirector_access allow all** **核心配置**:强制所有流量通过扫描程序 4. 权限验证命令: ```bash sudo chmod +x /opt/clamav/VirusScanner-1.0-SNAPSHOT-jar-with-dependencies.jar sudo chown proxy:proxy /opt/clamav/*.jar # Squid通常以proxy用户运行 ``` #### 验证配置是否生效: 1. 重载Squid配置: ```bash sudo squid -k reconfigure ``` 2. 检查日志: ```bash tail -f /var/log/squid/access.log ``` 正常输出应包含: ``` TCP_REDIRECT/302 0 CONNECT example.com:443 - HIER_DIRECT/- - ``` 3. 测试流量拦截: ```bash curl -x http://localhost:3128 https://example.com ``` 病毒扫描程序日志应显示处理记录 #### 确保JAR文件可执行: 在`pom.xml`中添加Spring Boot打包插件(引用[3][4][5]): ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>org.cyasec.VirusScanner</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 编译命令: ```bash mvn clean package -U # -U确保更新依赖(引用[2]) ``` #### 性能优化建议: 1. 添加缓存白名单(减少扫描负载): ```squid acl whitelist dstdomain .google.com .microsoft.com redirector_access deny whitelist ``` 2. 排除静态资源: ```squid acl static_files urlpath_regex \.(css|js|jpg|png|gif|ico)$ redirector_access deny static_files ``` 3. 调整JVM参数: ```bash redirect_program /usr/bin/java -Xmx2g -jar /opt/clamav/VirusScanner.jar ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值