USAGI NOTE | 指星为名

U酱收藏了一篇笔记,小兔报告说。
据小兔观察,主要的内容是:
访问防火墙后面的服务的简单办法
systemd-resolved的一些奇怪的知识


有些东西见不得光;
要是暴露在公网
就会蒸发到月亮上

适应症

部署了新的服务?
还是HTTP的?
密码认证不够安全?
总之,不想把端口开到公网!

处方

用强加密的VPN/代理连到服务的本机
就可以不受防火墙干扰地访问服务端口了
而关键是怎么做才干净又方便?

且听活性酱慢慢道来:

要连入服务器,shadowsocks-libev就是很好的选择:
部署非常方便,一行apt install shadowsocks-libev就可以装起来
chacha20-poly1305系列的加密方式也是TLS1.3的标准之一
只要密码不太弱,加密安全性是足够的
而且内外通用,不必担心砖混结构的阻拦

如果服务器在大陆的话,选择就更多了
老套路有L2tp之流
新操作用OpenConnect也相当不错
虽然不知道发生了什么,我先放一个教程在这里

连上服务器之后,要怎么做嘞?
虽然可以指定让localhost走代理
但总归不是个干净的办法
域名?好像不是家家都有
IP……谁记得住啊

活性酱总会特意给服务器取hostname
比如chocomint之类的 ice ice ice
因为古时候apt总会提示无法解析
所以养成了写到/etc/hosts里的习惯
127.0.0.1 localhost chocomint
不过既然写博文嘛,要严谨
所以测了一下信息量略大的说(后附)
结论是多数情况下是不需要专门修改的

总之呢,连上服务器之后chocomint
chocomint.local都是能解析到自身的
带上端口访问就可以,是不是很简洁

病历

这里的主角是systemd-resolved
比较新的系统默认都是用它接手DNS的
它能够正确地处理chocomintchocomint.local
这两种类型的mDNS
试着在nslookup里面打上server
返回127.0.0.53就说明有在工作了

然而有一些云服务商喜欢开历史的倒车
竟然放着好好的systemd-resolved不用
这就要说到传统的DNS配置文件
/etc/resolv.conf
出于兼容性的考虑
systemd-resolved会根据这个文件的属性
来决定自身的工作方式

对呀对呀!……resolv.conf有四样写法,你知道么?

概括起来有如下四种: 参考资料

  1. (推荐)链接到动态文件/run/systemd/resolve/stub-resolv.conf,里面是127.0.0.53和搜索域;
  2. 链接到静态文件/usr/lib/systemd/resolv.conf,里面只有127.0.0.53,没有搜索域的信息;
  3. 链接到动态文件/run/systemd/resolve/resolv.conf,里面是resolved载入的DNS列表,不支持D-Bus的程序会绕过resolved直接和上游DNS通信;
  4. 本身是静态文件,配置会被resolved读取,只能提供D-Bus服务。

前面两种情况,解析mDNS都是没问题的
后面两种情况,除非上游DNS资瓷(比如接受mDNS上报的网关兼DNS)
就会导致解析不了主机名的问题
如果你不幸遇到了这样的主机

请务必直接用/etc/hosts解决问题

下面是活性酱等人围着resolved转了一下午得到的结论
可作茶余饭后的笑谈:

请来自ConoHa的患者到⑨号诊室

  • 主诉:解析不了主机名和.local

  • 检查:情况三,上游是ConoHa自有的DNS

  • 治疗:直接修改链接成情况一即可,resolved是从networkd读取DNS的

请来自CloudCone的患者到⑨号诊室

  • 主诉:解析不了主机名和.local

  • 检查:情况四,上游是Google DNS

  • 治疗:尝试把nameserver 127.0.0.53写到/etc/resolv.conf第一行

  • 效果:虽然这一手非常脏,但是出乎意料的有用,没出现死循环;
    经过查证,resolved会静默地过滤掉127.0.0.530.0.0.0
    所以能够在情况四下实现mDNS解析

  • 并发症:无法访问主机名:端口

  • 检查:日志显示Invalid argument
    这是个多方面的巧合造成的问题
    其一,这台机子有多个IPv6地址,CC却放着netplan不用
    而是用ifupdown的eth0:n语法附加到网卡上
    这时它们都有一个link-local的IPv6地址
    其二,由于一些需要,ss-server带有-6参数
    会优先连接解析到的IPv6地址
    mDNS先返回的又正好是一堆link-local地址,这可叫内核犯了难
    因为内核不知道这几块网卡接的其实是同一个网
    拿不准要访问的这个地址应该从哪个网卡出去(其实就一个)
    因此直接返回错误,要求以地址%网卡的方式指定

  • 治疗:杀掉多的IPv6地址,只给eth0指定一个inet staticinet6 static

  • 效果:这样就治好了,但是……/etc/hosts它不香吗

医之好治不病以为功
虽然到这样为止,它的功能就正常了
但闲来无事不如再折腾一下
如何把情况四变成情况一呢?

由于情况四下resolved也是从/etc/resolv.conf读取DNS的
直接修改成软链接/run/systemd/resolve/stub-resolv.conf,重启后就会陷入没有DNS的情况
如果不配置networkd的话,就需要手动配置/etc/systemd/resolved.conf

[Resolve]
DNS=8.8.8.8
FallbackDNS=8.8.4.4

诊断

这个活性酱放着/etc/hosts不用
弄这么多有的没的
这是病,得治

Resolved.

点赞
  1. yyy说道:

    好详细~ qwq~

发表评论

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