内网穿透和反向代理软件

内网穿透,又叫NAT穿透、端口映射、端口转发、反向代理、内网转外网/公网……

原理

由于IPv4地址的缺乏,运营商们越来越少给我们提供公网IP,即使能够分配到公网IP,也是动态ip,在网络断开重新链接后IP地址就会改变。而我们使用交换机、路由器,使得我们处于“专用网”中,用ipconfig(Linux用ifconfig)查询本机IP会得到下面的几类局域网地址:

1
2
3
A类:10.0.0.0    到 10.255.255.255    (10.0.0.0/8)
B类:172.16.0.0 到 172.31.255.255 (172.16.0.0/12)
C类:192.168.0.0 到 192.168.255.255 (192.168.0.0/16)

校园网经常分配到上面的A类地址,运营商的宽带可能分配到172开头的地址;而家用路由器分配的是192.168开头的地址。然后我们通过网络地址转换协议 NAT 转换IP地址进行上网。

反向代理图解|Imperva

所以,拥有一个公网IP就相当于处在各种网络的最外层,可以直接和其他主机进行通信。而处在NAT路由器内的主机的通信必须由专用网内的主机发起。因为如果是外部主机发起的通信的话,路由器不知道要将数据包转发给专用网中的哪一个主机。于是就有了反向代理的工作方式,把一台处于内网中的主机和一台拥有公网IP的主机的端口绑定,然后由公网主机将来自外部的请求转交给内网主机。这样,就实现了内网主机作为服务器的功能。

软件

接下来推荐几个好用的内网穿透/反向代理软件:

DDNS (动态域名解析+端口映射)

这个其实不算是软件吧,算是路由器应用…

  • 路由器/猫
  • 有动态公网IP
  • 管理员权限

大多数的家庭宽带还是会分配公网IP地址的(除了一些二级运营商比如移动),只不过是临时的动态IP,断开重新拨号后IP地址就会改变。大部分路由器会提供动态域名解析的功能,虽然IP会经常变化,只要有一个域名指向这个IP地址就可以了。

打开路由器的设置界面,通常有一个叫DDNS或类似域名动态解析的选项。在动态域名服务的提供商那里注册账号,选一个二级域名,然后在路由器里面填上用户名和密码。设置完ping一下你的二级域名比如xxx.wicp.net,如果返回的是你的路由器的IP地址,就说明设置成功了。

路由器的端口映射设置

现在外部请求已经能够到达路由器了,接下来在路由器里设置端口映射(有的叫虚拟服务器),将路由器的特定端口和局域网内的主机绑定,这样特定的服务就能够和局域网内特定的主机通信了。

通过动态域名和端口映射的方法局限性很大。在家里,我们知道路由器的密码,有更改路由器设置的权限;在学校的校园网,宿舍的个人网呢?如果被分配在多层子网中,你需要一层一层地联络网络管理员给你开放端口,还不能保证他们一定会给你开……遇到这种情况我们还是另辟蹊径吧。

ssh -R

  • 最最方便的方法
  • 无需额外软件
  • 跨平台
  • 需要VPS

新版的Win10已经自带OpenSSH了,在设置 -> 应用 -> 应用和功能 -> 管理可选功能中可以启用。

win10开启OpenSSH

OpenSSH 提供了三种端口转发功能:正向代理(local),反向代理(remote),以及动态代理(dynamic)。在这里,我们用到的是它的反向代理功能。

只需要一句命令即可开启端口转发:

1
ssh -o ServerAliveInterval=60 -R 8888:127.0.0.1:3389 beanbang@121.29.54.117

执行命令,输入密码,进入终端就已经建立了从本机的3389端口到服务器的8888端口的链接。现在,你就可以在远程桌面中通过地址121.29.54.117:8888来连接你的主机了。其中-o ServerAliveInterval=60项是为了防止长时间无操作被关闭连接,每隔60秒向服务器发送信号。

如果开启失败可能是服务器端没有启用:

1
2
sudo vim /etc/ssh/sshd_config    #添加一行  GatewayPorts  yes
sudo service sshd restart

以及记得在防火墙中允许特定端口的通信。

frp

  • 安装方便
  • 跨平台
  • 功能强大
  • 需要VPS

frp(fast reverse proxy) 是一个功能强大的开源反向代理软件。在GitHub上面有详细的中文说明

可以很轻松地配置简单的端口转发。只要下载对应架构的程序放到相应的操作系统上。公网IP的主机使用 frps 和 frps.ini,内网主机则使用 frpc 和 frpc.ini。

解压:

1
tar -zxvf frp_0.21.0_linux_amd64.tar.gz

编辑frps.ini

1
2
3
4
5
6
7
8
9
# frps.ini
[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password
log_file = ./frps.log
log_level = info
log_max_days = 3

启动 frps:

1
./frps -c ./frps.ini

编辑frpc.ini

1
2
3
4
5
6
7
8
9
10
# frpc.ini
[common]
server_addr = 121.29.54.117
server_port = 7000

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 8888

启动 frpc:

1
./frpc -c ./frpc.ini

服务端和客户端都启动后,就可以通过121.29.54.117:8888来连接远程主机了,还可以访问 http://121.29.54.117:7500 来打开frp的 Dashboard 界面,用网页的形式查看各种相关信息。

frps的dashboard界面

开发者细心地编译了多种操作系统架构的程序使得我们可以方便地下载和使用,比如树莓派就可以使用其 arm-64 版本来架设小型服务器。

路由侠等内网映射服务

  • Windows系统
  • 图形界面,操作简单
  • 服务型,额外付费

路由侠适合那些没有自己的公网服务器,只需要临时连接,或者不想要自己折腾的人。类似的这种软件还有 花生壳、net123、蛤蟆吃(hamachi)等等。这些算是提供服务类型的软件了。只要安装上客户端,进行简单的配置就可以使用它们的服务了。

不过没有免费的午餐,这些软件往往提供有限制的免费套餐,然后提供附加的服务进行收费。比如路由侠就限制1个月1G的流量,1Mb的带宽。提供给你一个二级域名和端口号,用这个域名和端口来访问服务。

想当年和小伙伴玩Minecraft开服用的就是路由侠。在电脑上架上CraftBukkit服务器,然后开放地址开一起来开荒。后来买了vps,服务器就搬到vps上面去了。

mstsc开启映射网络驱动器

其实,端口映射我用的最多的还是远程桌面。去机房上机的时候,打开 mstsc ,远程桌面连上自己的电脑。这样避免了机房电脑渣机运行缓慢,而且实验结束不用拿U盘拷走实验结果,文件也可以直接传回电脑去。特别的方便有木有?


参考资料:

作者

Lazyb0x

发布于

2018-10-21

更新于

2022-09-10

许可协议

评论