分类 随手记 下的文章

https://www.bilibili.com/video/BV1p3411i7FV?share_source=copy_web
实际上,几年前我就听deepin论坛的大佬说UOS上有原生微信,但是有系统判断,不是UOS不能正常使用。随后听说有大佬已经修改好了deb包,去掉了系统校验。但是随后没了消息,我也找不到深度论坛的原帖子了。前几天UOS官方号突然发视频表示UOS和腾讯合作已上架原生微信。很快,我在吾爱破解找到了坛友发来的帖子,里面附有提取出来的deb安装包


- 阅读剩余部分 -

Shell脚本实现方案

方案1:缺点无法自动选择有效时间长的ipv6长地址,但是仅需一个Shell文件即可完成。

#!/usr/bin/bash    
dnspod_ddnsipv6_id="#####" #【API_id】将引号内容修改为获取的API的ID
dnspod_ddnsipv6_token="####" #【API_token】将引号内容修改为获取的API的token
dnspod_ddnsipv6_ttl="600" # 【ttl时间】解析记录在 DNS 服务器缓存的生存时间,默认600(s/秒)
dnspod_ddnsipv6_domain='######' #【已注册域名】引号里改成自己注册的域名
dnspod_ddnsipv6_subdomain='#####' #【二级域名】将引号内容修改为自己想要的名字,需要符合域名规范,附常用的规范
local_net="eth0" # 【网络适配器】 默认为eth0,如果你的公网ipv6地址不在eth0上,需要修改为对应的网络适配器
# 常用的规范【二级域名】
# 【www】 常见主机记录,将域名解析为 www.test.com
# 【@】   直接解析主域名 test.com
# 【*】   泛解析,匹配其他所有域名 *.test.com
#  改进了非fe80开头内网地址被误解析的错误。ps:仅支持中国电信,中国联通,中国移动使用,若国外ipv6无法解析请自行修改脚本。
# 举例
# 在腾讯云注册域名,登陆DNSPOD,在【我的账号】的【账号中心】中,有【密钥管理】
# 点击创建密钥即可创建一个API
# 如果你在腾讯云注册域名叫【test.com】
# 那么【dnspod_ddnsipv6_domain】后面就填【test.com】
# 然后根据常用的规范/自己想要的名字在【dnspod_ddnsipv6_subdomain】填入自己需要的名字
# 现假设为【file】,那么你的访问地址为【file.test.com】
if [ "$dnspod_ddnsipv6_record" = "@" ]
then
  dnspod_ddnsipv6_name=$dnspod_ddnsipv6_domain
else
  dnspod_ddnsipv6_name=$dnspod_ddnsipv6_subdomain.$dnspod_ddnsipv6_domain
fi

die () {
    echo "Error: unable to find [public IPv6 address], please use the 'ip addr' command or query the network panel of the system to check the network card, and fill in the name of the network card with the IPv6 address in the 'local_net' position in the command file." >&2
    echo "IP地址提取错误: 在指定的网络适配器上[$local_net]找不到<公网IPv6地址>(不是fe80开头),请使用'ip addr'命令或在系统的网络面板查询有公网IP的网络适配器,然后在脚本的[local_net]中用填写网络适配器的名称。" >&2
    exit
}

ipv6_list=`ip addr show $local_net | grep inet6 | sed 's/\/.*//g' | awk '{print $2}'  | grep 24 |  awk 'NR==1{print}'` || die

for ipv6 in ${ipv6_list[@]}
do
    if [[ "$ipv6" =~ ^fe80.* ]]
    then
        continue
    else
        echo select IP: $ipv6 >&1
        break
    fi
done

if [ "$ipv6" == "" ] || [[ "$ipv6" =~ ^fe80.* ]]
then
    die
fi

dns_server_info=`nslookup -query=AAAA $dnspod_ddnsipv6_name 2>&1`

dns_server_ipv6=`echo "$dns_server_info" | grep 'address ' | awk '{print $NF}'`
if [ "$dns_server_ipv6" = "" ]
then
    dns_server_ipv6=`echo "$dns_server_info" | grep 'Address: ' | awk '{print $NF}'`
fi
    
if [ "$?" -eq "0" ]
then
    echo "DNS server IP: $dns_server_ipv6" >&1

    if [ "$ipv6" = "$dns_server_ipv6" ]
    then
        echo "The address is the same as the DNS server." >&1
    fi
    unset dnspod_ddnsipv6_record_id
else
    dnspod_ddnsipv6_record_id="1"   
fi

send_request() {
    local type="$1"
    local data="login_token=$dnspod_ddnsipv6_id,$dnspod_ddnsipv6_token&domain=$dnspod_ddnsipv6_domain&sub_domain=$dnspod_ddnsipv6_subdomain$2"
    return_info=`curl -X POST "https://dnsapi.cn/$type" -d "$data" 2> /dev/null`
}

query_recordid() {
    send_request "Record.List" ""
}

update_record() {
    send_request "Record.Modify" "&record_type=AAAA&record_line=默认&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6&record_id=$dnspod_ddnsipv6_record_id"
}

add_record() {
    send_request "Record.Create" "&record_type=AAAA&record_line=默认&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6"
}

if [ "$dnspod_ddnsipv6_record_id" = "" ]
then
    echo "seem exists, try update." >&1
    query_recordid
    code=`echo $return_info  | awk -F \"code\":\" '{print $2}' | awk -F \",\"message\" '{print $1}'`
    echo "return code $code" >&1
    if [ "$code" = "1" ]
    then
        dnspod_ddnsipv6_record_id=`echo $return_info | awk -F \"records\":.{\"id\":\" '{print $2}' | awk -F \",\"ttl\" '{print $1}'`
        update_record
        echo "update sucessful" >&1
    else
        echo "error code return, domain not exists, try add." >&1
        add_record
        echo "add sucessful." >&1
    fi
else
    echo "domain not exists, try add."
    add_record
    echo "add sucessful" >&1

fi

Shell方案2

来自:https://github.com/rehiy/dnspod-shell 非单文件,但是也可以稍加修改后单文件运行,并且支持识别长效地址。

需要先开启SSH。

开启SSH、刷breed等参考:

https://github.com/AXFOX/openwrt-AC2100

关闭ipv6防火墙

重启后防火墙恢复。

ip6tables -F
ip6tables -X
ip6tables -P INPUT ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT

安装mixbox工具箱

(对红米AC2100很鸡肋,没有USB和其他存储没啥用,空间也不够干什么。)

参考:https://www.wifilu.com/33.html

sh -c "$(curl -kfsSl https://cdn.jsdelivr.net/gh/monlor/mbfiles/install_ghcdn.sh)" && source /etc/profile &> /dev/null

解决ipv6防火墙重启后自启动的问题

编辑/etc/rc.local

vim /etc/rc.local

加入以下命令 (注意写在exit 0之前)

ip6tables -F
ip6tables -X
ip6tables -P INPUT ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT

ipv6流量频频被阻2022年1月8日夜 更新

虽然理论上按照这么做ipv6流量应该没有受阻的理由了,但是实际上还是隔段时间时不时的发现防火墙又挡住了流量。(恩山的大佬也提到过这点,哪怕不重启,防火墙也会莫名其妙的恢复。)
于是我又想起来Linux的计划任务。可事实证明,我虽然control -e 加了一行十分钟执行一次指定脚本,问题依旧,甚至这两天手动执行都无法从外部通过ipv6访问内部的我家云设备。
我不明白为什么这样,忍了两天之后,今天又连上红米AC2100看了看。
先放几张截图和不同环境下访问的报错吧。
首先是手机开启LTE 网络使用via浏览器访问home.xfox.fun:88 ,报错:
ERR_CONNECTION_ABORTED
然后是直接访问[IPv6 address]:88 ,报错:
ERR_CONNECTION_REFUSED
前者我觉得没什么价值,但是后者明显是因为路由器防火墙把ipv6流量挡住了

开始认真检查路由器ipv6防火墙问题

先进/etc执行chmod 777 MyControl.sh一遍确保脚本权限没问题(因为我ls看的时候文件名是白色的,这权限貌似就不太对了吧?改过权限再ls看文件名已经变成绿色了。)
路由器shell截图_2022-01-08_23-33-40.png
然后我尝试手动执行了我自己写的脚本,然后发现有报错,这就很尴尬了。之前编写的时候,我还真的没测试一下能否运行,也许是宝塔用惯了,没有形成手动加上变量环境的习惯,所以,赶紧查了一下。通过env输出当前的变量环境信息(因为我手动直接执行命令就没报错)然后在文件顶部加上了:

#!/bin/ash                                                                        
PATH=/usr/sbin:/usr/bin:/sbin:/bin                                                
export PATH                                                                       

小米路由器可能为了节约硬件资源开销没用常见的sh,用的是ash。
修改后再次执行,依然是那个报错,那到底为啥报错呢?
看意思是太多连接,但是这个连接指什么?另外,看上去我还复制错了命令,开头少了个字母i,真是巨丢人。
ip6tables: Too many links.
我猜意思是环境变量太多了,所以我去手动翻腾目录看了看(没有whereis),这个命令的文件在/usr/sbin 所以我试着简单修改一下,删除:/sbin:/bin ,现在MyControl文件如下

#!/bin/ash
PATH=/usr/sbin:/usr/bin
export PATH
#Turn off ipv6 firewall
ip6tables -F
ip6tables -X
ip6tables -P INPUT ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT

修改后ECS 切到命令模式输入:wq 按下Enter保存。
再次运行,终于没报错了!
那么确定ipv6防火墙是有问题的,但是现在应该解决了
不过,我的笔记本连上家里的WIFI访问home.xfox.fun:88依旧:ERR_CONNECTION_TIMED_OUT,手机流量访问也还是ERR_CONNECTION_ABORTED 一定是还有其他问题!
截图_2022-01-09_00-22-03.png
此外,我发现ipv6测试站显示DNS有问题。
截图_2022-01-08_23-47-25.png
看上去路由器IPv6 DNS可能有问题所以,既然DNS有问题,那就试试不用DNS什么样。
直接通过IP:port访问设备,先是笔记本在内网通过公网ipv6地址访问。
访问成功,页面正常加载,手机LTE测试页面也正常加载。
再次尝试在手机端 domain:port访问,无论是LTE还是WLAN,结局一样ERR_CONNECTION_TIMED_OUT
我的手机已经开启了DOT,通过Termux ping6 无论是LTE还是WLAN都解析到了正确的ipv6地址,那么我的DDNS显然依旧正常工作,但是不论网络上前者还是后者ping 都没有收到回复。通过笔记本(Linux Mint20.4未开启DOT) ping6 也解析到了正确地址,但是也没有收到回复。
本地客户端设备不开ipv6 DNS解析正常,排除运营商DNS污染影响解析结果的情况,也排除路由器ipv6DNS异常
那为什么通过域名就无法访问呢?难道是GFW为了限制ipv6 web服务,直接把用域名访问的包抛掉了?

你的 DNS 服务器(可能由运营商提供)没有接入或没有配置 IPv6,将来这可能会妨碍你访问纯 IPv6 网站。

我忽然发现,无论我用本地宽带开启WLAN还是手机用LTE,你的 DNS 服务器(可能由运营商提供)没有接入或没有配置 IPv6,将来这可能会妨碍你访问纯 IPv6 网站。
这段文字在测试页面始终出现,而我很清楚记得之前我刚回家测试的时候结果是10项测试全部通过,根本就没报DNS的问题。
这么说本地运营商的ipv6 DNS现在真的有点问题?

奇怪的追踪记录

xfox@xfox-ThinkPad-E14-Gen-3~$ traceroute6 home.xfox.fun
traceroute to home.xfox.fun (2409:8a44:975:2360:a454:4bff:fecb:77f6) from 2409:8a44:976:9ac0::c4e, 30 hops max, 24 byte packets
 1  2409:8a44:976:9ac0::1 (2409:8a44:976:9ac0::1)  2.8312 ms  2.6231 ms  2.0860 ms
 2  2409:8088:0:801::2813 (2409:8088:0:801::2813)  5.0714 ms  11.4826 ms  9.7456 ms
 3  * * *
 4  * * *
 5  * * *
 6  * * *

下面就没有了,全都是*,我不理解这怎么回事。

连续两次重启我家云,手动执行DDNS脚本后web服务恢复正常了!2022年1月9日17:33:05补充

我刚才手动测试了一下,和昨天晚上结果一样不能访问。索性重启大法再试试。
SSH连上,ifconfig,我发现有三个长的很像的ipv6长ip,但是只有访问第一个才能访问到web页面。看上去是昨天晚上两次重启路由器造成的,不过这没关系,既然没有刷新,那把armbian也重启一下好了。(由于习惯性打开SSH执行最后一次执行的命令,所以重启了两次)然后ifconfig看看,这次是一短一长两个公网ipv6地址和一个fe80的内网地址了。然后手动执行一次DDNS脚本以确保解析到新的ip地址。
有意思的事情出现了!当我直接访问home.xfox.fun时,竟然打开了宝塔没有找到站点的默认页面,访问成功了?!(之前我在不同时间做过两次测试,最终认定不能使用domain直接访问,也就是80端口不能用,连接会被掐,但是这次莫名其妙的就又能用了?!)
不管怎么样,既然现在使用域名访问80端口的链接也不会被阻断,我就修改了宝塔配置默认使用80。