捣腾家里服务器的另一些副产品。

配置ULA前缀

当你需要设置IPv6网关时,常常需要一个不随着运营商前缀变化的内网地址,这时候设置ULA很好用。

OpenWrt设置ULA前缀

OpenWrt设置ULA前缀

这样,在需要临时修改网关时,可以直接

sudo ip -6 route del default && sudo ip -6 route add default via fd22:9:30::88:88 metric 100

其中,fd22:9:30::88:88是网关地址。

自定义后缀

相比于60d1:24e0:fe4a:5c66这样的后缀,还是::88更帅一些。回字自定义后缀有4种写法,我们Linux真是太厉害辣。

如果是原生Debian,用ifupdown的话:

# /etc/network/interfaces
iface <你的ensXX> inet6 auto
        post-up /sbin/ip token set ::88 dev $IFACE

如果是Ubuntu(或者Ubuntu味道的Armbian),一般使用networkmanager:

sudo nmcli connection modify "Wired connection 1"     ipv6.addr-gen-mode eui64
sudo nmcli connection modify "Wired connection 1" ipv6.token "::88"

如果是(直接安装的)OpenMediaVault,它使用netplan:

# touch /etc/netplan/30-fix-token.yaml
network:
  ethernets:
    ens18:
      ipv6-address-token: "::123:123"
# sudo netplan apply

应该还会有人用systemd-networkd配置网络,自己读manpage去吧,祝你成功。

更快地推送IPv6地址

之前的DDNS更新脚本,或者ddns-go,都是使用cron来轮询的。而ip monitor命令不需要轮询,在IP地址变更的第一时间就会发送消息。配合靠谱的推送服务,可以比别人提前……呃……大概五分钟。

所以没什么用处,建议直接ddns-go。

#cat /etc/systemd/system/dns-updater.service
[Unit]
Description=Dynamic DNS updater
DefaultDependencies=no
Wants=local-fs.target
After=local-fs.target
Wants=network-pre.target
Before=network-pre.target

[Service]
Type=exec
ExecStart=/opt/ddns-updater

[Install]
WantedBy=sysinit.target
#cat /opt/ddns-updater
#!/bin/sh -e

ip -o -6 monitor address |
    while read index iface proto addr dummy scope temporary dummy; do
        case "$iface:$proto:$scope:$temporary" in
            ens18:inet6:global:dynamic)
                addr="${addr%/*}"
                case "$addr" in
                        f*) continue ;;   # 跳过以 f 开头的地址
                esac
                if [ "$addr" != "$current" ]; then
                    NEW_IP="$addr"
                    # 我这里发送到了企业微信机器人,也可以用bark、nfty.sh之类
                    curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx' \
                        -H 'Content-Type: application/json' \
                        -d "{
                            \"msgtype\": \"text\",
                            \"text\": {
                                \"content\": \"IPv6地址已更新:$NEW_IP\"
                            }
                        }"
                    echo "已通知企业微信,新地址:$NEW_IP"
                    current="$addr"
                fi;;
        esac
    done