这是咕了一个星期的内网外入_(:3 」∠)_
感谢姚老板的友情指导 (`・ω・´)
内网穿透
在实现内网外入之前,首先需要了解的是内网穿透。
内网穿透是什么?
内网穿透,又称NAT(Network Address Translation)穿透,即网络地址转换。它能够通过将专用的网络地址转换为公用地址,从而实现不同局域网内的主机之间通过互联网进行通信。
这里又涉及到两个概念 :
内网 : 也称局域网,指小部分网络的集合。一般会在一些特定环境中使用,如学校的局域网、公司单位的局域网等等。内网 IP 无法直接连接到外网。
外网 : 也称互联网,指全球性的互联网络。它是与因特网相通的网络,可以访问因特网上的所有网络资源。使用外网 IP 可以进行全球连接。
所以简单来说,内网穿透就是一种能让你连着内网的电脑访问外网,或者身处外地连不上内网的你访问到内网的技术。
如何实现内网穿透?
这里我们用的是github上一个内网穿透的工具 :netagent
首先在服务器上运行 agent-server,服务器连接着外网网络:
- port :指定 netagent 运行所占用的端口
- password :为该服务指定一个密码
然后在本机运行 agent-client,本地连接的是内网网络:
- -server_ip :对应的 agent-server 所在的 IP 地址
- -server_port :对应的 agent-server 的端口
- -password :对应的 agent-server 的密码
- -proxy_ip :需要进行穿透的服务的 IP 地址
- -proxy_port :需要进行穿透的服务所在的端口
- -remote_port :该服务在 agent-server 上映射的端口
让我们来试一下,路由是 [服务器IP]:[remote_port]
,这样就可以直接通过外网访问到内网的服务啦:
内网外入
有了内网穿透的基础,那要怎么实现内网外入(指访问到内网的各种服务,比如教务在线学工在线各种在线等等等等)呢?有了!把给每个服务都开一个端口不就好了!(被打
可以看到,仅仅通过内网穿透去开放端口,将内网服务映射到服务器上,其实是不靠谱的(一本正经)。那么有没有什么办法,可以让我们在外网访问的时候可以直接输入内网网址访问对应的服务,就好像连着内网一样平滑呢?有的!
只要将内网穿透的对象设定为本机,使本机端口与服务器端口绑定,原则上就能把连着内网的本机变成一个中转站,让原本访问不到内网网址的外网请求通过本机去中转,从而访问到对应的内网服务。
泛域名解析
如果要输入内网网址去访问对应的服务,首先要解决的就是将路由中的内网网址提取出来。
泛域名解析,是指利用通配符(星号)来做次级域名以实现将所有的次级域名指向同一 IP 地址。在域名前添加任何子域名,均可访问所指向的 WEB 地址。
简单来说,只要设置了诸如 *.yuanlier.cn
这样的泛域名解析,当访问 172.22.4.2.yuanlier.cn
的时候,就能够让请求直接抵达我方服务器了。
nginx配置
泛域名解析设置完成之后,下一步需要解决的是如何将用户输入的内网网址提取出来,并转发给本机去进行访问。这时候就需要对 nginx 做一些配置了。
由于一般访问网址的时候是不会去带端口号的,所以这里我们让它直接监听 80 端口(浏览器默认端口):
server {
listen 80;
# ...
}
然后进行泛域名匹配 :
# 如果前面不是监听的 80 端口,这里后面就需要再带上端口号;用户访问的时候也需要加端口号,就会比较麻烦
server_name ~^(.+)\.yuanlier\.cn$;
# 提取域名,将 *.yuanlier.cn 中 * 所匹配的部分存入 $cqupt
set $cqupt $1;
最后实现跳转,让本机去代替外网请求访问内网资源 :
location /{
# 重定向到我们取出的内网网址
proxy_pass http://$cqupt;
proxy_redirect off;
# 这里需要重新设置一下请求头
proxy_set_header Host $cqupt;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
以及最重要的一步 :配置域名解析器,这样才能成功解析到域名形式的内网地址。以我们学校为例(),ping 一下它的域名就可以得到内网服务器的 DNS了 :
然后把它加到我们的配置里面 :
# 后面是两个常用的 DNS,如果内网解析失败就会去这里找
resolver 202.202.32.33 114.114.114.114 8.8.8.8 valid=3600s;
完整的配置文件如下 :
server {
listen 80;
server_name ~^(.+)\.yuanlier\.cn$;
resolver 202.202.32.33 114.114.114.114 8.8.8.8 valid=3600s;
set $cqupt $1;
location /{
proxy_pass http://$cqupt;
proxy_redirect off;
proxy_set_header Host $cqupt;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其他注意事项 :
- 也可以配置其他端口,但 80 是最方便的,因为不需要用户手动带上端口号
- 如果监听的端口和内网穿透中映射的端口不一致,则需要在服务器也进行相应的nginx配置,具体可以参考姚老板的博客
更新本机的内网穿透服务
由于我们将需要穿透的 IP 更改为了本地,所以得重启一下本机的内网穿透服务。记得将端口号换成 80 :
最后检验一下成果 :
完美( >ω<)
写在最后
再一次感谢姚老板的友情指导 (`・ω・´)
以及这个版本其实真的非常简陋 稍微被攻击一下就没了(><) 如果想做成那种内网外入的话还需要更多多多多多多的完善的!总而言之 守护内网环境 从你我做起 该博文仅图一乐()