标签 DNS 下的文章

基于 redsocks 实现全局 TCP 流量代理

在 Arch Linux 上使用 Shadowsocks, redsocks, iptables, pcap-dnsproxy 搭建一个舒适的科学上网环境~

对于我来说, 系统安装好之后的第一件事就是翻墙. 我们使用 shadowsocks + redsocks + iptables + pcap-dnsproxy 来实现全局自动代理.

yaourt -S shadowsocks redsocks-git pcap-dnsproxy-git

以上命令同时安装了三个软件. iptables 已经自带不需要安装.

接着到 /etc/shadowsocks 文件夹下创建一个新的配置文件, 配置你的 shadowsocks. 然后

sudo systemctl start shadowsocks@配置文件名
sudo systemctl enable shadowsocks@配置文件名

然后我们配置 redsocks. redsocks 的作用是把全部的 TCP 流量转发到 shadowsocks 上面去, iptables 的话则是拦截这一层, 我们可以在 iptables 配置说如果访问的是中国 ip 则不流向 shadowsocks. 我对 redsocks 了解并不多, 这里只说下我是如何配置的.

redsocks 的配置文件在 /etc/redsocks.conf , 编辑它, 把 redudp 和 dnstc 全部注释掉. redsocks 配置除去注释其实只有这五行:

redsocks {
  local_ip = 127.0.0.1;
  local_port = 31338; # redsocks 运行端口
  ip = 127.0.0.1;
  port = 1080;  # shadowsocks 端口
  type = socks5;
}

根据你的情况需要修改的修改.

接着修改 /etc/iptables/redsocks.rules 文件, 然后把你的 shadowsocks 服务器 IP 地址以及中国 IP 地址加进来, 格式如下:

-A REDSOCKS -d your_ip -j RETURN

国内 IP 列表可以从 apnic 获取得到, 你也可以看我整理的: china.rules

然后, 运行以下命令开启

sudo touch /etc/iptables/iptables.rules # 如果没有这个文件就创建它
sudo systemctl start  redsocks.service iptables.service
sudo systemctl enable  redsocks.service iptables.service
sudo iptables-restore < /etc/iptables/redsocks.rules # 导入规则

然后配置 pcap-dnsproxy. 以上虽然把发往国外的 TCP 流量发到自己的 shadowsocks 服务器上面处理, 这是一种突破 GFW 的方式, 但是这不能避免 DNS 污染的问题, 所以接下来我们配置的 pcap-dnsproxy 来解决.

Arch Linux 安装 pcap-dnsproxy 之后其实我们并不需要做什么, 直接启动就可以用了. 但是要知道的是 pcap-dnsproxy 提供了非常丰富的配置, 你可以自定义, 比如默认 pcap-dnsproxy 是没有局域网解析的, 可以编辑 /etc/pcap-dnsproxy/Config.conf 把 Listen['Operation Mode'] 改为 Server. 如果你需要自定义 Host 的话就修改 /etc/pacp-dnsproxy/Hosts.conf 文件.

直接启动 pcap-dnsproxy

sudo systemctl start pcap-dnsproxy
sudo systemctl enable pcap-dnsproxy

然后编辑 /etc/resolv.conf 文件, 确保首行的 nameserver 为 127.0.0.1. 然后运行

yaourt -S dnsutils # 为了使用 dig 命令
dig www.google.com

如果结果是类似以下形式, 表示 pcap-dnsproxy 已经正常运行.

2017-05-13 15-21-44 的屏幕截图.png

只要看下域名是否被大小写混淆过即可. 如果没有的话可以运行 systemctl status pcap-dnsproxy 或者 journalctl -xe 查看错误日志.

如果还是不行, 可以把 /etc/iptables/redsocks.rules 下所有内容复制粘贴到 /etc/iptables/iptables.rules 下. 然后重启下 iptables.

如果你打开浏览器并且已经可以成功的访问 Google 或者 Y2B, 再访问 ip.cn 这个网站查看当前显示的 IP 是否为你国内的 IP. 如果不是那你的中国 IP 过滤设置还有问题.

- 阅读剩余部分 -

从输入 URL 到页面展示

本文从网络层以上讨论从浏览器输入 HTTPS 协议的 URL 到页面展现的全过程。由于不同浏览器之间也存在差异,这里以 Chrome 浏览器为例。

1. DNS查询

DNS 缓存有好几个环节,浏览器缓存,系统缓存,路由器缓存,ISP 缓存。

  • 浏览器首先会查看自身是否已经有进行 DNS 缓存。Chrome 可以通过 chrome://net-internals/#dns 查看缓存的 DNS,浏览器的 DNS 缓存可以加快 DNS 解析速度,但缓存时间不会太长。

    Chrome 的 DNS 缓存

  • 如果浏览器没有相应的缓存,则查找系统缓存,浏览器会向系统发送一个查询请求,如果系统存在缓存或者设置了 host ,则返回相应的 ip 地址给浏览器。

  • 如果系统没有缓存,那么它会发出一个 DNS 查询请求给路由器。

    如果路由器有 DNS 缓存,他会提取出 IP 地址返回。否则,他会向本地域名服务器发出查询,从请求主机到本地域名服务器的请求一般是递归查询,而其他的查询一般是迭代查询。

    DNS 请求主机到本地域名服务器的查询

    DNS 域名服务器之间的查询

    请求报文如下

    DNS 请求报文

    我们先简单分析下请求报文。

    1. DNS 使用 UDP 协议,端口号53。
    2. 在 DNS 报文的 Flags 中的 RD=1。表示它建议域名服务器以递归方式查询。
    3. Question section format 需要给出 QNAME, QTYPE, QCLASS。即查询的域名,查询的类型以及查询的类。

    有关DNS报文的更多信息可以参考RFC1035

    响应报文如下

    DNS 响应报文

    我们也简单分析下,如果想详细了解,可以查看上面的 RFC1035 标准。

    1. 与请求报文相比,对比 Flags 可以发现,QR=1 表示这是一个响应报文。RA=1 表示递归查询可用。
    2. ARecord 记录了DNS请求获得的一个或多个IP地址。一般还会得到 CNAME 记录和存活时间等信息。
    3. 这里对 Rcode 也稍加说明下,Rcode=0 表示成功,他还有好几种状态码,比如1表示 Format error,2表示 Server failure,3表示 Name error,4表示 Not lmplemented,5表示 Refused,具体信息可以参考 RFC1035

- 阅读剩余部分 -