比如你部署了一个网站,你想亲朋好友能访问到你的网站。但是又不想花钱租服务器。
大家都知道服务器租起来很贵,单独办公网ip端口更贵。自己用家里平常的电脑就可以公网访问。
花生壳也贵,用花生壳的内网穿透很卡,而且限制很多,除非付费。
其实最后都是没钱惹的货。反正我是一个穷光蛋,不知道你呢?所以咱们就用下面的省钱方案。
准备条件:
1.一台电脑(网线必须直联光猫)
2.电信宽带(必须是ipv4的,办后打1000号开通动态公网ip)
3.腾讯云(去腾讯云购买一个域名,然后填写用途,在上面操作,腾讯云还有管局审核)
操作
当你完成了上面的3项操作之后,咱们就可以开始了。首先你要知道怎么去域名解析。
在腾讯搜索域名解析,就可以到这个界面,然后自己添加,输入记录(前缀),和记录值(ip地址)
就可以解析。但是这是手动的。因为我们是动态ip,没钱搞固定ip
所以需要写个脚本。定时刷新修改它。写脚本容易,就http请求,用各种语言都行,问题是怎么才能操作腾讯云呢?腾讯云很贴心,提供了对应的接口。可以用接口操作。
创建腾讯云秘钥地址
注意不要在网上找非腾讯云官方,帮你写好接口的,容易泄露key,最好像我一样跟着官方文档写接口。
账号登录 - DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS
我的方法,选择腾讯云(Api秘钥),可以拿到后面需要执行的SecretId和SecretKey
调用后成功
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-8import requests# 登录URL,看网站接口f12login_url = 'http://192.168.1.1/cgi-bin/luci/admin/login'# 登录所需的表单数据,参数要自己看网站前端代码f12login_data = { 'username': 'useradmin', 'psd': 'xxxxx'}# 使用session对象,它会自动处理Cookieswith 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访问,用手机浏览器的流量访问
参考:
腾讯云地址