家里电脑安装了pve,想办法能够在互联网上访问pve界面。因为电信宽带有了公网240e开头的ipv6,但ipv6会变化,所以我就配合阿里云解析,实现动态ddns,用域名来访问pve安装界面了。
共分为六步:
1. 安装curl
apt-get install curl dnsutils -y
2. 安装ifconfig
apt-get install net-tools
然后用ifconfig命令查看自己的ipv6地址:
root@pve:~# ifconfig
vmbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.16 netmask 255.255.255.0 broadcast 192.168.3.255
inet6 240e:335:5a01:bc20:1290:27ff:fee9:f623 prefixlen 64 scopeid 0x0<global>
inet6 fe80::1290:27ff:fee9:f623 prefixlen 64 scopeid 0x20<link>
ether 10:90:27:e9:f6:23 txqueuelen 1000 (Ethernet)
RX packets 107758 bytes 10287539 (9.8 MiB)
RX errors 0 dropped 7 overruns 0 frame 0
TX packets 125186 bytes 24211909 (23.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我的ipv6为240e:335:5a01:bc20:1290:27ff:fee9:f623:
3. 解决兼容性问题
dpkg-reconfigure dash
选择no后回车。
4. 用自己pve的ipv6先试着访问(不要用我的,要用自己的):https://[240e:335:5a01:bc20:1290:27ff:fee9:f623]:8006能访问就不能这一步。不能访问就用这一步。设置ipv6能够访问pve,先用route -6命令查看ipv6分配:
root@pve:~# route -6
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
ip6-localhost/128 [::] U 256 2 0 lo
240e:335:5a01:bc20::/64 [::] UAe 256 2 0 vmbr0
fe80::/64 [::] U 256 1 0 vmbr0
[::]/0 fe80::1 UGDAe 1024 4 0 vmbr0
ip6-localhost/128 [::] Un 0 7 0 lo
240e:335:5a01:bc20::/128 [::] Un 0 3 0 vmbr0
240e:335:5a01:bc20:1290:27ff:fee9:f623/128 [::] Un 0 4 0 vmbr0
fe80::/128 [::] Un 0 3 0 vmbr0
fe80::1290:27ff:fee9:f623/128 [::] Un 0 4 0 vmbr0
ip6-mcastprefix/8 [::] U 256 3 0 vmbr0
[::]/0 [::] !n -1 1 0 lo
注意第6行显示: 240e:335:5a01:bc20::/64,然后用代码:
ip -6 ro add 240e:335:5a01:bcff::/64 dev vmbr0
ip -6 ro add default via 240e:335:5a01:bcff:ff:ff:ff:ff dev vmbr0
注意前四组地址的变化,第四组末两位变成ff,后面都是ff ,再编辑:/etc/sysctl.conf文件:
vi /etc/sysctl.conf
在末尾加上下面几行(如果没有下面几行的话):
#开启bbr,内核需要是 4.9 以上,可以使用 uname -r 命令查看
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
# 开启 ipv4 路由转发
net.ipv4.ip_forward=1
# 开启 ipv6 相关参数,其中 vmbr0 改成对应的主网口名称
net.ipv6.conf.vmbr0.accept_ra=2
# IPv6 Packet Forwarding and Proxy NDP
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.proxy_ndp = 1
net.ipv6.conf.all.proxy_ndp = 1
保存后,执行以下命令使设置生效 :
sysctl -p
重新启动电脑后,发现 https://[240e:335:5a01:bc20:1290:27ff:fee9:f623]:8006能访问了。
5. 将以下代码保存为/root/ipv6.sh
#!/bin/sh
aliddns_name=”你的域名前缀”
aliddns_domain=”你的域名”
aliddns_ak=”你的AccessKeyId”
aliddns_sk=”你的AccessKeySecret”
####获取本地ipv6并与以前保存的ipv6比较
##获取本地ipv6,我这边有两个ipv6,一个是240e开头的互联网能互相访问的,
#一个是fe80开头的本地ipv6,应该舍弃
#得筛选出那个互联网能够互访的ipv6
ip=$(/sbin/ifconfig vmbr0 | grep 'inet6')
#####获取本地保存的已经解析过的ipv6
####
oldip=$(cat /root/ip.txt 2>&1)
echo 本地保存的旧ipv6是:$oldip
if [ -n "$oldip" ]
then
echo "有旧ipv6$oldip"
result=$(echo $ip | grep "$oldip")
if [ -n "$result" ]
then
echo 跟以前保存的一样,没必要解析,退出。
exit 0
fi
fi
#将本机ipv6保存进数组
OLD_IFS="$IFS"
IFS=" "
array=([$ip])
IFS=$OLD_IFS
##取掉fe80开头的ipv6,留下能互访问的ipv6
for var in ${array[@]}
do
result=$(echo $var | grep "fe80")
echo var是$var
if [[ "$result" != "" ]]
then
echo 是内网ipv6退出
continue
fi
length=${#var}
ipv6num=16
if [[ $length -gt $ipv6num ]];
then
echo 是可以互访的ipv6,退出选择
ip=$var
break
else
echo 长度太小
continue
fi
done
ip=`echo $ip`
echo $ip ###正确ip
echo $ip >/root/ip.txt ##把ip替换到文件中
echo "数组元素个数为: ${#array[*]}"
###安装阿里云cli
cg=$(aliyun version 2>&1)
cg=${cg:0:1}
if ! [[ "$cg" -gt 0 ]] 2>/dev/null
then
echo 下载阿里cli
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
echo 解压
tar xzvf aliyun-cli-linux-latest-amd64.tgz
echo 复制到系统文件夹
cp aliyun /usr/local/bin
echo cli初始化设置
aliyun configure set
--profile akProfile
--mode AK
--region cn-hangzhou
--access-key-id $aliddns_ak
--access-key-secret $aliddns_sk
echo 安装阿里云cli结束
fi
###得到解析id
get_recordid() {
grep -Eo '"RecordId": "[0-9]+"' | cut -d':' -f2 | tr -d '"'
}
###向阿里云域名cli获取解析id
query_recordid() {
aliddns_record_id=`aliyun alidns DescribeDomainRecords --DomainName $aliddns_domain --RRKeyWord $aliddns_name --Type AAAA`
echo -n $aliddns_record_id
}
####修改解析
update_record() {
aliyun alidns UpdateDomainRecord --RR $aliddns_name --RecordId $1 --Type AAAA --Value $ip
}
###添加解析
add_record() {
aliyun alidns AddDomainRecord --DomainName $aliddns_domain --RR $aliddns_name --Type AAAA --Value $ip
}
if [ "$aliddns_record_id" = "" ]
then
aliddns_record_id=`query_recordid | get_recordid`
echo $aliddns_record_id
fi
if [ "$aliddns_record_id" = "" ]
then
aliddns_record_id=`add_record | get_recordid`
echo "added record $aliddns_record_id"
else
update_record $aliddns_record_id
echo "updated record $aliddns_record_id"
fi
运行:sh /root/ipv6.sh
sh /root/ipv6.sh
我的是https://pve.cpsj.pub:8006/ 能访问了。我的pve经常会关闭,只有需要时才远程控制打开。我打算写远程控制家里电脑的一系列文章。请关注我的博客。
6. 添加 crontab -e任务:
crontab -e
#####每十分钟运行一次ipv6.sh
*/10 * * * * sh /root/ipv6.sh