likes
comments
collection
share

如何在公网不限速访问家庭宽带IP,家里的PC当作服务器(内网穿透)如何将闲置的pc变成一个强大的公网服务器。不限速免费的

作者站长头像
站长
· 阅读数 26

1.背景

家里装了新宽带,下行1000mb,上行100mb。且家里刚好有个不用的笔记本,于是乎想把这台电脑当作云服务器使用,毕竟阿里云2g2核的云服务器一年也要小100呢,不如自己搭一个。

2.调研

常用的内网穿透方案都是借用第三方工具,比如说花生壳、NATAPP、V2RAY等等,部分收费不说,且限速。用来调试demo可以勉强用一用,真正上生产还是算了。速度太慢,流媒体都无法正常播放;所以我准备不使用第三方工具,直接自己实现公网直连家庭宽带

3.实现步骤

3.1宽带改桥接

传统家庭上网方式都是自动获取,也就是你网线插上光猫就可以上网了,虽然方便,但是路由器上的一些端口转发等设备的功能,就将失效。为了让我们在pc上起的服务可以正常转发到公网上,我们需要用到端口转发的功能。所以必须要将上网方式改成桥接,然后拨号上网。直接打电话给10000号转人工,然后告诉客服需要将上网方式改为桥接即可。拨号上网需要知道自己的宽带账号密码,所以自己如果不清楚的话问客服要一下。

3.2申请公网IP

同上述步骤,打电话给10000号告诉客服自己要将IP改为公网IP。有的客服会问你为什么要改成公网IP,甚至直接拒绝给你改成公网IP。如果拒绝你就说不改你就去工信部投诉,他立马就会给你改。

切记改公网IP和改桥接都是免费的不收费

3.3验证公网IP

百度搜索本机IP 如何在公网不限速访问家庭宽带IP,家里的PC当作服务器(内网穿透)如何将闲置的pc变成一个强大的公网服务器。不限速免费的 用另一台不在同一个局域网内的设备ping一下 如何在公网不限速访问家庭宽带IP,家里的PC当作服务器(内网穿透)如何将闲置的pc变成一个强大的公网服务器。不限速免费的 这表明公网IP已经配置成功了,通过这个IP可以访问到家里的网络服务了。

4.注意点

4.1 80 443端口无法使用

家用公网IP都是封了80和443端口的,所以我们需要设置一下端口转发!因为家用就只能这样了,也是为了安全着想!

我们登录到自己的路由器后台,找到端口转发,端口映射的地方,基本所有路由器都有这个功能: 如何在公网不限速访问家庭宽带IP,家里的PC当作服务器(内网穿透)如何将闲置的pc变成一个强大的公网服务器。不限速免费的 将内网的网络设备的IP,端口,转发到外网中 比如说我们在pc端起了一个web服务端口是90,然后登录到路由器后台将这个90端口转发到公网的3800端口上去。这样我们在公网就可以通过IP+端口3800访问我们的web服务了,如图

如何在公网不限速访问家庭宽带IP,家里的PC当作服务器(内网穿透)如何将闲置的pc变成一个强大的公网服务器。不限速免费的

如果觉得ip+域名的方式不够优雅,那么你可以在阿里云买个域名绑定你的ip,这样你就能通过域名+端口的方式访问你部署的服务了。为什么我强调一定要在阿里云买域名呢?因为这又引出了下一个问题。动态dns绑定

4.2 动态DNS绑定

4.2.1 问题

我们的公网IP,其实是动态IP,什么意思呢?就是会变化,当我们的光猫,路由器,一旦重启,我们的公网IP就会变 这个时候,就需要重新将新的IP地址,解析到域名的A记录中!如果每次都是手动去阿里云改域名解析配置岂不是麻烦死了,好在阿里云提供了动态更改dns的api

4.2.2 解决方案

阿里云动态修改域名解析api文档如下:api.aliyun.com/api/Alidns/… 阿里云动态添加域名解析记录api文档如下:api.aliyun.com/api/Alidns/… 阿里云动态获取域名解析记录列表api文档如下api.aliyun.com/api/Alidns/… 主要用到了上述三个api。原理如下: 本地代码起个定时器,大约每10min请求一下阿里云动态获取域名解析记录列表api,拿域名解析记录中的IP与本机IP对比一下,如果IP不同就调用阿里云动态修改域名解析api,将最新的本机IP替换到域名解析记录中。参考代码如下:

'use strict';
const Alidns20150109 = require('@alicloud/alidns20150109');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');
const axios = require('axios');

class DNSClient {
    constructor() {
        this.config = new OpenApi.Config({
            accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
            endpoint: `alidns.cn-hangzhou.aliyuncs.com`
        });
        this.client = new Alidns20150109.default(this.config);
        this.runtime = new Util.RuntimeOptions({});
        this.lastIp = null;
    }

    async getCurrentIP() {
        try {
            const response = await axios.get('https://api.ipify.org?format=json');
            return response.data.ip;
        } catch (error) {
            console.error('Failed to get current IP:', error);
            return null;
        }
    }

    async updateDomainRecord(record, newIp) {
        let updateDomainRecordRequest = new Alidns20150109.UpdateDomainRecordRequest({
            recordId: record.RecordId,
            RR: record.RR,
            type: record.Type,
            value: newIp,
            TTL: record.TTL
        });
        try {
            let response = await this.client.updateDomainRecordWithOptions(updateDomainRecordRequest, this.runtime);
            console.log(`Record updated for ${record.RR}:`, response.body);
        } catch (error) {
            console.error('Failed to update record:', error);
        }
    }

    async updateAllRecords() {
        const newIp = await this.getCurrentIP();
        if (newIp && newIp !== this.lastIp) {
            const records = await this.fetchDomainRecords();
            if (records) {
                for (const record of records) {
                    await this.updateDomainRecord(record, newIp);
                }
            }
            this.lastIp = newIp; // Update last known IP after successful update
        } else {
            console.log('IP has not changed or failed to retrieve IP; no updates made.');
        }
    }

    async fetchDomainRecords() {
        let describeDomainRecordsRequest = new Alidns20150109.DescribeDomainRecordsRequest({});
        try {
            let response = await this.client.describeDomainRecordsWithOptions(describeDomainRecordsRequest, this.runtime);
            return response.body.DomainRecords.Record;
        } catch (error) {
            console.error('Failed to fetch domain records:', error);
            return null;
        }
    }
}

const client = new DNSClient();

// Update records immediately and then every 10 minutes
client.updateAllRecords();
setInterval(() => {
    client.updateAllRecords();
}, 600000);  // 600,000 milliseconds = 10 minutes

结语

通过以上操作就可以将家里的闲置pc机作为公网的服务器使用了。大家如果有不清楚的可以评论区提问,知无不言。

转载自:https://juejin.cn/post/7402529896689713186
评论
请登录