从ERR_ADDRESS_UNREACHABLE到Frp穿透

这个9月份开始搞的网站还真是多灾多难,29号时之前用的别人的FRP服务,现在人家的服务器到期不做了,我们只能自己动手😭,这成为接下来一系列问题的导火索,下面一一列出我的解决方法。
顺便在这里吐槽一下Edge浏览器,在我写这篇文章的时候CPU占用超过60%,风扇狂转,原因是Edge里有两个github.io博客,不知道用了啥插件,老是网页未响应,佛了,这也告诫我们想要兼容性好就不要搞些花里胡哨的plugin,像我们同样用的Github,同样用的HEXO和NEXT(那网站还把hexo和next的版权删了,🙂),我的博客就没有这种破事,以上。

P1:网页无法显示,Chrome报错为ERR_ADDRESS_UNREACHABLE

前情提要
中午突然有人告诉我网页无法连上,我简单的检查了80端口的状态

1
netstat -tunlp|grep 80

结果显示Apache2正在监听。

正片:
根据Use of SSL Cert results in ERR_ADDRESS_UNREACHABLE on ubuntu with apache2 [1],有人提出在iptables里放行80端口可以解决该问题,尽管系统显示端口可用(原文:Ok, so strangely ssl / https/ port 443 was indeed NOT enabled on my server. Don’t know why everything tells me that https is enabled but here is how I could solve it for me.)

解决方案

1
iptables -I INPUT -p tcp --dport 443 -j ACCEPT

至此,网页恢复正常使用。

彩蛋
Linux查看端口命令:

1
2
3
4
5
6
7
8
9
10
11
12
# 查看指定端口或应用,可以结合grep命令:
netstat -ap | grep 8080
netstat -ap | grep frpc

# 也可以使用lsof命令:
lsof -i:8888

# 若要关闭使用这个端口的程序,使用kill + 对应的pid:
kill -9 PID号

# 查看指定的端口号的进程情况:
netstat -tunlp |grep 端口号

参考资料

  1. Use of SSL Cert results in ERR_ADDRESS_UNREACHABLE on ubuntu with apache2
  2. Ubuntu终端命令–查看端口占用及关闭
  3. Linux如何查看端口

P2:FRP日志:Parse conf error: invalid server_port

前情提要
网页恢复正常使用后,我们再次尝试利用FRP(0.29.0,貌似经过八月份的几个版本下来frp又开始能稳定使用了)将内网机器的80端口暴露到公网上。以前我们对SSH成功配置过FRP,这次我们在之前的基础上添加了[web],重新运行frp后检查nohup日志时便看到了Parse conf error: invalid server_port.

1
2
3
4
# frps.ini
[common]
bind_port = 端口1
vhost_http_port = 端口2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# frpc.ini
[common]
server_addr = 服务器IP地址
server_port = 端口1

# 省略ssh
[ssh]
······

# 暴露内网80端口
[web]
type = http
local_port = 80
remote_port = 端口3 # 其实是用不到的吧
custom_domains = 域名

正片&解决方案:
根据Frp 爆错!Parse conf error: invalid server_port [1] 提出的解决方案,删掉文件中的注释后能够正常运行。我们在删除注释后,的确问题解决了(问题是现在我们的ini里又新加了行注释,结果能正常运行,玄学)。之前我们的一个Matlab程序也遇到了报语法错误的问题,经检查,报错的那行是中文注释,删掉中文注释后能够正常运行,所以中文不愧是世界最难的语言之一,连计算机遇到中文注释也会懵逼。

彩蛋
之前查看nohup.out等日志都是直接使用vim,这样只能看到运行vim时文档的内容,不能追踪,现在有了tail这个工具。

1
2
# 根据文件描述符进行追踪,当文件改名或被删除,追踪停止
tail -f nohup.out

常用操作:

  1. 暂停刷新,使用【Ctrl】+【S】暂停终端
  2. 继续终端,使用【Ctrl】+【Q】
  3. 退出tail命令,直接使用【Ctrl】+【C】

参考资料

  1. Frp 爆错!Parse conf error: invalid server_port
  2. tailf、tail -f、tail -F三者区别(转)

P3:FRP正常运行,Chrome报错Connection Refused

前情提要
frpc正常运行后,网页仍不能通过外网FRP服务器访问。

正片:
首先是一个老问题,你的云服务器是否放行了向你指定的端口的请求,因为防火墙和云服务提供商都有可能拒绝向几个常用端口以外端口的请求。
其次,根据frp0.27无视NET内网穿透及要点说明 [1],如果需要http穿透的话,建议客户端配置type=tcp ,如果写成type=http可能不成功。我这边用http怎么都不能访从外网问本地web服务。
我在更改web代理部分的type为tcp后大功告成。

解决方案

  1. 如果FRP服务器使用的是腾讯云、阿里云等服务商,要确保几个remote_port在安全组里是开放的。
  2. frpc.ini中[web]里的type改为tcp,而非http.

参考资料

  1. frp0.27无视NET内网穿透及要点说明 (这篇文章很良心,给颗小星星❤)
  2. frp内网穿透实现ssh访问内网机器
  3. 阿里云服务器实现frp内网穿透

11/23更新:玄学!Frp还能这样配置?

frps.ini

1
2
3
[common]  
bind_port = 7000 #与客户端绑定的进行通信的端口
vhost_http_port = 6081 #访问客户端web服务自定义的端口号

这样frpc.ini里就不用指定web的remote_port

frpc.ini

1
2
3
4
5
# 省略前面的部分
[web]
type = http #访问协议
local_port = 80 #内网web服务的端口号
custom_domains = 域名 #所绑定的公网服务器域名,一级、二级域名都可以

不晓得这个是不是在每台机器上都适用,因为这不是我直接经手配置的😂

顺便贴个下面命令的解释

1
nohup /home/as/frptest/Frplinux/frplinux/frpc -c /home/as/frptest/Frplinux/frplinux/frpc.ini >/dev/null 2>&1 &

1 > /dev/null 2>&1 语句含义

1> /dev/null : 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。

2>&1 :接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

参考资料

  1. Linux Shell 1>/dev/null 2>&1 含义