ProxmoxVE(pve)里设置阿里云DDNS动态ipv6,互联网访问家庭pve

家里电脑安装了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  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
            inet6 fe80::1290:27ff:fee9:f623  prefixlen 64  scopeid 0x20
            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

    ProxmoxVE(pve)里设置阿里云DDNS动态ipv6,互联网访问家庭pve_第1张图片

     

    选择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
    

    注意第4行显示: 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
    

     

     

 

你可能感兴趣的:(linux,远程控制)