利用IPV6搭建一个家庭服务器

1.1. 序言

众所周知,中国移动宽带没有给家庭用户分配一个ipv4的公网账号,但是会给一个动态的公网IPV6账号,我们接下来就用这个IPV6搭建一个家庭服务器了

1.2. 查看公网IPV6信息

 1.2.1. 打开cmd查看IPV6信息

在cmd中使用命令`ipconfig`查看IPV6,可以看到有一个临时 IPV6 地址

为了验证我的猜想是正确的,我们打开网站 (https://test-ipv6.com/index.html.zh_CN%20) ,此处可使用各类测试ipv6测试网站

上方显示我是有IPV6公网IP的

需要提醒:如果你用的是移动宽带,且还是没法得到IPV6地址,可能原因是你的路由器不支持IPV6协议,此时需要将电脑网线直连到光猫上,进行测试IPV6是否可以获取

1.2.2. 购买腾讯云或者阿里云域名

可以在域名商城购买一些比较便宜的域名,当然购买域名后需要进行实名认证等,会有一些步骤

1.2.3. 配置域名

上述步骤完成后,可在工作台,域名列表中所购买的域名信息了

将域名和IPV6地址进行绑定,绑定完成后,即可使用域名访问自己的主机了

访问测试主机,如果能ping通,则代表配置成功

需要提醒:阿里云或者腾讯云dns配置完成后需要等待一段时间使配置生效,在此期间可能无法ping通主机;此外因为IPV4和IPV6协议不兼容,因此如果想让其它电脑也能测试,需要保证其它电脑也有独立的IPV6地址,一般情况下,手机使用**移动数据网络**时其有IPV6地址,可用手机进行测试,或者手机开热点给笔记本进行测试,这说目前尚未解决的问题。

1.2.4. 动态域名绑定

因为前面提到的家庭IPV6地址是变动的,我们不可能每隔一段时间就配置一次域名,这样太麻烦了,此时我们可以使用阿里云或者腾讯云提供的SDK进行动态修改域名配置信息

1.2.5. 获取本机IPV6地址

判断获取的ipv6是否发生变化


 /**
     * @return 如果ip发生改变,返回true  如果没有则false
     */
    public static boolean getIpV6ChangeStatus() {
        boolean startLineFlag = false;

        //判断服务器类型
        OsInfo osInfo = SystemUtil.getOsInfo();
        if (osInfo.isWindows()) {
            List<String> list = RuntimeUtil.execForLines("ipconfig");
            for (int i = 0; i < list.size(); i++) {
                String line = list.get(i);
                if (StrUtil.isEmpty(line)) {
                    continue;
                }
                if (StrUtil.contains(line, IP_ADAPTER_NAME)) {
                    startLineFlag = true;
                    continue;
                }

                if (startLineFlag) {
                    if ((!StrUtil.contains(line, ". . :")) && startLineFlag) {
                        break;
                    }
                    List<String> splitList = StrUtil.split(line, ". . :");
                    if (CollUtil.isEmpty(splitList)) {
                        continue;
                    }
                    if (splitList.size() < 2) {
                        continue;
                    }
                    String name = splitList.get(0);
                    String value = splitList.get(1);
                    if (name.contains("临时 IPv6 地址")) {
                        if (currentIp.equalsIgnoreCase(value)) {
                            //IP地址没有改变,不用更新
                            return false;
                        } else {
                            //IP改变
                            currentIp = value;
                            return true;
                        }
                    }
                }
            }
        }

        if (osInfo.isLinux()) {
            //直接获取第四行数据
            List<String> list = RuntimeUtil.execForLines("ifconfig");
            if (CollUtil.isEmpty(list) || list.size() < 4) {
                System.err.println("从linux上获取ipv6地址失败");
                return false;
            }
            String ipv6Line = list.get(3);
            if (ipv6Line.contains("inet6") && ipv6Line.contains("global")) {
                ipv6Line = ipv6Line.trim();
                ipv6Line = StrUtil.removePrefix(ipv6Line, "inet6 ");
                ipv6Line = StrUtil.removeSuffix(ipv6Line, "  prefixlen 64  scopeid 0x0<global>");
                if (currentIp.equalsIgnoreCase(ipv6Line)) {
                    //IP地址没有改变,不用更新
                    return false;
                } else {
                    //IP改变
                    currentIp = ipv6Line;
                    return true;
                }
            }
        }

        return false;
    }

获取电脑或者服务器上的IPV6地址信息

    public static String getCurrentIp() {
        if (StrUtil.isEmpty(currentIp)) {
            getIpV6ChangeStatus();
        }
        return currentIp;
    }

将ipv6地址发送钉钉上

 /**
     * 发送ipv6到dingding
     *
     * @param ip
     */
    public static void sendIPToDingDing(String ip) {
        JSONObject root = new JSONObject();
        root.set("msgtype", "text");

        JSONObject object = new JSONObject();
        object.set("content", "我的IP是:" + ip);

        root.set("text", object);

        HttpRequest.post(WEB_HOOK_URL)
                .header("Content-Type", "application/json; charset=utf-8")
                .body(root.toString())
                .execute()
                .body();
    }

开启定时任务,如果ipv6地址发生变化,将消息发送到dingding和修改aliyun上的dns信息

public static void getIpV6Server() {
        ThreadUtil.execute(() -> {
            while (true) {
                boolean changeFlag = getIpV6ChangeStatus();
                //ip发生改变,把改变的发送到钉钉
                if (changeFlag) {
                    //将消息发送到钉钉上
                    sendIPToDingDing(getCurrentIp());

                    //将消息同步到aliyun上
                    IAcsClient client = AliyunDnsUtils.getIAcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
                    String recordId = AliyunDnsUtils.uploadIpv6ToAliyun(client, getCurrentIp(), DOMAIN_NAME);
                    System.err.println("更新完成...");
                }

                ThreadUtil.sleep(1000 * 60);
            }
        });
    }
  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
"同维电子有限公司 "拟 制 人 "时 间 " "测试部 " " " " "阳志明 "2011-2-23 " IPv6 DS-Lite服务器搭建过程 摘要: 本文描述了支持IPv6 DS-Lite服务器搭建过程。 关键字: DS-Lite Linux 正文: 系统环境准备 1. 因该功能属于比较新的功能,对内核要求的版本比较高,所以我们采用最新的Fedora 14系统进行搭建(Centos5.5以前的版本均不支持该功能),所用服务器软件为aftr -1.1.tar.gz 2. 安装过程不详述,安装的时候,安装必要的开发包即可(建议安装系统的时候,选择用 于软件开发即可) AFTR软件安装 下载aftr- 1.1.tar.gz后今天存放该软件的目录,依次执行如下命令即可安装完成: "# tar zxvf aftr-1.1.tar.gz " "# ./configure " "# make " AFTR配置及启动 直接进入到AFTR的目录中,编辑其配置文件aftr.conf : "#vi aftr.conf " "defmtu 1420 " "defmss on " "deftoobig off " " " "acl6 2111::/16 //需要接入的Ipv6网段,默认是全部拒绝的,如果不添加将 " "无法建立隧道连接 " "address endpoint 2111:123:123:123::1 //隧道端点 " "address icmp 172.24.139.139 " "pool 172.24.139.139 //伪装Ipv4的地址池 " 然后编辑其启动运行的脚本aftr-script "#vi aftr-script " "aftr_start() " "{ " "set -x " " " "ip link set tun0 up " "ip addr add 192.0.0.1 peer 192.0.0.2 dev tun0 " "ip route add 172.24.139.139/32 dev tun0 " "ip -6 addr add fe80::1 dev tun0 " "ip -6 route add 2111:123:123:123::/64 dev tun0 " "arp -i eth0 -s 172.24.139.139 00:00:00:00:00:53 pub " "} " " " "aftr_stop() " "{ " "set -x " " " "ip link set tun0 down " "} " " " "case "$1" in " "start) " "aftr_start " ";; " "stop) " "aftr_stop " ";; " "*) " "echo "Usage: $0 start"stop" " "exit 1 " ";; " "esac " " " "exit 0 " 然后执行如下命令即可启动AFTR: "./aftr -c ./aftr.conf -s ./aftr-script " 环境验证 对于环境的验证,我们可以直接采用Linux原生支持的B4隧道手工建立相应的隧道进 行验证,我们采用的也是Fedora 14系统进行的验证。 配置该Fedora 14系统网卡为纯IPv6的,假设IP为2111:3c:123::aa55/64,网关指向AFTR服务器IPv6地 址,依次执行如下命令,建立B4隧道 "#modprobe lp " "#modprobe ip6_tunnel //加载ip6_tunnel模块 " "#ip -6 tunnel add tun0 mode ipip6 remote 2111:123:123:123::1 local " "2111:3c:123:aa55 dev eth0 //2111:123:123:123::1为AFTR配置文件中endpoint地址" "#ip link set tun0 up " "#ip addr add 192.0.0.2 peer 192.0.0.1 dev tun0 " "#ip route add default via 192.0.0.1 //所有Ipv4的报文均从该隧道出去 " 建立隧道后,在客户机上去ping IPv4的地址,会发现可以ping通,在目的IP机器上抓包,可以看到ping包伪装为172.24 .139.139(aftr服务器配置的地址池中的地址)出去的,如果看到Ping通了,表示服务 器已经搭建OK。 参考文献 1. : ----------------------- IPv6DS-Lite服务器搭建过程全文共3页,当前为第1页。 IPv6DS-Lite服务器搭建过程全

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值