解决RouterOS v7使用SLAAC进行ipv6自动配置时地址失效的问题

一直在使用Mikrotik的路由器,用了RB750Gr2, RB750Gr3和RB3011,自从电信开始下发ipv6地址之后,在RouterOS中用SLAAC方式,让内网终端在路由器获取电信ipv6 prefix的基础上,通过无状态地址自动配置生成自己的ipv6地址。

RouterOS版本为v6时正常,升级到v7后,发现windows, android和linux都出现问题,具体表现就是有时候各类终端能正常获取ipv6地址,有些时候又不能,只有本地fe80地址,从路由器ipv6前缀自动配置生成的ipv6地址会消失,导致ipv6网络失效

至今的v7版本也还有这个问题,只好多次回滚降级到v6。直到最近用了RB5009,这个硬件不支持v6,这个问题又开始困扰。

一直以为是防火墙策略、ipv6参数等问题导致,断断续续摸索了1个多月都没能解决。

最后在https://www.cisco.com/c/en/us/support/docs/ip/ip-version-6-ipv6/213272-troubleshoot-ipv6-dynamic-address-assign.html学习了SLAAC的基本过程,用Wireshark抓包发现(过滤:icmpv6.type == 133 or icmpv6.type == 134 or dhcpv6),正常情况下终端通过icmpv6 type133的Router Solicitation(RS)报文宣告自己,然后路由器响应icmpv6 type134的Router Advertisement(RA)报文宣告ipv6 prefix。出现问题的时候,终端发出了RS报文,但是路由器没有响应RA报文,导致不正常。

红框为正常情况,发出RS后响应RA;出问题就是只有RS,没有RA:
点击看大图

RS报文详情:
点击看大图

RA报文详情:
点击看大图


最后通过一些关键字在Mikrotik论坛找到答案https://forum.mikrotik.com/viewtopic.php?p=797048,原因是v7的IGMP snooping 和IPv6存在冲突,在开启IGMP snooping时ipv6的组播包可能被丢弃。

在RouterOS v7的Bridge中,将ipv6 nd对应接口所属的bridge的IGMP Snooping关闭,恢复都正常!!!


---------2022-02-25补充---------
1、论坛友人反馈,可以在开启IGMP Snooping时再开启Multicast Querier,或者在Bridge对应的Port中关闭L2 hardware offloading。

2、又根据官方介绍Multicast Querier只能处理不带vlan tag的报文。如果开启vlan,需要安装固件的扩展包multicast package。但是ROSv7没有这个扩展包,理论上已经集成到主固件里面了,那就还是有问题。

我是开启了vlan的,所以暂时没折腾,以上供参考。


调整网络后安卓手机出现上网“卡”问题的解决

家里网络使用光猫桥接模式,通过RouterOS路由进行拨号,开启了IPv6。



原来一直使用第1种方案,下接一个WIFI无线路由器,无线路由是接到其WAN口上的,电脑和手机上网一直很正常。

近期调整网络,先是用方案2,无线路由改接到其LAN口上的;又用了AC+AP方式,通过方案3,将AP直接接在路由器下。方案2、3都遇到一个问题,就是安卓手机浏览器打开网页,微博、知乎等加载图片视频的速度都明显变慢,体验起来就像是网络时延变大,变得很“卡”。

检查发现在方案2、3下,在RouterOS上关闭了IPv6后变正常了,看起来像是开启IPv6造成的,由于IPv6访问速度较慢导致,但奇怪的是原来方案1也是一直使用IPv6的,却一直很正常的。

找区别,方案1手机上网是使用了RouterOS和WIFI的两次NAT,IPv4 DHCP和IPv6无状态分配都是使用WIFI无线路由器自带的;方案2、3是下级设备LAN接入上级设备LAN,直接使用RouterOS的NAT、IPv4 DHCP和IPv6 ND。NAT、ND感觉不是问题,疑问指向了DHCP。

RouterOS在IP>DNS中设置了2个IPv4和2个IPv6的DNS;IP>DHCP Server中配置了2个IPv4的DNS;IPv6>ND开启进行无状态地址分配,同时启用了Advertise DNS。




我是小米的安卓手机,在这种情况下,接入WIFI后会获取到RouterOS中IP>DHCP Server中配置的2个IPv4 DNS,还会叠加获取到IP>DNS中设置的2个IPv6的DNS;由于这2个IPv6 DNS响应比较慢,就导致手机感觉的“卡”。而Windows10不受这个影响,只会获取到IP>DHCP Server中配置的2个IPv4 DNS。安卓手机可以使用WiFiman APP在“状态”中查看当前手机获取到的配置情况。

简单说,由于启用了IPv6,当安卓手机的网络和APP都支持IPv6时,如果IPv6 DNS响应慢导致域名解析受影响,最后就出现手机上网的各种“卡”。之前关闭IPv6,导致IPv6链路失效,RouterOS也不会下发IPv6的DNS了,一切回归IPv4,所以也就正常了。

保留IPv6且不卡的解决方法,在RouterOS上配置,三选一
1、IP>DNS删除IPv6的DNS
2、IPv6>ND关闭Advertise DNS
3、寻找更好的IPv6 DNS替换IP>DNS设置


PHP下好用的图表库

amcharts,功能丰富,使用简单,文档完善。缺点是功能太丰富,文档也不好翻

https://www.amcharts.com

手动迁移QNAP NAS的iSCSI LUN文件

QNAP的NAS中有一块硬盘告警,在这块硬盘上除了有共享目录,还有一个500G的LUN通过iSCSI方式提供给centos使用。

我的硬盘都是独立使用的,没有做RAID,QNAP系统也没有提供LUN的迁移功能。

由于这块磁盘告警被系统强行设置成了只读,在centos里面也无法再次mount,所以也不能通过新建LUN,然后在centos中复制的方法来迁移数据了。

网上国内外也没找到相关的指引,自己摸索出以下方法:

1、ssh登陆到NAS,找到LUN实体文件在NAS的路径: /share/CACHEDEVn_DATA/.@iscsi.img/,n是数字,不同磁盘不一样,可以通过查看/share/CACHEDEVn_DATA/目录下的文件确定对应的硬盘。

2、在QNAP中iSCSI存储中,新建一个文件LUN。由于我之前旧的LUN是先设置为300G,后来不够用了又扩大到500G的,在硬盘上实际有2个文件对应这个LUN。所以我们新建时,要与之前的步骤一致,这样才能让新LUN生成的文件数量和大小与原来是一致的,否则无法替换。

3、对旧LUN停用、取消在iSCSI target中的映射。

4、对新LUN建立映射,加入到此前的iSCSI target中。

5、在centos中刷新iSCSI信息,可以运行lsscsi,在第一列中获取下面n数值。
echo "---" > /sys/class/scsi_device/n:0:0:0/device/rescan

6、在centos中对新LUN进行分区、格式化、mount;测试成功后,umount。

7、在NAS中删除新LUN产生的文件,然后用旧LUN的文件改名一致来替换。

8、重启NAS,否则mount装载后还是新LUN中的数据。

9、centos中mount。

就这样骗过了NAS,完成了数据迁移。使用下来目前一切正常。

解决新版foxmail文件夹无法跨账户移动

一直在使用foxmail,有多个邮件账户,为了方便将不同邮件账户下的文件夹都拖动到其中一个邮件账户下。但最近升级foxmail到最新的7.2.18.95,发现跨账户拖动的文件夹都回到了原来的账户下面,而且目前这个版本只能在同一个账户下移动文件夹位置,跨账户拖动无效。。。

网上搜索了半天也没找到解决方案,只得自己研究foxmail的文件结构,发现账户下的文件夹与安装目录下\Data\Accounts\中的Account.cfg和Account.htb有关。

这里简单分析会用到的一些数据:

Account.cfg保存了文件夹的ID以及名称等信息,从0x100开始,每0x100为一组;每组里面,0x00-0x03为文件夹ID(红色),0x11-0x12为文件夹名称长度(黄色),0x13开始为文件夹名称(绿色),由于是UTF-16编码,实际长度为文件夹名称长度x2

Account.htb保存了文件夹的目录树结构,从0x40开始,每0x10为一组;每组里面,0x04-0x07为文件夹ID(红色),0x08-0x0B为“后继子文件夹ID”(黄色),0x0C-0x0F开始“后继同级文件夹ID”(绿色);文件夹ID如果为0xFFFFFFFF标识为“无”


知道文件夹的目录树结构就好办了,把邮件账户下最后一个文件的“后继同级文件夹ID”从0xFFFFFFFF改为想移动过来的一组文件夹里面的第一个文件夹ID,再将原来指向想移动的文件夹的前序文件夹的“后继同级文件夹”改为0xFFFFFFFF,收工。

PS.这个方法只针对POP3类型账号下的文件夹,IMAP类型账号的文件夹是直接建在服务器上的,是不能跨账号挪动的。IMAP对应的文件在安装目录下\Storage\<账号名称>\Accounts\。

php7.4.9增加gd扩展

全部以源码编译方式为例,在centos7上操作

1、下载
https://www.php.net/distributions/php-7.4.9.tar.gz

2、准备(应该有多余的库
yum -y install patch gd-devel libxml2-devel libmcrypt-devel openldap-devel mhash-devel curl-devel libpng-devel libjpeg-devel freetype-devel sqlite-devel oniguruma-devel zlib-devel

3、编译安装

方式一:将gd静态编译到PHP中
php
cd /xxx/php-7.4.9/
./configure
--prefix=/usr/local/php
--enable-fpm
[b]--enable-gd[/b]
--with-freetype
--with-jpeg
--with-iconv
--with-zlib
--enable-xml
--disable-rpath
--enable-bcmath
--enable-shmop
--enable-sysvsem
--enable-inline-optimization
--with-curl
--enable-mbregex
--enable-mbstring
--with-openssl
--with-mhash
--enable-pcntl
--enable-sockets
--with-xmlrpc
--enable-soap  
--without-pear
--enable-ftp

make
make install

无需配置php.ini


方式二:将gd编译成扩展
cd /xxx/php-7.4.9/ext/gd
[b]/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-freetype --with-jpeg --enable-gd[/b]
make
make install

配置php.ini
[b]extension=gd[/b]

解决“google play services are updating”

换手机用了小米的一键换机,数据转移后Google的Play 商店、地图、Gmail都运行良好,可就是Flightradar24运行后就在顶部出现“google play services are updating”。

原来如果Google Play服务如果版本低,Google地图之类都会拉起Google Play 商店进行更新,可这次没有,Google自己的APP都运行良好。直接在Google的Play 商店中搜索“Google Play”是找不到对应的安装界面的。

从其他渠道找安装包,发现细分版本太多,不知道那个使用,而且还不一定是最新的。

最后发现在手机上的浏览器中,到google页面去搜索"Google Play Services",可以点击对应的图标直接拉起Google Play 商店,并进入到“Google Play 服务”的安装界面,可以看到有更新按钮,更新后天下太平~~!

 

 

 

关于HTTPS的一些备忘

HTTPS连接的前几毫秒发生了什么:http://blog.jobbole.com/48369/

Server Name Indication:https://en.wikipedia.org/wiki/Server_Name_Indication

SNI: 实现多域名虚拟主机的SSL/TLS认证:http://www.ttlsa.com/web/sni-multi-domain-virtual-host-ssl-tls-authentication/

如何在 Chrome 地址栏快速显示 HTTPS 证书信息

原文:

http://www.appinn.com/how-to-display-https-certificates-in-chrome-address/

https://www.ghacks.net/2017/07/27/configure-google-chrome-to-display-certificates-directly/

 

针对 Chrome 60+ 的技巧:

1、在地址栏输入chrome://flags/#show-cert-link
2、点击第一行的 启用
3、重启浏览器

使用HE Tunnel通过ipv6无法进行https访问

在家里的Mikrotik路由器上使用HE的6to4 Tunnel服务实现了ipv6的接入,但是使用中发现一些网站http可以访问,但是https就无法访问,直接网页就打不开,竟然还包括我自己的网站。。。今天有时间在客户端和服务端同时抓了包,发现客户端的Client Hello正常收发(下图绿色),但是服务端的Server Hello正常发出了但客户端竟然没有收到(下图红色)。。。

第一反应想到的是伟大的长城,但是细想这个是ipv6,应该不受这个限制。HE应该也不会过滤这些消息。突然想到的MTU,搜索了一下,竟然有相同问题(https://forums.he.net/index.php?topic=3545.0),原因就是MTU设置导致的。

找到原因就简单了,打开https://tunnelbroker.net/,在对应的Tunnel管理界面的“Example Configurations“界面看到Mikrotik给出的配置MTU是1280,我看了下我的路由器也确实是1280。又到Tunnel管理界面的“Advanced“界面看了下,原来默认是1480,需要自己改成1280,并且Update!

 

 

 

之后再到自己的路由器上断开重新连接,问题解决~~!