去中心化通讯协议 Matrix

在现在这个时代,所有的聊天软件不可避免地会遭到审查,那么如何能够将个人隐私牢牢地掌握在自己手中呢?Matrix就是一个新兴的去中心化通讯协议

预计阅读时间: 5 分钟

写在前面

在现在这个时代,所有的聊天软件不可避免地会遭到审查,那么如何能够将个人隐私牢牢地掌握在自己手中呢?有不少人使用较为安全的支持e2e加密的软件Telegram,但是国内无法正常访问,本文教你如何搭建类似的e2e加密的国内可以正常使用的聊天软件——Matrix。

Matrix

Matrix是一个去中心化的通讯协议,功能丰富,架构健壮。与客户端直接通讯的服务端可以自行部署,无需担心在国内无法访问。

由于使用的是http api,所以部署非常方便,第三方客户端的开发也十分便捷。目前matrix生态十分丰富,还有不少bot、bridge等增加它的功能。

Synapse

Synapse是一个最常用的matrix服务端软件,使用Python编写,由matrix官方维护,是我们部署matrix服务端的最佳选择。

Matrix官方还有开发一个Golang的版本,但是仍在Beta阶段,短期内不建议部署。

因为Python版本多环境复杂,我们首先考虑使用Docker进行部署,官方的docker 镜像位于Docker Hub

,直接使用问题也不大,有一点小问题我们很快就会讲到。

因为环境变量较多,我们自然是选择docker-compose 来部署和管理,docker-compose的安装教程位于https://docs.docker.com/compose/install/,没有安装的可以按照官网提示安装。

synapse官方有example位于https://github.com/matrix-org/synapse/blob/master/contrib/docker/docker-compose.yml,使用了traefic作为反向代理,不太符合我的需求,在此提供一份我使用的compose file

version: '2.4'

volumes:
  db:
    name: synapse_db

networks:
  synapse:
    name: synapse
    ipam:
      config:
        - subnet: 172.23.1.0/24

services:

  synapse:
    #image: reg.techminer.org/library/synapse:latest
    image: matrixdotorg/synapse:latest
    container_name: synapse
    # Since synapse does not retry to connect to the database, restart upon
    # failure
    restart: unless-stopped
    # See the readme for a full documentation of the environment settings
    environment:
      - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
    networks:
      synapse:
        ipv4_address: 172.23.1.2
    volumes:
      - ./files:/data
    depends_on:
      - db

  db:
    image: postgres:12-alpine
    container_name: synapse_db
    restart: unless-stopped
    # Change that password, of course!
    environment:
      - POSTGRES_USER=synapse
      - POSTGRES_PASSWORD=MammalMatrixPretty
      # ensure the database gets created correctly
      # https://github.com/matrix-org/synapse/blob/master/docs/postgres.md#set-up-database
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
    volumes:
      - db:/var/lib/postgresql/data
    networks:
      synapse:

然后我们docker-compose up -d就可以开始运行了。

方便起见我把tls放在反向代理上,就不在synapse中配置cert了,印象中Matrix要求使用tls也就是https用于通信,所以一个有效的证书是避不开的了。对于证书我推荐使用Acme.sh,文档见链接。TLS的配置我就不赘述了。

此处需要注意的是反向代理需要一些额外的配置,官方已经有建议,此处列举一个我使用的HAProxy配置。

frontend https
  bind :::443 v4v6 ssl crt /etc/ssl/haproxy/ strict-sni alpn h2,http/1.1

  # Matrix client traffic
  acl matrix-host hdr(host) -i matrix.example.com
  acl matrix-path path_beg /_matrix
  acl matrix-path path_beg /_synapse/client

  use_backend matrix if matrix-host matrix-path

frontend matrix-federation
  bind :::8448 v4v6 ssl crt /etc/ssl/haproxy/synapse.pem alpn h2,http/1.1
  default_backend matrix

backend matrix
  server matrix 127.0.0.1:8008

Client

由于Matrix是一个开放的协议,任何人都可以为它编写客户端。

所有的客户端见官方页面

目前开发得比较完善的客户端是Element,原名Riot.im。

至此,我们已经安装好服务端和客户端了,可以按照指示创建一个新用户并愉快地开始聊天了。

Known Bugs

Python的Twisted库Bug导致发注册邮件等无法使用TLSv1.2,所以如果使用的邮件服务商不支持旧的TLS版本,那么还需要更改Dockerfile使用nightly的Twisted。 2021-08-03 Update: Twisted库已经修复了这个Bug。

目前其实就算是Element开发得也不是很完善,然后发布版本缺乏测试,经常引入新bug。

还有就是synapse这个服务端是用Python写的,性能非常抱歉,尤其是相当消耗硬盘I/O,3000iops的ssd都能给占满活动时间。

Conclusion

其实主要还是感受一下这样的去中心化即时聊天形式,matrix协议使用的去中心化方式带来的federation查询时主要消耗性能的地方,尤其是对于曾经存在过的HomeServer,Synapse没有做区分,导致不停地重复查询已经不可能查询到的federation API。

如果是真正想要体验良好的聊天体验的话还是建议使用Telegram

Easton Man
Easton Man
文章: 37

5 评论

  1. Synapse是否保存了相关的密钥,如果服务器被攻击并获得了完全的控制权限,是否会导致客户端发送的信息泄露呢?

      • 目前Synapse的文档特别少,不知道博主对这个是否了解深入一些,是否可以一起交流交流。目前自己拉了docker搭了测试的。

    • Element可以允许用户在服务器上设置密钥的备份 如果用户使用了这个功能 那么Synapse是有机会保存密钥的 不过备份会被一个用户设置的密码保护

    • synapse不保存密钥。但是有研究指出,Synapse掌握大量了聊天房间的数据。操纵这些数据可以导致群聊内容被解密。攻击者入侵服务器后,可以冒充管理员,给群聊房间加一个影子账户。如果群里有人不警惕乱点信任,信任了影子账户,可能会导致过往的群聊内容被解密并暴露在影子账户眼前。

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注