硬件配置
光猫: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来设置定时启动上面这个文件就好了。