浅谈网络通讯加密措施

我们目前的网络通讯有多安全?缺陷在哪儿?应该如何增强?

我曾在知乎上回答过相关问题,发现有许多大学生都对此不甚了解。有的人完全不注重个人网络安全,有的人则盲目夸大校园网安的审查透明度。

本文浅谈目前的网络通讯安全性,以供读者通俗理解相关概念,同时介绍我在个人Linux笔记本上的通讯加密措施。

https协议

就目前来说,几乎所有的网站都采取了https协议。这是一个网络数据传输协议,当使用浏览器时,我们往往能在地址栏看到一个锁型图案,这便代表我们访问目标网站时使用了https协议。

有关https安全性能的说法传闻很多,这里指出几点:

  1. 相比http协议,https协议不使用明文通信,其对数据传输的内容加密。
  2. 一般来说,https协议并没有加密网站域名(例如google.com、caveallegory.cn),网络管理方可以看见你访问了哪些网站。

综上所述,当我们使用https时,你不必担心你在网页内输入的密码、浏览的消息图片等内容。当你访问zhihu.com时,运营商最多知道你打开了知乎,但却没有办法搞清楚你看了什么、做了什么。

相比之下,不加密的http协议可谓完全暴露隐私了。目前有的网站仍然使用或支持http协议访问,这是非常不安全的。因此,你有必要在浏览器内勾选始终使用安全连接(https)

必须注意的是,https起作用需要一些前提:

  1. 证书:为了防止中间人攻击,确认你访问的网站是你想要的网站,目前的https依赖于证书体系。这相当于一个凭证,以便网站(服务器)用来证明“我是我”。为了验证这些凭证的有效性,我们的电脑(客户端)上都内置了根证书,而这些根证书则来源于信誉度良好的第三方机构和企业。如果你安装了某机构签发的有安全风险的伪证书,那么你的https协议的安全性将无从谈起,你的网络通信内容将完全暴露于该机构。因此,一定要避免信任、安装可疑的第三方证书,同时删除你操作系统中不安全的证书清除有安全风险的根证书列举了一些有安全隐患的证书,可供参考。
  2. 病毒、漏洞:如果你电脑上本就被病毒攻击过,或者存在网络安全漏洞,那么无论多强的协议也拯救不了网络通信的安全性了。不断更新浏览器和操作系统是一种有效的解决方法

DNS over Https (DoH)

当你在地址栏输入一个域名并访问时,系统一般会先向DNS服务器询问该域名的ip地址,然后再连接这个ip以访问目标网站,这就是域名解析。只有取得ip地址,客户端才知道向哪儿发送访问请求。

域名解析请求一般是明文的,因此有被劫持的风险。如果黑客代替DNS服务器向你返回了恶意的ip地址,那么你可能会被误导进入一个恶意网站。如果你始终使用https,浏览器一般会弹出安全提醒以阻止访问,但这毕竟指标不治本。如何才能避免DNS劫持呢?

DoH是解决这个问题的一个方案。它将域名解析请求使用安全的https加密,从而防止DNS劫持,能够如实地返回DNS服务器发来的ip地址。

主流浏览器设置里都可开启DoH,我们也可以使用系统级的DoH。Windows用户的启用方法见阿里公共DNS。在Linux系统上,可以安装cloudflared程序以启用DoH。安装步骤见Connect to 1.1.1.1 using DoH clients · Cloudflare 1.1.1.1 docs. 对于Archlinux来说,安装步骤如下:

注:cloudflare等国外DoH服务商在国内通常不可用,除非使用代理,这里仅以阿里DoH举例

首先安装软件包cloudflared。

yay -S cloudflared

编辑service文件:

sudoedit /etc/systemd/system/cloudflared-proxy-dns.service

官网的service文件不适用于自定义DoH服务器,这里给出修改版:

[Unit]
Description=DNS over HTTPS (DoH) proxy client
Wants=network-online.target nss-lookup.target
Before=nss-lookup.target

[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
DynamicUser=yes
ExecStart=/usr/local/bin/cloudflared

[Install]
WantedBy=multi-user.target

编辑/etc/cloudflared/config.yml文件:

proxy-dns: true
proxy-dns-upstream:
  - https://223.5.5.5/dns-query
  - https://223.6.6.6/dns-query

启用并开启服务:

sudo systemctl enable --now cloudflared

现在cloudflared已经运行在本地上了,之后还需告诉系统,将域名解析改在本地。修改/etc/resolv.conf是一种方法,但这个文件一般受到NetworkManager管理,直接修改不能长期有效。可以参照NetworkManager – Arch Linux 中文维基。一种方法是解除NetworkManager对resolv.conf的控制权,但另一种更合理的方法是在NetworkManager中添加配置文件,例如编辑/etc/NetworkManager/conf.d/dns-servers.conf文件:

[global-dns-domain-*]
servers=::1,127.0.0.1

之后可能需要重启NetworkManager服务:

sudo systemctl restart NetworkManager

ECH

一般来说,一个ip服务器往往对应了多个不同域名的网站。在https还未建立加密连接时,即初次握手阶段,客户端会向服务器发送“Client Hello”信息,其中包含了访问域名的明文,服务器根据接收到的域名,向客户端发送相应的ssl证书。

显然,“Client Hello”会泄漏我们所要访问的网站信息,为了解决这个隐私问题,相继出现了ESNI、ECH等解决方案,其中ESNI由于诸多问题,已被ECH取代。需要注意的是,ECH需要服务器的支持,目前还没有应用于所有网站。即便在客户端启用了ECH,实际通讯中你可能也并未使用它。

ECH依赖于DoH完成密钥分发,因此往往两者需要同时启用。对于Firefox,参见Encrypted Client Hello (ECH)——常见问题,当你启用了Firefox内置的DoH时,它会默认启用ECH。要启用DoH&ECH,需在“隐私与安全 – 基于 HTTPS 的 DNS”中勾选“增强保护”,并选择DoH提供方。

注:Firefox内置的两家提供方的DoH服务在国内都无法正常使用。对于cloudflare,你需要使用软件添加对域名“mozilla.cloudflare-dns.com”的代理。

对于chromium系浏览器,你可以参考启用ECH的配置

现在访问https://www.cloudflare-cn.com/ssl/encrypted-sni/检查浏览器的安全性,如果你使用cloudflare的服务并正确配置了ECH,那么应该能够通过全部的4项测试。

Proxy

为了向服务器和运营商隐藏自己的真实ip,你可以使用代理技术,它与以上的安全措施兼容。相关软件不在这里陈述。

总结

在互联网时代,作为“网络公民”,我们能够保护自己隐私的有效手段便是积极了解更多的网络安全措施。

以上的安全措施只是安全领域的冰山一角,但阅读完以上内容,至少你能知道校园网对你访问内容的真实掌握程度了。

参考链接

[1] https://zhuanlan.zhihu.com/p/572101957