求推荐内网穿透方式

2017-05-21 22:46:48 +08:00
 yangxuan8282

家里用的是电信无线宽带(4G)没有公网 IP,树莓派上有几个网页,想在外网访问只能考虑内网穿透,因为手里已经有 vps 所以倾向于用现有的资源,不太想用花生壳这一类付费的,想请大家推荐一下哪种方式比较好

我知道的几种方式:

前三个都试过,ngrok 和 n2n 还没尝试

ssh 隧道最方便,也不用装其它软件,不过速度一般;狗洞 lite 是用过的里面最满意的,自带 kcp,对丢包明显的线路来说很适合,速度不错,不过有个问题是电信无线宽带不是很稳定,一旦断网重连狗洞 lite 就会报错说端口已占用,必须把 server 端退掉重新开才行,所以经常得手动重连; frp 感觉配置有点繁琐,还得在配置文件里配置域名,多个站点的情况下不清楚怎么配置

9547 次点击
所在节点    问与答
50 条回复
wwqgtxx
2017-05-22 10:24:54 +08:00
client 端配置文件应该这样写

```
[common]
server_addr = $SERVER_IP
server_port = 7000
[http]
type = tcp
local_ip = 127.0.0.1
local_port = 80
use_compression=true
remote_port = 80
```
wwqgtxx
2017-05-22 10:27:34 +08:00
@yangxuan8282
@Tink
dog-tunnel lite 的断线后端口已占用也是个蛋疼的坑
Tink
2017-05-22 10:29:22 +08:00
@wwqgtxx #22 感觉这个得写个脚本不停的测试,发现断了之后把进程杀了再重启
wwqgtxx
2017-05-22 10:34:05 +08:00
@Tink 这也是我从 dt lite 转向 frp 的原因,至于 kcp,实在不行用 kcptun 套一层就行了嘛
chinajik
2017-05-22 11:07:33 +08:00
frp 可以自动增加节点,做跳板机很好
Pepsigold
2017-05-22 17:04:44 +08:00
@fzinfz 这个可以,正在用
yangxuan8282
2017-05-22 17:40:44 +08:00
@wwqgtxx 按你后来给的配置试了一下可以了,我以为 `[http]` 只是说明,不起实际作用
wwqgtxx
2017-05-22 18:00:25 +08:00
@yangxuan8282 带方括号的在 ini 文件中为代码段,如果是说明的话,应该用井号注释才对
yangxuan8282
2017-05-22 18:00:53 +08:00
@Tink
@wwqgtxx
狗洞断线重连后端口已占用这个 bug 确实挺难受的
下午尝试了一下用 systemd 管理狗洞,用两个脚本分别控制狗洞的启动和停止
直接运行两个脚本可以正常启停,不过到了 systemd 里一启动就退了,也没看到什么报错

下面两个脚本分别是启动和停止狗洞的,为了防止出现端口已占用的情况,启动前先把 server 上之前的狗洞给停了再启动,停止的脚本也是把 server 和 client 都停了

```
pi@raspberrypi:~ $ cat /usr/local/bin/dtunnel-up.sh
#!/bin/bash
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl stop dtunnel-server
sleep 3
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl start dtunnel-server
/usr/bin/screen -dmS dtunnel /usr/local/bin/dog-tunnel -service $SERVER_IP:1234 -v -action 127.0.0.1:80 -encrypt -xor $XOR -local :80 -pipe 5 -r
```

```
pi@raspberrypi:~ $ cat /usr/local/bin/dtunnel-down.sh
#!/bin/bash
#set -e
/usr/bin/screen -S dtunnel -X quit
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl stop dtunnel-server
```

下面是 client 上狗洞的 systemd,启动和停止分别执行上面两个脚本,可惜用 systemd 运行就不行了,运行 sudo systemctl start http-dtunnel 后查看也没开 screen 会话,直接运行 sudo /usr/local/bin/dtunnel-up.sh 的话会建立一个名为 dtunnel 的会话,然后在会话里连接 server

```
pi@raspberrypi:~ $ cat /etc/systemd/system/http-dtunnel.service
[Unit]
Description=Dog tunnel for http
After=network.target

[Service]
ExecStart=/usr/local/bin/dtunnel-up.sh
ExecStop=/usr/local/bin/dtunnel-down.sh
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target
```
wwqgtxx
2017-05-22 18:07:53 +08:00
@yangxuan8282 在 systemd 脚本中就不要用 screen 了,这样 systemd 会直接认为你的程序已经退出了
wwqgtxx
2017-05-22 18:09:03 +08:00
而且 systemd 的进程管理默认是用 cgroups 的,所以他可以强行结束一个完整的任务组,就算是 screen 新开的会话也会被强行关闭
ys0290
2017-05-22 18:13:48 +08:00
换宽带
wwqgtxx
2017-05-22 18:15:36 +08:00
建议做法
```
pi@raspberrypi:~ $ cat /usr/local/bin/dtunnel-up.sh
#!/bin/bash
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl stop dtunnel-server
sleep 3
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl start dtunnel-server
/usr/local/bin/dog-tunnel -service $SERVER_IP:1234 -v -action 127.0.0.1:80 -encrypt -xor $XOR -local :80 -pipe 5 -r
```
```
pi@raspberrypi:~ $ cat /usr/local/bin/dtunnel-down.sh
#!/bin/bash
#set -e
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl stop dtunnel-server
```
```
pi@raspberrypi:~ $ cat /etc/systemd/system/http-dtunnel.service
[Unit]
Description=Dog tunnel for http
After=network.target

[Service]
ExecStart=/usr/local/bin/dtunnel-up.sh
ExecStop=/usr/local/bin/dtunnel-down.sh
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target
```
这样就够了,systemd 可以自行结束所有该结束的子进程的
yangxuan8282
2017-05-22 18:52:09 +08:00
@wwqgtxx 果真不放在 screen 会话里直接运行就好了,谢谢了,本来以为白忙活了
刚才特意断网线试了一下好像能自动重连,也没看到端口已占用的报错
再试几天看看是否稳定
看来还是对 systemd 了解不够啊
待会整理个完整的配置脚本出来
yangxuan8282
2017-05-22 20:26:50 +08:00
再附一张浏览器内访问用狗洞 lite 暴露到公网的 novnc 截图

机器是搬瓦工的,延迟还是比较高,不过整体算能用
wwqgtxx
2017-05-22 20:42:47 +08:00
另外就是你文件中的
···
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl stop dtunnel-server
sleep 3
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl start dtunnel-server
···
可以直接换成
···
ssh -f -i /home/pi/.ssh/$SERVER_SSH_KEY root@$SERVER_IP -p $SERVER_SSH_PORT sudo systemctl restart dtunnel-server
···
这样还能省点时间
wwqgtxx
2017-05-22 20:45:06 +08:00
好吧,看开不用我说了,看了你的文件已经这样改过了
fatedier
2017-05-22 23:51:56 +08:00
@yangxuan8282 Hi,我是 frp 的开发者,对于你所说的「 狗洞比 frp 快很多,如果网络稳定的话,狗洞 lite 应该是目前最合适的方案」,我比较好奇,因为从原理上来说 dog-tunnel lite 和 frp 应该是相同的,都是通过服务端来转发请求,所以性能上不应该存在太大差距。

所以我忍不住自己做了一个非常简单的关于 http 页面的性能测试,并不是很严谨,仅供参考。

客户端:mbp13 8GB 内存 100MB 下行,4MB 上行带宽
服务端:阿里云 centos7,1 核 1G 内存,20MB 带宽
工具:ab v2.3, 并发数 5, 不启用 keepalive
测试页面:/op 2.9KB, /static/css/bootstrap.min.css 119KB
网络延迟:30ms 左右

frp v0.10.0 和 dog-tunnel lite v1.30 都使用最简单的 tcp 映射配置,5 个连接池。

测试详细结果: https://gist.github.com/fatedier/59d0ed9252b5310ccd2a36632232488d

简单写一下结果:

10000 次请求 2.9KB 页面:
frp: 耗时 61.851s QPS: 161.68
dog-tunnel lite: 117.091s QPS: 85.40

500 次请求 119KB 页面:
frp: 103.603s QPS: 4.83
dog-tunnel lite: 227.868s QPS: 2.19

通过测试看出「 狗洞比 frp 快很多」并不是绝对的,也许和具体的使用场景相关,如果能给出详细的测试数据,我就可以有针对性的进行优化。

注:这里所指的是「 狗洞 lite 」也就是 dog-tunnel lite,并非 p2p 模式,如果是 p2p 模式的 dog-tunnel,流量不经过服务器,性能必然会提升很多。
pagxir
2017-05-22 23:57:10 +08:00
@fatedier 它是指下载吧,不是指响应速度。别人是暴力发包,没得比的。
fatedier
2017-05-23 00:09:15 +08:00
@pagxir 我看他的描述有一句「 如果网络稳定的话」,网络稳定的情况下如果没有丢包,暴力发包的策略并没有什么效果,可以忽略。

对于有丢包的情况下,确实会对于下载类请求会提升比较明显。当然,这个更像是 锐速,google bbr,kcptun 所做的事情。后面 frp 可能也会考虑底层支持 kcp 协议,这个和应用本身的性能关系不大。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/362833

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX