网络知识 娱乐 Openwrt IPV6设置详解

Openwrt IPV6设置详解

硬件配置

光猫:ZXHN F650(GPON ONU)

硬件环境:openwrt x86

openwrt固件版本:21.02.0 r16279-5cc0535800

网络连接方式

由光猫拨号,openwrt直接使用DHCP客户端连接。光猫具体配置如下图:

 

 

 防火墙讲道理应该是不用设置的。因为看说明好像只是ipv4的设置。

而openwrt的应设置3个接口。分别为与光猫连接的WAN口,这个口只是用于ip4协议使用DHCP4客户端,然后再在这个接口上添加WAN6,协议使用DHCP6客户端用于获取光猫下发的ipv6。而LAN口除了正常的ip4的配置外,还应该添加ipv6 DHCP6服务。如下图

WAN

WAN6

LAN

防火墙 

PC侧的防火墙我就不演示了,实在不行可以直接关掉试试。

openwrt的防火墙可以在网络->防火墙->常规设置。将forward设置为accept。然后再讲区域中的都改成accept。这样就可以连接到你ipv6上的每一个端口。但是这样设置几乎就完全暴露自己了。但是可以先这样试试看是否能连接常用的一些端口。

正常做法是自定义规则来,避免完全暴露。如下

在Firewall - Traffic Rules中添加规则

这里的目标地址可以不填。当然你也可以指定IP,避免lan口上所有的设备都暴露下面的端口。

Openwrt 阿里云DDNS设置

 我这里是直接用的阿里云,因为官方固件对阿里的ddns不是很友好,用阿里云的DDNS API来做。具体做法

1、在openwrt中安装python环境

2、python pip 安装阿里云Python API

3、编写脚本,查询本机IP,如有更改就调用阿里云API更新DNS

4、使用openwrt的定时脚本,定时执行

        使用openwrt opkg安装python3,当然也可以用web管理界面安装。其中需要安装 python3、python3-pip、python3-dev、python3-cffi、python3-cff3-src。黑体字这3个会影响到阿里云SDK的正确安装。

       按照阿里云的说明,先安装pip install alibabacloud_tea_openapi,然后安装pip install alibabacloud_alidns20150109==2.0.2。到这里阿里云API的环境搭建完成。

        脚本可以按照说明书下面的示例写,需要用到AccessKey,这个直接在阿里云的网站上面设置。下面给出一个我自己写的脚本。

from socket import AddressFamily, SocketKind, socket
from typing import List
from alibabacloud_alidns20150109.client import Client as Client
from alibabacloud_alidns20150109 import models as alidns_20150109_models
from alibabacloud_tea_openapi import models as open_api_models

def UpdateRecord():
    s = socket(AddressFamily.AF_INET6,SocketKind.SOCK_DGRAM)
    s.connect(('2400:da00:2::29',80))
    ip = s.getsockname()[0]
    print(ip)
    config = open_api_models.Config(
        # 您的AccessKey ID,
        access_key_id='你自己的ID',
        # 您的AccessKey Secret,
        access_key_secret='你自己的Secret'
    )
    config.endpoint='alidns.cn-hangzhou.aliyuncs.com'
    client = Client(config)
    request = alidns_20150109_models.DescribeDomainRecordsRequest()
    request.domain_name = '你自己的主域名'
    request.lang = 'en'
    response = client.describe_domain_records(request)
    for record in response.body.domain_records.record:
        print(record.value)
    results = [r for r in response.body.domain_records.record if r.type == 'AAAA']
    result = results[0]
    print(result.value)
    print(result.record_id)
    if(result.value!=ip):
        # 更新AAAA纪录
        update_domain_record_request = alidns_20150109_models.UpdateDomainRecordRequest(
            rr='二级域名',
            type='AAAA',
            record_id=result.record_id,
            value=ip
        )
        print('update record.')
        try:
            # 复制代码运行请自行打印 API 的返回值
            updateReponse = client.update_domain_record(update_domain_record_request)
            print(updateReponse)
        except:
            print('update record except.') 
UpdateRecord()

然后使用crontab来设置定时启动上面这个文件就好了。