title: 将你家里的电脑连上广域网 description: 很多人买电脑半年一年之后,都会遇到这样一个问题:硬盘已经装不下?尤其是有些爱折腾的朋友喜欢安装多个系统,或者爱把各种美剧批量下载到本地,渐渐地,也只好去网上搜罗个硬盘。现在四五百就能买到一个 1TB 的硬盘,也不算很贵,可是电脑边上总挂着一坨东西,不仅不方便也不好看。 warning: true categories:
很多人买电脑半年一年之后,都会遇到这样一个问题:硬盘已经装不下?尤其是有些爱折腾的朋友喜欢安装多个系统,或者爱把各种美剧批量下载到本地,渐渐地,也只好去网上搜罗个硬盘。现在四五百就能买到一个 1TB 的硬盘,也不算很贵,可是电脑边上总挂着一坨东西,不仅不方便也不好看。
<!--more-->有同事给我推荐 NAS,我觉得是相当不错的一个方案,包括硬盘在内,一般用户配置可以控制在 2000-5000 人民币。喜欢折腾的也可以考虑 GEN8,价格在 1500-3000 人民币,得自己搞系统,NAS 对小白用户很和谐的地方是,DMZ 有一个中央系统,并且提供了 Web 控制界面,相当于以 NAS 硬盘作为储存中心,WebOS 上操作。
如果我选了 NAS/GEN8 估计也不会写这篇文章了。既然家里有闲置的电脑,而自己也有硬盘,就没有必要再去购买其他网络设备搭建远程操控环境了~
能够从万千网络中定位一台机器,估计也就只有 IP 了,家里安装的是电信的宽带,不像教育网分配了固定的网段,电信这种拨号方式上网的方式每次分配到的 IP 是动态变化的。为了能够拿到 IP,我们必须把变化的 IP 存在一个位置去,有三种方案:
我的博客托管在 github 提供的静态文本服务中,之前买的主机也到期了,所以就选择了方案二。
1. 先拿到本地 IP
在命令行输入 ifconfig/ipconfig
只能拿到路由器 DHCP 分配的地址,如 192.168.0.110,想拿到 IP,必须跟外网打交道,比如:curl ipinfo.io
。
➜ ddns git:(master) ✗ curl ipinfo.io
{
"ip": "115.*.*.*",
"hostname": "No Hostname",
"city": "Hangzhou",
"region": "Zhejiang Sheng",
"country": "CN",
"loc": "30.*,120.*",
"org": "*"
}%
如上所示,通过 ipinfo.io 提供的服务,我们可以很方便拿到外网。
2. 推到 DNSPod
如果你在其他域名提供商购买的域名,你需要将你的域名解析从提供商迁移到 DNSPod,这方面的迁移网上资料很多,可以搜索一下。DNSPod 相比其他提供商的域名解析服务,要更加优质,而且提供了 D监控,实时为你的域名解析保驾护航,有问题会及时邮件、短信警报。
接着在你的 DNSPod 上添加一个二级域名,比如我就随便搞了一个 proxy.barretlee.com
,将它 A记录到任意地址,如 8.8.8.8。
这一步完成之后,你就可以通过 DNSPod 提供的接口修改 A 记录了。具体用到了三个接口:
1) //dnsapi.cn/Domain.List
curl -k //dnsapi.cn/Domain.List -d "login_email=YOUR_REGISTER_EMAIL&login_password=YOUR_PASSWORD&format=json"
我在后面加了一个参数 format=json
,默认是 xml 格式。在这里可以拿到 Domain 信息,比如我就拿到了在 DNSPod 上的两个域名信息,一个是 barret.cc 的具体信息,一个是 barretlee.com 的具体信息。这里有用的是 barretlee.com 中的 id 字段,我拿到的值为 25348135。
2) //dnsapi.cn/Record.List
curl -k //dnsapi.cn/Record.List -d "login_email=YOUR_REGISTER_EMAIL&login_password=YOUR_PASSWORD&format=json&domain_id=25348135"
通过这个接口,可以拿到 barretlee.com 所有子域名的信息,proxy.barretlee.com
对应的 record 的 id 字段值为 126112527。
3) //dnsapi.cn/Record.Ddns
,//dnsapi.cn/Record.Modify
## 查询 proxy.barretlee.com 域名对应的 A 记录
curl -X POST //dnsapi.cn/Record.Ddns -d 'login_email=YOUR_REGISTER_EMAIL&login_password=YOUR_PASSWORD&format=json&domain_id=25348135&record_id=126112527&record_line=默认&sub_domain=proxy'
## 修改 proxy.barretlee.com 域名对应的 A 记录
curl -X POST //dnsapi.cn/Record.Modify -d 'login_email=YOUR_REGISTER_EMAIL&login_password=YOUR_PASSWORD&format=json&domain_id=25348135&record_id=126112527&sub_domain=proxy&record_line=默认&record_type=A&value=YOUR_LOCAL_IP'
前两个请求是 GET 方式,而这里的请求是 POST 方式,具体文档在 这里。有人用 python 和 php 都写了工具,我就没有重复早轮了,后面 php 那个稍微靠谱点,但是查询本地外网 IP 用了他自己提供的服务,我做了点修改(改成使用 ipinfo.io 提供的服务,稍微靠谱点),可以戳这里:
Github:http://github.com/barretlee/ddns
3. 定时推
前文提到,IP 是会变化的,为了保证 proxy.barretlee.com 能够准确解析到本机,IP 变化的时候需要快速更新 A 记录,为了简洁,可以设置定时任务,每隔 1 分钟推送一次:
# 执行
crontab -e
# 写入任务
* * * * * php path/to/ddns/index.php
使用 crontab 创建一个定时任务,实时推送。可以通过 crontab -l
查看任务列表。
# 验证效果
ping proxy.barretlee.com
以上就能够通过 proxy.barretlee.com 获取到家里机器的 IP 地址了。需要注意的是,你们家电信宽带服务可能并不是通过路由拨号上网的,当你访问 proxy.barretlee.com 或者拿到的 IP 时,你会看到如下登录提示:
这个时候你就致电 10000,选择人工服务器,让电信帮你设置为通过路由器登录吧~(生效时间估计得二十多分钟,需要重启猫、路由等设备)
上面我们只是解决了,将本机外网的 IP (也就是路由器的 IP)推到 DNSPod,而路由器上是没有装什么软件的,我们不能通过路由器访问到这个小局域网中的任何设备。需要登录到路由器进行一些设置。
一般的路由器都提供了 web 控制界面,在这里我们需要执行如下操作:
1. 将局域网内的某个固定 IP 绑定你的电脑
路由器也是使用 DHCP 随机分配一个 IP 给你的电脑,为了让路由器能够找到你的电脑,可以将电脑的 MAC 地址和 IP 地址对应起来:
路由器一般都会有 "IP与MAC绑定这一项",找到之后,绑定二者,如图中,我的本机 IP 目前为 192.168.0.110。
2. 将本机 IP 作为对外设备
DMZ 主机也是路由器自带的,通过DMZ主机功能,广域网中的设备可直接访问局域网中的DMZ主机
如果要让局域网中 IP 地址为 192.168.1.110 的主机能够被广域网中的设备直接访问,则可以开启 DMZ 主机功能,在“DMZ主机IP地址”处填入 192.168.1.110 保存即可。
这个操作相当于将路由的 IP 直接赋予给你的电脑。如果你觉得风险过大,可以通过路由提供的虚拟服务器转发端口,比如外网过来的 10002 端口转发到内网的 80 端口,也就是:
这样,通过 proxy.barretlee.com:10002
就能访问到 192.168.1.110 机器提供的 web 服务了。
1. 防火墙
不管是 windows 还是 mac,先查看下你的防火墙,比如你开启了 apache 服务器,就去防火墙看看,这个服务是否允许外部访问,如果不允许,就得设置过来,或者干脆直接关闭防火墙。mac 的防火墙设置在这里:
2. 开启服务
如果你只需要远程登录到 mac,可以 enable ssh server
,相当于打开 ssh 的服务器,让机器可以被 ssh 。你也可以在电脑上安装 apache/nginx/nodejs 等等各种服务和程序,你也可以在电脑上设置 vpn server,让电脑作为代理被使用,想怎么折腾就怎么折腾。
如果你理解整个流程都在做什么,以上操作可以在一小时内搞定。本文,简单点说,就是教你如何把自己的电脑变成一台可访问的服务器。
好吧,写了一堆,希望给爱折腾的你提供点帮助。