抗DPI的隧道和VPN

我们生活在一个有趣的时期。 我什至会以惊人的方式说。 一方面,我们看到一些人真的想知道其他人正在互相交谈,并且真的想告诉他们哪些可以阅读,哪些不能阅读。 另一方面,想要维护其对个人通信和免费信息的秘密的权利的公民,而不希望将这种非常通信的事实以及该信息的接收用于他们的公民。 受到“地毯锁”打击的大量第三方站点,服务和企业会遭受红利。

但是,不,本文与社会无关,而与技术有关。

图片

由于正在发生的一切,人们的技术素养也在增长。 如果以前“ VPN”和“代理”一词只为IT专家所熟悉,现在甚至家庭主妇都知道它们,此外,他们使用这些词的含义。

总的来说,这个新闻最近变得很有趣。 例如,提供VPN服务等用于加密流量和绕过锁的行为现在应受到惩罚 ,在中国,他们通常为此而被监禁 。 不久之前,ILV开始使用数据包分析来阻止 MTProxy协议。 您还可以参考在此类问题上最成功的伙伴国家的经验:中国,伊朗,哈萨克斯坦,委内瑞拉。 例如,在委内瑞拉,它们直接阻止与Tor的直接连接,并使通往桥梁的交通混乱。 基于所有这些,我们可以假设,等待着我们的未来也非常​​有趣,特别是如果“负责任的人民”不再一遍又一遍地制造愚蠢的fakapy,并且变得更聪明,更复杂。

在哈布雷(Habré)的评论中,人们反复预测了加密技术如何为普通市民继续奋斗。 通过分析表达的想法并查看其他国家的证词,我试图建议限制交流的措施可以朝哪个方向发展。 DistortNeoshifttstas提出了一些更有趣的想法,最后我答应了el777来添加这篇文章。

使用ACL过滤器,一切都变得清晰。 他们正在采取行动,并以不同的成功取得成功和失败(尽管有相当悲观的预测 )。 DPI更有趣。

“确定” DPI流量类型的方法可以分为两类:

  • 签名分析。 即,“通过骨头”拆开包装,将标头和结构与样品进行比较,从而确定其目的。 因此,检测到许多隧道,例如,OpenVPN,L2TP / IPSec,SOCKS等。
  • 对流量交换模式的初步分析,例如传入/传出流量的比率,请求响应的频率和其他条件,将使我们能够将协议的“实际流量”与仅伪装成协议的隧道分开。

图片

您可以将流量分为几组,并假设它们将对它们进行处理。

  1. “专用” VPN,隧道和代理(OpenVPN,L2TP / IPSec,SOCKS等)很可能会自动阻止普通VPN和隧道,例如,在中国和委内瑞拉会发生这种情况。 如果某些组织或公司需要它来工作,请让他们注册和证明,正如上面提到的俄罗斯法律所明确提到的那样。 使用代理,使用HTTP更为简单-SOCKS以明文形式传输地址和内容,这通常不会对选择性“剪切”请求和窃听传输的信息造成任何问题。
  2. SSH等双重用途技术 。 建立会话后的很短时间,速度就降到了极速,因此您至少仍可以在控制台中以某种方式工作,但不再需要浏览和下载。 在正常工作期间这会产生问题的事实并不会打扰任何人(ILV最近向我们展示过多次)。
  3. 高度特定的协议,例如Messenger,游戏客户端等。
  4. 类型无法确定的化合物

对于第3项和第4项,“白名单”很有可能(例如,输入正式游戏服务器的子网或“正确”的Messenger,并且服务器所有者希望在必要时声明和排列所有内容,以免被触及)。 ILV已经拥有的用于域和IP地址的地址)。 不在这些列表中的人将面临与第1款或第2款相同的命运,尽管很可能不会直截了当地阻止或降低速度,而是分析前面提到的交换方式以确定流量是否“纯净” “或”可疑。

也就是说,如果您想将自己伪装成特殊协议,或者混淆连接以致无法确定其类型,则还必须注意创建“噪声”,以防止检测到实际的交换模式。 到目前为止,这种发展还没有出现在我的眼中。

您甚至都不记得不同的ICMP和DNS隧道-“不需要”的大量流量也会自动引起怀疑。

5. TLS和SSL,HTTPS 。 彻底清除是不可能的,因为这自动意味着阻止整个Internet。 模式分析没有意义,因为网络冲浪只是使用HTTPS的主要目的。 从以上所有方面来看,端口443上的SSL / TLS看起来是最“毫无怀疑”且可靠的选项。 因此,让我们尝试伪装成他。

图片

伪装自己


作为考虑,决定选择Streisand和SoftEther解决方案。

Streisand-全套不同的服务:OpenConnect / AnyConnect,OpenVPN,隧道,Shadowsocks,WireGuard。 所有这些都以自动或半自动“交钥匙”模式设置,并且在输出处,用户会收到已配置的服务器以及用于设置客户端的文件和详细文档。

这组作者说,SoftEther是一种VPN服务器,可以提升L2TP / IPsec,OpenVPN,SSTP和其他协议,还具有自己的SSL-VPN协议,与正常的HTTPS流量没有区别。

所以...

OpenConnect / AnyConnect。 Cisco AnyConnect SSL协议的开源实现。 建立连接后,不仅可见TLS(TCP)数据包,而且可见DTLS(UDP)数据包。 原则上,DTLS在“用于和平目的”的地方也经常使用,但这根本不像“普通HTTPS”。 但是,如果您在防火墙上切断了UDP流量,则AnyConnect会立即切换回TCP,并且从外观上再次完全和完全像普通TLS一样,甚至加密隧道内部的身份验证也几乎像HTTP中一样。

影袜子 。 加密的SOCKS代理。 显然,如果需要, 可以将其检测到 ,但是,有一些插件将其伪装为“纯HTTPS” 。 还有一个用于通过websockets进行工作的插件 ,稍后会详细介绍。

线卫 从描述来看,它具有良好的加密和会话建立机制,但是所有通信都是通过UDP进行的。 Wireshark将包的类型定义为完全听不见的东西,而对第三方DPI发生了什么的看法是一个非常非常大的问题。 更新:较新版本将Wireguard定义为Wireguard,因此答案很明显。

obfs3,obfs4 。 数据包将被混淆,以便从外部看起来像是完全随机的一组值。 也就是说,它们属于上面列表中的项目4。

软醚 看起来像HTTPS,但是有一个陷阱。 除了直接通过TCP进行TLS外,它还主动发送UDP数据包。 正如在文档中发现的那样,如果UDP没有在防火墙上被杀死,则UDP可用于加速数据传输。 此功能在配置中已禁用,禁用后,一切都会变得应有的状态。

SSTP 。 Microsoft的VPN prokotol。 Windows本地支持,GNU / Linux支持软件。 从外部看起来像HTTPS,Wireshark完全证实了这一点。

但这还不是全部


假设您在主机上安装了VPN服务器或隧道的末端,并将其配置为侦听端口443。 看起来一切都很好,但是有一个问题:如果我们伪装成HTTPS,您可以通过尝试使用简单的浏览器或CURL或以其他任何方式将自己埋在该端口中来验证它实际上已挂在端口443上。 在某些文章中,这种方法称为“引线连接”,并且如上所述,在中国已经非常流行。

因此,我们需要在443rd端口上拥有最普通,最体面的Web服务器。 这里出现了一个有趣的问题。

在主文档中,以上服务均未找到端口共享工作机制的描述。 仅由于sslh无法在HTTPS与以上服务之间共享流量, SSLH选项才不合适。 至少,因为如果没有完全解密的流量类型可以区分sslh,则DPI将能够做到。

这样的大多数人建议使用服务器名称指示(SNI)-一种TLS扩展,允许您指定主机名,然后使用HAProxy,sniproxy和其他工具分散服务的连接。 问题在于,在现代TLS实现中,使用SNI时指定的主机名以纯文本形式传输,即以未加密的形式传输,因此将来也可以被监视和使用。

因此,我们将即兴创作,然后想到两个选择。

港口敲门


图片

端口断开仅用于激活服务器上的“隐藏服务”。 例如,以类似的方式,SSH守护程序挂起的端口通常被“关闭”,以避免暴力破解和使用0天漏洞。 在经典版本中(例如,参见敲门守护程序的实现),敲门通常被理解为尝试按特定顺序建立连接或将数据包发送到特定主机端口,因此,守护程序将其“识别”为自己并激活允许访问特定端口的防火墙规则仅来自您的IP。

在我们的情况下,此选项并不完全可以接受。 首先,“非标准”端口本身可能会在途中某处被阻塞,其次,从外部进行分析时,该过程本身可能会令人怀疑。 由于我们伪装成HTTPS,因此我们需要“敲打” HTTPS。

令人惊讶的是,没有具有所需功能的HTTP / HTTPS敲门人,因此诞生了一个带有浪漫名字Labean骑兵,请保持安静!)的骗子

给定的:我们的服务器,在Nginx上使用正确配置的证书在端口443上运行,并显示一些完全无害的内容,例如,带有cats的GIF,GNU / Linux发行版的ISO映像,或者Wikipedia镜像和Moshkov的库。

同时,表单的行隐藏在Nginx配置中

 location ~ ^/somesecret/(.*) {
    auth_basic      "Administrator Login";
    auth_basic_user_file  /var/www/.htpasswd;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_pass http://127.0.0.1:8080/$1;
  }

, CURL'
https://ourserver.org/somesecret/vpn/on
, , , IP-, -
iptables -t nat -A PREROUTING -p tcp -s {clientIP} --dport 443 -j REDIRECT --to-port 4443
.

N (, ) , , , IP .

, , URL , /off .

, IPv6 (v6- X-Real-IP ).

Go, , , . , nginx init- Gihub:
https://github.com/uprt/labean

Websockets


image

: HTTPS — . Web- TCP , Websocket (RFC 6455). HTTP-, , TCP-. , , HTTPS .

WS , - — , CDN, , Cloudflare . , : IP CDN/proxy CDN, VPN/proxy CDN, .

WS- ( Haskell), wstunnel, nodejs , .

. wss://-,

wstunnel -t 33 wss://server:443

, «» ws- «» . wstunnel, , URI - :

wstunnel -t 33 wss://ourserver.org:443/hiddenws/

:

, 443 Nginx c - .

proxy- Websockets-:

location /hiddenws {
    proxy_pass http://127.0.0.1:8081;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
  }

websockets-. SOCKS- (, Dante), OpenVPN, , , .

selinux
RHEL , SELinux, nginx
2018/07/05 13:28:03 [crit] 7724#0: *11 connect() to 127.0.0.1:8081 failed (13: Permission denied) while connecting to upstream, client: IP_ADDRES, server: _, request: «GET /hiddenws/?dst=localhost:22 HTTP/1.1», upstream: «127.0.0.1:8081/hiddenws/?dst=localhost:22»,

:

semanage port -a -t http_port_t -p tcp 22
semanage port -m -t http_port_t -p tcp 22
semanage port -a -t http_port_t -p tcp 8081


Renatk .


— SOCKS- VPN- wstunnel, «» .

, v2ray shadowcocks, websockets shadowsocks. : https://github.com/shadowsocks/v2ray-plugin


— VPN- - MTU, 1400;
— VPN- 2 IP-. VPN/, ;
— «» IP- , ICMP ping;
— - reverse DNS , -, , gateway-001.somehomeisp.net;
— VPN/ DNS- OpenNIC;
( ).


image

- , — . , , — , , . , HTTPS — , , - « »/ /etc., , « », .

, , , , — , , , .
.

Source: https://habr.com/ru/post/zh-CN415977/


All Articles