IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

加速WEB访问:使用DNSmasq与squid代理并过滤广告

Lesca技术宅 2015-02-07 21:02:18 累计浏览 4,544 次
本机暂存
文章目录

简介

   DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,提供了DNS功能和可选择的DHCP功能。通过其DNS缓存的功能,可以大大提高公共网络中的域名解析速度,从而提升网站访问速度。

   squid代理服务提供了WEB页面缓存的功能,也可以帮助用户加速网站的访问,还能进行必要的行为管控(如禁止访问某些网站、过滤网页中的某些内容等)。本文将同时介绍正向代理和透明代理:

  • 正向代理:需要用户在客户端进行配置,手动指定代理服务器和端口,但是通过该代理,可以访问所有WEB服务(HTTP和HTTPS)。

  • 透明代理:则不需要用户进行任何配置即可使用,即对于应用而言不需要知道代理的存在。

  •    然而,透明代理有个缺点,它只能代理HTTP (80端口)协议,而对于经过加密的HTTPS协议,及其他协议如FTP、POP3等就爱莫能助了。这时候就需要用到CentOS的IP转发功能了。通过防火墙的设置,可以只允许访问HTTPS等必要的服务。

    实验环境

       为容易理解,本实验虚拟机所在网络仅一个公有Internet网络,并不接入企业网络或者其他形式的私有网络。

       实验中,假设CentOS所用IP地址为192.168.10.24,外网路由器地址192.168.10.1

    DNSmasq的配置

       DNSmasq是一种轻量级的非常容易部署的服务,不仅可以在流行的Linux发行版中随处可见,在众多流行的路由器系统中也有,如OpenWRT, DD-WRT, Tomato等,并且其DHCP服务往往是其提供的。因此这里的配置也适用于安装这些系统的路由器参考。

#不要使用/etc/resolv.conf文件
no-resolv
no-poll

#这两行告诉DNSmasq使用当地ISP的本地DNS进行解析
server=218.2.2.2
server=218.4.4.4

#对于google,youtube的服务,使用谷歌的DNS解析
server=/google.com/8.8.8.8
server=/youtube.com/8.8.8.8

#这两行用于防止DNS污染
bogus-nxdomain=202.102.110.203
bogus-nxdomain=202.102.110.204

#DNSmasq也可以通过域名过滤某些网站或服务
address=/googlesyndication.com/127.0.0.1
address=/cpro.baidu.com/127.0.0.1
address=/union.baidu.com/127.0.0.1
address=/google-analytics.com/127.0.0.1
address=/admaster.com.cn/127.0.0.1
address=/jiathis.com/127.0.0.1

   配置完成后,需要重启服务:

systemctl restart dnsmasq

   服务启动后,需要到路由器上修改DHCP中指定的DNS服务器地址,改成CentOS主机的地址“192.168.10.24”

   重新获取IP后,可用过nslookup命令查看是否成功,如:nslookup union.baidu.com 返回 127.0.0.1则表示成功。

squid代理的配置

安装Squid

yum install squid
chkconfig squid on

配置Squid

   编辑/etc/squid/squid.conf,指定两行http_port

   以下第一行为3128端口启用普通正向代理,第二行为3129端口启用透明代理。

http_port 0.0.0.0:3128
http_port 0.0.0.0:3129 transparent

IP转发

   由于透明代理只能代理HTTP协议,为了让虚拟机能够想路由器一样工作,需要开启该功能。

   即在/etc/sysctl.conf中,设置:

net.ipv4.ip_forward=1

   之后通过sysctl -p加载并启用新设置。

防火墙的配置

# 允许接收相关应答
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 仅允许以下入站协议
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -p tcp --dport 3129 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# 将HTTP服务重定向到3129端口,交给squid,这是透明代理的关键
iptables -t nat -A PREROUTING -p tcp -s 192.168.10.0/24 --dport 80 -j REDIRECT --to-ports 3129

# 仅允许以下协议转发给默认路由(即外网路由器)
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP

测试代理服务

   配置完成后,需要重启代理服务:

systemctl restart squid

   对于正向代理,直接在IE中指定代理服务器192.168.10.24和端口3128即可,如能正常访问WEB,则成功。

   服务启动后,需要到路由器上修改DHCP中指定的新的网管地址,改成CentOS主机的地址“192.168.10.24”

   通过手机等客户端,不加设置,就应可以访问外网了。

   另外,可以通过/var/log/squid/access.log查看访问日志,如果成功访问,日志中会有体现。

屏蔽广告

   我们通过以下脚本生成ad_block.txt,该文件包含了一个屏蔽列表:

# Generate ad_block.txt
#!/bin/bash
wget -O /etc/squid/ad_block.txt 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=squid-dstdom-regex&showintro=0&mimetype=plaintext'
systemctl restart squid

   可以将该脚本加入crond中,以定期更新之。

   编辑/etc/squid/squid.conf,增加下面两行:

acl ads dstdom_regex "/etc/squid/ad_block.txt"
http_access deny ads

   重启squid服务后,即可。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 如何拿下简短的域名 (累计阅读 16,933)
  2. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,932)
  3. 自建DNS以防止GFW干扰 (累计阅读 13,125)
  4. 强制刷新本地 DNS 缓存记录 (累计阅读 10,915)
  5. 使用Squid缓存视频 (累计阅读 10,334)
  6. 大型高并发高负载网站的系统架构分析 (累计阅读 9,001)
  7. 从谷歌宕机事件认识互联网工作原理 (累计阅读 8,746)
  8. 2014年1月21日中国互联网DNS瘫痪事件原因分析 (累计阅读 8,445)
  9. 域名相关的一些基本概念总结 (累计阅读 8,092)
  10. 关于 SOCKS 代理的远端 DNS 解析 (累计阅读 7,983)