如何在公网不限速访问家庭宽带IP,家里的PC当作服务器(内网穿透)如何将闲置的pc变成一个强大的公网服务器。不限速免费的
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
用另一台不在同一个局域网内的设备ping一下
这表明公网IP已经配置成功了,通过这个IP可以访问到家里的网络服务了。
4.注意点
4.1 80 443端口无法使用
家用公网IP都是封了80和443端口的,所以我们需要设置一下端口转发!因为家用就只能这样了,也是为了安全着想!
我们登录到自己的路由器后台,找到端口转发,端口映射的地方,基本所有路由器都有这个功能:
将内网的网络设备的IP,端口,转发到外网中
比如说我们在pc端起了一个web服务端口是90,然后登录到路由器后台将这个90端口转发到公网的3800端口上去。这样我们在公网就可以通过IP+端口3800访问我们的web服务了,如图
如果觉得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