随着互联网的快速发展和入网设备的增多,公网IPv4地址越来越稀罕。试想一下,如果你在家里或者在单位里搭建了一套网络服务,比如NAS,如果没有公网ip,又改如何在外连接呢?

内网穿透是一种非常常见和有用的技术,如当需要访问公司内网的计算机时,内网穿透技术就可派上用场。

常用的内网穿透软件包括ngrok、zeroto向日葵等,frp是国人开发的一款高性能内网穿透工具,具有相当强大灵活的功能。

应用

此处不赘述frp的原理,只简单的介绍frp的应用。

使用frp需要一台具有公网ip的服务器,推荐使用国内的服务器,国外的服务器由于延迟的原因使用体验非常差。

服务器端设置

选用阿里云的轻量服务器,首先根据服务器平台下载相应的软件。在服务器主要设置frps.ini这个文件。服务器端的设置主要就这么一些,其他功能配置基本在客户端完成。

[common]
# A literal address or host name for IPv6 must be enclosed
# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"
bind_addr = 0.0.0.0
bind_port = 7000

# udp port to help make udp hole to penetrate nat
bind_udp_port = 7001

# udp port used for kcp protocol, it can be same with 'bind_port'
# if not set, kcp is disabled in frps
kcp_bind_port = 7000


dashboard_addr = 0.0.0.0
dashboard_port = 7500

dashboard_user = admin
dashboard_pwd = admin

token = 12345678

客户端设置(校园内的设备)

由于经常不在学校,很多学术数据库都是ip控制的,比如IEEE(在这里为Elsevier鼓掌,remote access功能非常好用,任何地方都不用担心不能查阅文献),所以我需要的功能是在外浏览这些学术期刊时,可以通过内网穿透,用学校的ip进行访问。

实现的方法有很多,比如在客户端建立vpn,把客户端作为shadowsocks服务器以及其他一些方法。但是如果只是为了实现以上功能,frp提供了一个http_proxy插件,非常简单和高效。

配置参考官方readme,也没什么可说的。之后再本地运行frpc即可。以下配置实现了ssh和http代理的功能,在浏览学术期刊时,通过该http代理,即可愉快(真的吗?)地科研了。

# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

# If ssh needed
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

# http_proxy_plugin
[http_proxy]
type = tcp
remote_port = 6000
plugin = http_proxy
plugin_http_user = abc
plugin_http_passwd = abc

关于如何设置http代理这最后一步,个人比较推荐采用proxyswitch omega这个插件来实现,在切换时比较方便,而windows全局代理显得太暴力了。此外,根据frp作者所说,采用插件的方式比起其他方法实现该功能,效率是较高的。