树莓派4B动态解析公网IP

MoMaek

共 4531字,需浏览 10分钟

 ·

2021-10-19 06:50

        因为一开始采用的是Frp内网穿透技术,走的阿里云服务器的通道,所以带宽最大只支持1M,导致我本地服务器的流媒体服务访问人数一多就会引起观影卡顿,所以只能更换为DDNS技术来动态解析本地的公网IP,共试了两种方法,第一种方法我本地测试有点问题,后续换为了第二种方法,在此记录。

一、自定义Python脚本 + 阿里云SDK 实现DDNS

  1. 安装库

    pip install aliyun-python-sdk-core
    pip install aliyun-python-sdk-alidns
    pip install pyyaml
  2. 新建目录

    cd /
    cd urs
    mkdir ddns
  3. 新建Py脚本

    sudo nano aliddns.py
    import os
    import re
    import time
    import json
    import platform
    import requests
    from settings import * # 所有需要修改的数据
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest

    def LocalIPv6Address():
       # 判断当前操作系统,使用命令
       if(platform.system() == 'Windows'):
           cmd = 'ipconfig'
       elif(platform.system() == 'Linux'):
           cmd = 'ifconfig'
       else:
           print("操作系统不兼容")
           exit()
       v6_pattern = re.compile(r"(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})")
       r = os.popen(cmd)
       text = r.read()
       r.close()
       v6_address = v6_pattern.findall(text)
       return v6_address[0][0]


    def AliDNSUpdate(v6_address):
       client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou')

       request = AddDomainRecordRequest()
       request.set_accept_format('json')

       request.set_Value(v6_address)
       request.set_Type("AAAA")
       request.set_RR(RR)
       request.set_DomainName(DomainName)

       try:
           response = client.do_action_with_exception(request)
           response = str(response, encoding='utf-8')
       except:
           response = '{"ERROR":"error"}'
       return response

    # 如果更新失败,返回False,否则返回True
    def JudgeResponse(r):
       data = json.loads(r)
       if "ERROR" in data:
           return False
       return True


    def WriteLog(msg, address):
       data = json.loads(msg)
       now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
       with open(LOGFILE, 'w+', encoding='utf-8') as f:
           f.write(now_time+'\t'+address+'\n')
           for key in data:
               value = data[key]
               line = '\t' + str(key) + '\t:\t' + str(value) + '\n'
               f.write(line)
           f.close()


    if __name__ == '__main__':
       pre_address = ''
       while True:
           v6_address = LocalIPv6Address()
           if v6_address != pre_address:
               r = AliDNSUpdate(v6_address)
               WriteLog(r, v6_address)
               if not JudgeResponse(r):
                   break
               pre_address = v6_address
           time.sleep(60)
  4. 运行脚本

    python3 aliddns.py


二、开源工具Features实现DDNS

网址:https://ddns.newfuture.cc/

Git: https://github.com/NewFuture/DDNS/issues?page=2&q=is%3Aissue+is%3Aopen

  1. 安装工具

    sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple ddns
  2. 新建目录

    cd /
    cd urs
    mkdir ddns
  3. 运行

    ddns
  • 此时会默认在此目录下生成 config.json 文件

  • 若想指定目录生成需带参执行 例:ddns -c path/to/config.json

修改配置文件

{
"$schema": "https://ddns.newfuture.cc/schema/v2.8.json",
"debug": false,
"dns": "alidns",
"id": "阿里云ID",
"index4": "public",
"index6": "default",
"ipv4": [
"域名"
],
"ipv6": [
"域名"
],
"proxy": null,
"token": "阿里云Secret"
"ttl": null
}

执行

ddns
  • 此时将会获取本地公网IP,然后解析域名


三、设置cron定时任务

  1. 查看任务列表

    crontab -l
  2. 编辑/添加 任务

    crontab -e
  3. 查看定时服务状态

    service cron status
  4. 启动定时服务

    service cron start
  5. 重启定时服务

    service cron restart

    // or

    sudo /etc/init.d/cron restart
  6. 重载定时配置

    service cron reload
  7. 终止定时服务

    service cron stop
  8. 定时任务规则

    # 0 和 7 都代表星期日
    0 - Sun Sunday
    1 - Mon Monday
    2 - Tue Tuesday
    3 - Wed Wednesday
    4 - Thu Thursday
    5 - Fri Friday
    6 - Sat Saturday
    7 - Sun Sunday

    # 总体格式
    ┌────────── minute (0 - 59)
    │ ┌──────── hour (0 - 23)
    │ │ ┌────── day of month (1 - 31)
    │ │ │ ┌──── month (1 - 12)
    │ │ │ │ ┌── day of week (0 - 6 => Sunday - Saturday, or
    │ │ │ │ │ 1 - 7 => Monday - Sunday)
    ↓ ↓ ↓ ↓ ↓
    * * * * * command to be executed

    # 举例
    30 21 * * * /usr/local/etc/rc.d/lighttpd restart
    #每晚的21:30重启apache

    45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
    #每月1、10、22日的4 : 45重启apache

    10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
    #每周六、周日的1 : 10重启apache

    0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
    #在每天18 : 00至23 : 00之间每隔30分钟重启apache

    0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
    #每星期六的11 : 00 pm重启apache

    * */1 * * * /usr/local/etc/rc.d/lighttpd restart
    #每一小时重启apache

    * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
    #晚上11点到早上7点之间,每隔一小时重启apache

    0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
    #每月的4号与每周一到周三的11点重启apache

    0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
    #一月一号的4点重启apache
  9. 为ddns添加每分钟定时任务

    */1 * * * * cd /usr/ddns && /home/pi/.local/bin/ddns
    */1 * * * * echo "ddns解析"
  • 注意:在cron中使用命令必须用全路径,查看全路径方法 which ddns

错误排查

  • 若是提示返回信息中显示 info (No MTA installed, discarding output) ,可安装 sudo apt-get install postfix

  • 查看邮件命令 cat /var/mail/pi

  • 修改命令后记得重启cron服务

  • 若是日志出现 Skipping @reboot jobs -- not system startup,将 /var/run/crond.reboot 删除,然后重启cron服务


浏览 108
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报