将家里的电脑变成服务器公网可访问-腾讯云-省钱大法

avatar
作者
猴君
阅读量:4

比如你部署了一个网站,你想亲朋好友能访问到你的网站。但是又不想花钱租服务器。

大家都知道服务器租起来很贵,单独办公网ip端口更贵。自己用家里平常的电脑就可以公网访问。

花生壳也贵,用花生壳的内网穿透很卡,而且限制很多,除非付费。

其实最后都是没钱惹的货。反正我是一个穷光蛋,不知道你呢?所以咱们就用下面的省钱方案。

准备条件:

1.一台电脑(网线必须直联光猫)

2.电信宽带(必须是ipv4的,办后打1000号开通动态公网ip)

3.腾讯云(去腾讯云购买一个域名,然后填写用途,在上面操作,腾讯云还有管局审核)

操作

当你完成了上面的3项操作之后,咱们就可以开始了。首先你要知道怎么去域名解析。

在腾讯搜索域名解析,就可以到这个界面,然后自己添加,输入记录(前缀),和记录值(ip地址)

就可以解析。但是这是手动的。因为我们是动态ip,没钱搞固定ip

所以需要写个脚本。定时刷新修改它。写脚本容易,就http请求,用各种语言都行,问题是怎么才能操作腾讯云呢?腾讯云很贴心,提供了对应的接口。可以用接口操作。


创建腾讯云秘钥地址

注意不要在网上找非腾讯云官方,帮你写好接口的,容易泄露key,最好像我一样跟着官方文档写接口。

账号登录 - DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS

我的方法,选择腾讯云(Api秘钥),可以拿到后面需要执行的SecretIdSecretKey

调用后成功


1.在腾讯云【域名解析】添加一条记录,ip随便给

主机记录是www.shige(随便写的,这个就是访问的域名开头的内容)

记录值是ip地址(我随便写的)

2.接口调用获取域名对应的RecordId

为什么需要这个?因为腾讯云他修改需要这个参数,这个接口也是,得先去调另一个接口才能获取,我也头疼,为啥不一个接口写过来。

跳转到【获取域名的解析记录列表

step: 进入 API Explorer -> 获取域名的解析记录列表里 -> 输入域名(Domain) 还有主机记录(Subdomain) -> 点击发送请求

得到响应结果,响应结果里面找到RecordId

3.接口调用修改ip地址

跳转到修改记录

选择修改记录->JSON格式->填入信息还有rewardId,发送请求

ps:我截图少些了个subDomain(主机记录)他默认会给你改成@,我补上了,以我的json为准

这里对应的是腾讯云的域名解析操作

{
  "Domain": "域名",
  "DomainId": null,
  "SubDomain": "shige",
  "RecordType": "A",
  "RecordLine": "默认",

  "RecordLineId": null,
  "Value": "ip地址",
  "MX": null,
  "TTL": 600,
  "Weight": null,
  "Status": null,
  "RecordId": 刚刚获取的recordId填写数字,
  "Remark": null
}

看一下控制台,成功!

4.代码(整体)

我用的java,然后选的是sdk,如果担心腾讯云也不安全的话,那你就选择httpRequest,然后选择对应的语言,SDK信息里面按钮 有集成方法。

java代码,引入pom文件
# 版本在maven生效需要时间,如获取不到对应的版本,可以调低版本号 <dependency>     <groupId>com.tencentcloudapi</groupId>     <artifactId>tencentcloud-sdk-java-dnspod</artifactId>     <version>3.1.947</version> </dependency>

复制他的代码(你填写好就可以自己复制了)

package com.tencent;  import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.dnspod.v20210323.DnspodClient; import com.tencentcloudapi.dnspod.v20210323.models.*;  public class Sample {     public static void main(String [] args) {         try{             // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密             // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305             // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取             Credential cred = new Credential("SecretId", "SecretKey");             // 实例化一个http选项,可选的,没有特殊需求可以跳过             HttpProfile httpProfile = new HttpProfile();             httpProfile.setEndpoint("dnspod.tencentcloudapi.com");             // 实例化一个client选项,可选的,没有特殊需求可以跳过             ClientProfile clientProfile = new ClientProfile();             clientProfile.setHttpProfile(httpProfile);             // 实例化要请求产品的client对象,clientProfile是可选的             DnspodClient client = new DnspodClient(cred, "", clientProfile);             // 实例化一个请求对象,每个接口都会对应一个request对象             ModifyRecordRequest req = new ModifyRecordRequest();             req.setDomain("域名");             req.setSubDomain("www.shige");             req.setRecordType("A");             req.setRecordLine("默认");             req.setValue("ip地址");             req.setRecordId(recordId);//末尾要加L             // 返回的resp是一个ModifyRecordResponse的实例,与请求对象对应             ModifyRecordResponse resp = client.ModifyRecord(req);             // 输出json格式的字符串回包             System.out.println(ModifyRecordResponse.toJsonString(resp));         } catch (TencentCloudSDKException e) {             System.out.println(e.toString());         }     } }

我自己写了一个定时器,然后扫本地公网ip,调用这个方法。这里的脚本就很简单了,和域名解析没关系了,自己写吧。

注意:腾讯云的api调用的收费是前一年免费,大家可以白嫖,不过后面也很便宜,只要2块钱一个月,一年也才20块钱。

光猫操作

手动操作,端口配置

首先用网线连接你的光猫,用电脑连接,别用路由器。

然后登录光猫管理平台

192.168.1.1每个路由器可能有差别

光猫配置

WAN IP就是公网ip

然后选择端口映射,就可以把你本地的Ip端口映射到WAN IP上了

在端口列表就能看到你映射好的ip

代码动态模拟

为什么要用光猫获取?因为网上通过请求别人的地址返回的Ip都是经过转发的不准。

代码获取光猫的动态ip,由于要用脚本动态解析,所以不能用手动去看wanlp。

首先进入光猫界面f12,查看他的代码请求地址。找到接口

http://192.168.1.1/cgi-bin/luci/admin/settings/gwinfo?get=part

他会有个cookie值,用来校验是否正确。所以这里要模拟登录,获取cookie。

模拟登录

先开启日志输入密码,看接口是哪个是登录,参数怎么写。

然后看他的前端代码找到了。之后调用他的接口,和参数就能登录进去,然后发现他是用cookie登录的,登录后就会返回cookie,我们在拿这个cookie返回。每次用完记得调用下退出接口,清空cookie,防止多次登录的情况。

参数名称是username和psd

拿到cookie(他用的是sysauth为key的cookie)

登录获取cookie的代码

# coding=UTF-8   import requests  # 登录URL,看网站接口f12 login_url = 'http://192.168.1.1/cgi-bin/luci/admin/login'  # 登录所需的表单数据,参数要自己看网站前端代码f12 login_data = {     'username': 'useradmin',     'psd': 'xxxxx' }  # 使用session对象,它会自动处理Cookies with requests.Session() as session:     # 发送POST请求进行登录     response = session.post(login_url, data=login_data)      # 检查是否登录成功     # 这里的判断条件可能需要根据实际情况调整     if response.status_code == 200:         print("网站内容"+response.text)          # 获取此时session中的cookies         cookies = session.cookies.get_dict()          # 打印所有cookie键值对         for name, value in cookies.items():             print(f'{name} -> {value}')     else:         print('Login failed')

获取公网Ip代码

有了cookie,其他的就简单了,请求的时候把cookies带过去就行

先写退出登录的代码,先看接口

发现他是存储在header里面调用的退出登录

然后我发现不用做退出,因为他是唯一的,如果你登录过了,那么他就会被挤掉。所以退出的我就没有写,这个要看不同光猫的规则,我是电信的。

获取ip的代码

def getIp(sysauthValue):     #这个是获取Ip的接口,登录成功了f12自己看     url = "http://192.168.1.1/cgi-bin/luci/admin/settings/gwinfo?get=part"      # 创建会话对象,设置cookies和请求头     session = requests.Session()     session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'})     session.get(url)# 构造POST请求数据      # 发送POST请求,进行登录     # 已知的Cookie     cookies = {         'sysauth': sysauthValue         # 根据实际需要添加更多的cookie     }      session.cookies.update(cookies)     response = session.get(url)# 检查响应状态码,确认是否登录成功     if response.status_code == 200:         # print('登录成功!')         print(response.text)      else:         print('登录失败,状态码:', response.status_code) 

测试

成功

从返回值中拿到了公网ip

剩下的自己在写一个脚本把腾讯云域名的代码和这个光猫ip代码连起来就行了

ip测试

然后本机启动服务,通过公网Ip:端口访问

注意:端口可能被其他人占用,你要输入一个不常用的端口。

       如果是从光猫配置端口,不能用局域网的电脑访问此公网Ip,只能用其他的网络访问本机的公网ip

本机启动服务。

测试公网ip访问,用手机浏览器的流量访问

参考:

腾讯云地址

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!