内网穿透-公网访问家庭内网

一、为什么需要内网穿透

相信学过计算机网络知识的同学都知道,因为IPV4地址的稀缺性,局域网内的电脑通过路由器上网时,是需要经过NAT转换为公网ip的,而电脑被分配到的私有ip一般是192.168.x.x(注:电脑ip地址查看可以通过ifconfig(Linux系统)或ipconfig(windows)系统命令查看),而在公网中的另一台电脑要访问该电脑时,该电脑没有公网ip地址,是无法直接访问的,所以需要用到内网穿透技术。

二、解决方案

使用路由器的端口转发功能(仅针对电信网络有效)

基本原理是让路由器获得一个公网ip,然后使用路由器的端口转发功能,让访问路由器ip+特定端口的请求转发到指定的局域网内电脑ip和端口上

1. 首先你需要一台具有端口转发功能的路由器,登录路由器管理界面,进入高级设置页面,确定路由器有虚拟服务器(或者类似名称)选项:

2. 更改路由器的上网模式:现在电信宽带光猫一般都自带拨号和无线上网功能,当使用光猫的自动拨号功能连接宽带时,光猫本身获得了公网ip,光猫后面接的路由器分配到的便是光猫指定的私有ip。可是光猫又不具有端口转发功能,而路由器因为没有公网ip也无法实现端口转发功能。登录路由器管理界面,进入高级设置页面,点击WAN口设置,查看详情:

我的路由器已经被我更改成了拨号上网的方式,如果路由器是自动获得ip方式的上网,那么需要拨打电信客服电话,告诉工作人员将光猫上网方式由路由器模式改为桥接模式。然后修改WAN口设置,修改连接类型,填上自己的宽带账号的密码进行拨号连接。

3. 更改ip为公网ip:因为ipv4地址资源紧张,运营商分配给我们的上网ip地址其实是一个经过转换过的私有ip地址,也就是路由器并没有公网ip地址。需要拨打电信客服电话,告诉他们让其分配一个公网ip(只有电信可以,联通和移动不行,会告知没有这项业务)。

4. 添加端口转发功能:当以上步骤完成后,进入理由器管理界面,选择虚拟服务器选项,添加转发规则:

上图中规则含义:当外部网络访问路由器ip地址+9999端口时,转发到内网192.168.0.101机器的22端口上。

5. 测试:首先打开http://www.ip138.com/网站,此时可以看到自己的公网ip,然后打开操作系统的命令行窗口,使用telnet命令:telnet 你的公网ip 外部端口,如果能够连接成功,证明全部设置已经成功。

6. 做完上述步骤后,虽然已经实现了内网穿透功能,但是有两个缺点,1:ip地址难以记忆,没有域名好记,2:虽然分配了公网ip,但是每隔两三天ip就会变化一次,不固定。此时就需要用到动态域名解析功能,即将固定域名指向动态变化的ip。配置动态域名解析由两种方式,第一种是花生壳的动态域名解析,第二种是使用阿里云的动态域名解析功能。在这里我介绍第二种方式。

7. 使用阿里云动态域名解析步骤:

使用阿里云动态域名的原理是通过阿里云提供的sdk api,在程序中将购买的阿里云域名映射到我们自己的公网ip,每隔一段时间检测自己的公网ip有无变化,如果有变化,则调用程序更新映射。

1). 购买一个阿里云的万网域名,年费在40元左右。且被访问的电脑运行的是centos/redhat系统(这种场景也非常合理,很多时候我们需要访问家里电脑,是因为我们在上面部署了一些web服务应用,所以需要运行centos系统)

2). 安装python-pip:

yum -y install epel-release
yum -y install python-pip

3). 安装阿里dns python-sdk:

sudo pip install aliyun-python-sdk-alidns

4). 克隆我的github项目——DynamicDNS到本地机器:

git clone https://github.com/aiwangzhe/DynamicDNS.git

5). 登录阿里云官网,点击自己账户信息,找到accesskeys选项,点击进去获取到自己的accessid和密码:

打开DynamicDNS工程下的AliRequest.py文件,找到getAcsClient()方法替换里面的accessid和密码:

def getAcsClient():
    return AcsClient("your access id", " your access token")

找到AliRequest.py文件中的main方法,将下面内容替换为自己的域名:

# TODO replace your domain name
recordId = getDomainRecordId("your domain name", "www")

然后执行sh UpdateIP.sh命令,命令执行成功后,会在用户home目录下生成Last_IP.txt文件,里面记录了当前机器最新的公网ip。登录阿里云的管理控制台,点击云解析DNS选项,可以看到域名已被映射到新的ip:

6). 添加定时任务:虽然执行sh UpdateIP.sh命令成功更新了域名到ip的映射,但是因为公网ip会经常变化,所以需要将该命令添加到linux定时任务中,定时更新ip。打开工程目录下的CheckIpTask.cron文件:

*/5 * * * * sh /home/wangzhe/DynamicDNS/UpdateIP.sh

内容含义为每5分钟执行一次UpdateIP.sh脚本,该脚本会先去检测公网ip是否已发生变化,如果发生了变化则调用阿里云sdk更新域名映射。读者需要先替换UpdateIP.sh文件路径为自己的真实路径,然后使用crontab CheckIpTask.cron命令,将其添加到定时任务中。至此大功告成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章