frp

服务端部署

服务端配置很简单,简单说下原理,服务端运行,开放一个通信端口;全靠客户端发送内网地址、内网端口、监听域名、监听协议等给服务端
然后服务端根据客户端传过来的数据适当监听端口。

免费的服务器:https://www.ioiox.com/frp.html

真机安装

# 下载合适的程序
https://github.com/fatedier/frp/releases
解压后分离出服务端和客户端(注意还有进程管理脚本),放到/opt/frp/下

vim /opt/frp/frps.ini

[common]
bind_port = 7000 # frp通信端口
# web端口,如果已经部署了nginx或者宝塔等端口已被占用,可以改其他端口
vhost_http_port = 80 # 默认的http端口
vhost_https_port = 443 # 默认https端口

authentication_method = token
token = 1234567890asdfgh自己随机生成一个字符串

# 状态页面,只能查看状态
#dashboard_addr = 0.0.0.0
#dashboard_port = 8080
#dashboard_user = admin
#dashboard_pwd = admin123456

# 启动
/opt/frp/frps -c /opt/frp/frps.ini
如果正常运行就可以下一步了,
如果安装了宝塔,可以用宝塔的supervisor插件管理进程
或者用frp自带的进程管理脚本修改一下。

然后防火墙放行端口

Docker服务端

https://github.com/stilleshan/frps#docker-%E9%83%A8%E7%BD%B2
https://hub.docker.com/r/stilleshan/frps


客户端

真机安装

# 下载合适的程序
https://github.com/fatedier/frp/releases
解压后分离出服务端和客户端(注意还有进程管理脚本),放到/opt/frp/下

vim /opt/frp/frpc.ini

[common]
server_addr = nas.leolan.top
server_port = 7000

token = 1234567890asdfgh和服务端保持一致

# 共用一个域名:除了管理后台用http或https类型,其他都为tcp或udp
# 使用多个域名:通过多个域名访问多个服务则可以任意设置type
# 网页密码认证只支持http类型,其他都不支持

[nas_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 10008
custom_domains = nas.leolan.top

[web_http]
type = http # 一个域名对应一组http和https,其他的服务要用tcp或者udp;除非用新域名
local_ip = 192.168.1.100
local_port = 80
custom_domains = nas-web.leolan.top # 域名可一样或者不一样
#host_header_rewrite = 192.168.1.1 # 修改请求头,路由或者其他什么的有时候会有限制
http_user = admin
http_pwd = 12345asdfg

[web_https]
type = https
local_ip = 127.0.0.1
local_port = 8080
remote_port = 8080
custom_domains = nas-web.leolan.top

# 启动
/opt/frp/frpc -c /opt/frp/frpc.ini
如果正常运行就可以下一步了,
如果安装了宝塔,可以用宝塔的supervisor插件管理进程
或者用frp自带的进程管理脚本修改一下。

Docker客户端

参考:
群晖Docker部署frpc:
https://www.ioiox.com/archives/26.html
https://hub.docker.com/r/stilleshan/frpc


nps

服务端

mkdir /opt/nps

# 选择版本,下载文件,解压到/opt/nps
https://github.com/cnlh/nps/releases

#修改配置
vim /opt/nps/conf/nps.conf
修改web_password的登录密码,端口之类的,也可以使用默认的。
public_vkey随便改

# 测试
/opt/nps/nps

# 安装supervisor,防止软件崩溃
yum install epel-release -y
yum install supervisor -y

# 修改配置
mv /etc/supervisord.conf{,.bak}
vim /etc/supervisord.conf

##############################################################
[program:nps]
# 指定以某个用户启动程序
user=root
# 启动命令
command=/opt/nps/nps
# 项目的目录
directory=/opt/nps
#启动 8 秒后没有异常退出,就当作已经正常启动了
startsecs=8
# 在 supervisord 启动的时候也自动启动
autostart=true
# 程序挂了后自动重启
autorestart=true
# 输出的log文件
stdout_logfile=/opt/nps/nps.log
# 输出的错误文件
stderr_logfile=/opt/nps/nps.err

[supervisord]
# log的级别
loglevel=warn
# 守护进程日志路径
logfile=/opt/nps/supervisord.log
# 日志文件按大小分割
logfile_maxbytes=100MB


[inet_http_server]
# supervisor的服务器,所有ip可访问(服务器)
port=:9005
# 用户名和密码
username=myadmin
password=123456

#[unix_http_server]
# supervisorctl用XML_RPC和supervisord通信就是通过它进行的。
#file=/tmp/supervisor.sock

[supervisorctl]
# 和unix_http_server的设置保持一致
#serverurl=unix:///tmp/supervisor.sock
# 使用supervisorctl登录的地址和端口号(客户端)
serverurl=http://0.0.0.0:9005
# supervisorctl命令行操作使用:supervisorctl -c /xxx/supervisor.conf

# 登录supervisorctl的用户名和密码
username=myadmin
password=123456

# 必须启用,supervisorctl 通过它来管理进程
[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

##############################################################

systemctl restart supervisord
systemctl enable supervisord

# 检查端口是否起来了,注意放行防火墙端口
netstat -lntp

服务端Docker

# dockerhub:https://hub.docker.com/r/ffdfgdfg/nps
docker pull ffdfgdfg/nps

# 浏览器打开下面网址下载配置文件(chrome会报危险警告,不信任的可以自己去项目目录下载)
https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/ehang-io/nps/tree/master/conf

作者项目:https://github.com/ehang-io/nps

把配置文件放到/opt/nps/conf下
修改:(如果你的服务器安装了宝塔面板、或web服务)
http_proxy_port # HTTP代理端口(不要和web端口冲突)
https_proxy_port # HTTPS代理端口(不要和web端口冲突)
public_vkey  # 公用客户端连接密钥(自己后台生成的是独立的)
web_host # web后台地址,可以是IP,也可以是域名
web_username # web后台用户名
web_password # web后台密码
web_port # web管理端口
auth_crypt_key  # 必须为16位


启动:docker run -d --name nps --net=host -v /opt/nps/conf:/conf --restart=always ffdfgdfg/nps

##############################################
防火墙放行端口:8024,及上面修改的端口
设置域名解析(都是A记录解析到服务器):
nps.leolan.top
*.nps.leolan.top
这是三级域名,无法用letsencrypt的通配符域名的(包括宝塔中的通配符域名SSL)
如果需要通配符,折中方法是去掉nps,变为二级域名,缺点是不够直观,且二级域名绑定到了一台服务器上可能会对业务有一些影响。

进入nps管理后台添加客户端,添加客户端对应的域名(开发用的业务域名,如:wx.nps.leolan.top)


服务端(群晖Docker)

在Synology的Docker上运行

1、下载最新版本(Linux amd64)解压

2、修改配置文件信息,并移动到docker目录下
注意,你的可能是volume1
mkdir /volume2/docker/nps
mv conf /volume2/docker/nps/

3、在解压目录编写Dockerfile

FROM alpine
COPY . .

EXPOSE 80 443 8080 8024

VOLUME /conf
CMD ["/nps"]


构建镜像:
docker build -t nps -f Dockerfile .

4、在Nas界面运行容器
挂载卷选择docker/nps/conf
挂载到/conf

设置端口,自动启动等信息,最后运行。

客户端

# 客户端
优点:添加多域名很方便
缺点:需要手动启动脚本

下载对应系统的客户端:https://github.com/ehang-io/nps/releases
编写启动脚本:
vim wx_dev_start.sh 
#!/bin/bash
# wx.nps.leolan.top:开发用的域名,必须在后台添加了才能解析,解析到本地的端口在后台设置
# 8024:服务端的校验端口bridge_port,一般不用修改(要改要和服务端对应一起改)
# vkey:后台添加客户端时生成的密钥
./npc -server=wx.nps.leolan.top:8024 -vkey=dsfggserg325345 &

之后每添加一个域名只需要复制脚本,修改域名即可


# Docker方式
优点:单一域名比较方便,文件不杂乱
缺点:多域名不方便,占用空间多

简单一点的方法是使用脚本运行docker容器,使用host模式
每次停止后会自动清理容器

#!/bin/bash
docker run -d --name npc --rm --net=host --restart=always ffdfgdfg/npc -server=<IP:Port> -vkey=<密码>

参考资料:
https://github.com/cnlh/nps
https://cnlh.github.io/nps/#/?id=nps


goproxy

一款功能超多的内网穿透工具
https://github.com/snail007/goproxy


ngrok

**一键脚本:**https://github.com/clangcn/ngrok-one-key-install

域名配置

1、使用三级域名的按如下设置,
域名DNS设置:ngrok.leolan.top(用于查询服务器)和*.ngrok.leolan.top(用于映射三级域名)--》两个域名A纪录到服务器IP。
三级域名是不固定的,所以用*

2、如果使用第三方证书,且只支持二级域名的通配符证书,如:Let's Encrypt的通配符证书
这里使用的是*.leolan.top通配符证书
域名DNS设置:ngrok.leolan.top(用于查询服务器)和*.leolan.top(用于映射三级域名)--》两个域名A纪录到服务器IP。
**注意:**泛域名映射到一台主机是比较高风险的操作,所有未指定的二级域名都会被映射过去!!!


编译

yum install go -y

# 不要使用发布的版本,编译有问题(也可能是环境问题)
git clone https://github.com/inconshreveable/ngrok.git /usr/local/ngrok
cd /usr/local/ngrok

export GOPATH=/usr/local/ngrok/  #设置环境变量,ngrok源码目录
export NGROK_DOMAIN="ngrok.leolan.top"  #设置环境变量,ngrok域名,
# 如果域名设置中选了第二种方式(第三方证书),这里应为:NGROK_DOMAIN="leolan.top"

##########################################
# 为域名生成证书
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

# 复制证书到指定位置
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

如果使用第三方证书,如Let's Encrypt证书,忽略上面两部,执行下面步骤
cp fullchain.pem assets/client/tls/ngrokroot.crt  #客户端
cp fullchain.pem assets/server/tls/snakeoil.crt   #服务端
cp privkey.key assets/server/tls/snakeoil.key     #服务端

参考资料:https://blog.csdn.net/u013379553/article/details/88651599
##########################################

# 编译服务端和客户端(更改域名后要重新编译),根据需要选择
# win
GOOS="windows" GOARCH="386" make release-server release-client
GOOS="windows" GOARCH="amd64" make release-server release-client

# linux
GOOS="linux" GOARCH="386" make release-server release-client
GOOS="linux" GOARCH="amd64" make release-server release-client

# Mac
GOOS="darwin" GOARCH="386" make release-server release-client
GOOS="darwin" GOARCH="amd64" make release-server release-client

然后可以在bin下看到已编译好服务端和客户端文件。

服务端(Linux)

这里开启HTTP:8001;;;HTTPS:8002;;;Tunnel:4443(该端口只参与配置、调度,不参与转发数据)
# 新建启动脚本(同理,域名配置选了第二种方式的,这里应为:-domain="leolan.top")
# 使用证书同时可以修改端口-httpAddr=":80" -httpsAddr=":443",通信端口tunnelAddr保持不变
vim start_ngrok.sh
#!/bin/bash
nohup /usr/local/ngrok/bin/ngrokd \
      -domain="ngrok.leolan.top" \
      -httpAddr=":8001" \
      -httpsAddr=":8002" \
      -tunnelAddr=":4443" &

# 如果配置了证书,还要带参数启动:
-tlsKey="/usr/local/ngrok/assets/server/tls/snakeoil.key"
-tlsCrt="/usr/local/ngrok/assets/server/tls/snakeoil.crt"

客户端

原理:启动客户端时连接ngrok.leolan.top:4443;并把需要转发的本地端口和三级域名转发过去,同时根据参数使用HTTP还是HTTPS,自动使用8001还是8002;通过指定三级域名来建立多个链接。

新建配置文件

新建ngrok.cfg文件,内容如下
# 定义服务器通信地址
server_addr: "ngrok.leolan.top:4443"
trust_host_root_certs: false
# 服务端如果配置了证书启动,这里要为true

启动脚本

# 根据系统不同,建立bat或sh脚本文件,以linux系统为例
#!/bin/bash
/opt/ngrok/ngrok_linux -subdomain $1 -config=/opt/ngrok/ngrok.cfg -proto $2 $3
echo '请输入xxx.sh [域名前缀] [http或https] [本地端口]'

一切正常的话就可以连上了。域名不对会报:bad certificate;;;重新生成证书。

Docker

参考:https://leolan.top/index.php/posts/222.html

反向代理

如果是用于微信开发之类的,要80端口,可以用nginx做反代;记得加端口!!!,

proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host:8001;

参考资料:
HTTPS支持、TCP穿透:https://yii.im/posts/pretty-self-hosted-ngrokd/


开发机配置、多隧道

开发机配置:https://blog.csdn.net/riverjiant/article/details/70757607
多隧道:https://free-e.net/112
多隧道、多协议:https://www.jianshu.com/p/69b4f10ad954

参考:
http://blog.csdn.net/zhangguo5/article/details/77848658?utm_source=5ibc.net&utm_medium=referral
https://www.sunnyos.com/article-show-48.html
https://yq.aliyun.com/articles/11852


SSH内网穿透

推荐博文:https://blog.csdn.net/dufufd/article/details/75578277

本地转发

# 场景,如本地开发机通过公网测试服务器访问RDS(授权了测试服务器的IP可访问)
# 在本地机器上执行(有权限链接跳板机)
ssh -L 9527:数据库服务器:3306 root@跳板机(代理机器、测试服务器)、
数据库服务器可以和跳板机是同一台(授权IP访问,但本地又没有固定IP的情况)

解释为,当访问本机的9527的端口时,被加密后转发到跳板机的ssh服务,服务器的3306端口

注意的点:

  • 1、SSH 端口转发是通过 SSH 连接建立起来的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>
  • 2、我们只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
  • 3、好了,我们已经在本地 建立了端口转发,那么既然我们在监听本地的9527端口,那么其他机器也访问本地的9523端口会不会自动转发呢?比如能否新增加一台客户端2来直接连接客户端的9527 端口?答案是不行的,在主流 SSH 实现中,本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”。好在 SSH 同时提供了 GatewayPorts 关键字,我们可以通过指定它与其他机器共享这个本地端口转发。
  • 4、当然了,你可以随意的指定remote host,假如你要访问的服务就在跳板机上,因为防火墙又不能直接访问到,那么remote host和SSH hostname可以是同一台。

远程转发(内网穿透)

# 场景,本地服务需要开启公网访问
# 在本地机器上执行(有权限链接跳板机)
ssh -R 9527:内网机器:3306 root@公网机器(代理机器、测试服务器)
内网机器可以是本机,也可以是和本地同一内网的机器

让公网服务器监听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到内网机器ssh客户端,再由内网机器ssh客户端解密后转发到内网机器3306端口。这听起来有点奇怪,因为这个时间内网服务器充当了两个角色,就是ssh客户端和server端。

这个时候就是让公网服务器监听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到跳板机ssh客户端上,再由ssh客户端解密后转发到内网机器3306端口上。

注意的点:

  • 1、必须保持ssh client到ssh server的 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。
  • 2、我们只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
  • 3、对于远程转发来说,/etc/ssh/sshd_config里要把AllowTcpForwarding选项设置为yes,否则-R远程端口转发会失败。把**/etc/sysctl.conf里的net.ipv4.ip_forward = 0**设置为1
  • 4、默认转发到远程主机上的端口绑定的是127.0.0.1,如要绑定0.0.0.0需要把**/etc/ssh/sshd_config里的GatewayPorts**选项设置为yes。这个选项如果由于权限没法打开也有办法,可配合ssh -L将端口绑定到0.0.0.0,如下:ssh -R 127.0.0.1:9527:内网机器:3306 root@公网机器;再执行:ssh -L 0.0.0.0:9527:127.0.0.1:9527 root@127.0.0.1

动态转发(科学上网)

ssh -qTfnN  -D 127.0.0.1:9527 root@香港服务器

**浏览器:**推荐chrome浏览器switchyOmega插件设置为下就可以了。
命令行:

brew install proxychains-ng
vim /usr/local/etc/proxychains.conf # 在ProxyList配置段下添加配置 "socks5 	127.0.0.1 9527"

proxychains-ng wget http://xxxxx # 在其它命令行前添加proxychains-ng即可

ssh链接:

# 用以下命令使用socks5代理:
ssh -o ProxyCommand='/usr/bin/nc -X 5 -x 127.0.0.1:5000 %h %p' root@xxxxx

转发常用的参数用法:

ssh -qTfnN -D 127.0.0.1:12345 test@222.333.444.555
  • -f 要求 ssh在执行命令前退至后台.它用于当ssh准备询问口令或密语,但是用户希望它在后台进行.该选项隐含了-n选项.
  • -N 不执行远程命令.用于转发端口.
  • -C 要求进行数据压缩 (包括stdin, stdout, stderr以及转发X11和TCP/IP连接 的数据).压缩算法和gzip(1)的一样,协议第一版中,压缩级别 “level” 用CompressionLevel选项控制.压缩技术在modem线路或其他慢速连接上很有用,但是在高速网络上反而 可能降低速度.可以在配置文件中对每个主机单独设定这个参数.
  • -g 允许远端主机连接本地转发的端口
  • -q 安静模式.消除所有的警告和诊断信息
  • -T 禁止分配伪终端
  • -n 把 stdin重定向到/dev/null (实际上防止从stdin读取数据). ssh在后台运行时一定会用到这个选项.它的常用技巧是远程运行X11程序.

如何使用Xshell在windows机器上动态转发

见参考资料


参考资料:
https://zhuanlan.zhihu.com/p/65681748
http://www.dkys.org/archives/1317.html


ZEROTIER ONE

配置:
https://post.smzdm.com/p/741270/
https://post.smzdm.com/p/alpzrnx8/

自建握手服务器(moon):
https://zczc.cz/2018/03/14/ZeroTier-moon-%E8%AE%BE%E7%BD%AE%E6%95%99%E7%A8%8B/
Docker版:https://zczc.cz/2018/05/13/Docker-%E4%B8%A4%E9%94%AE%E5%88%9B%E5%BB%BA-ZeroTier-moon-%E8%8A%82%E7%82%B9/

文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
环境搭建 本地转发 ngrok 远程转发 frp ssh-tunnel 动态转发 goproxy
喜欢就支持一下吧