内网访问报错 broken header?Nginx + frp 双端口配置完美解决真实IP获取问题

说明:本文中端口 12345、12346 为示例端口,请根据实际情况修改。

上一篇文章笔者为大家介绍了内网穿透后 Nginx 日志显示真实访客IP,在写那篇文章的时候,笔者是在亲戚家里,用自己的笔记本来做测试的,当时的测试结果是成功的,但笔者并没有考虑到在家里访问的情况。当回到家,把自己的台式机开机,进入系统后打开可道云客户端软件,却提示无法连接,随后又用浏览器尝试打开web版本,浏览器直接提示SSL加密处理出现了问题。查看了一下 Nginx 的异常日志,发现有如下图的记录:

内网访问报错 broken header?Nginx + frp 双端口配置完美解决真实IP获取问题-工作应用、软件

日志里面提到:“broken header: "xxxxx" while reading PROXY protocol, client: xxx.xxx.xxx.xxx, server: xxx.xxx.xxx.xxx”,这表示 Nginx 期望收到 Proxy Protocol 头部,但实际上收到的是直接的 SSL/TLS 加密数据。因为是在内网直接访问,中间并没有经过frp,自然就不会有 Proxy Protocol 头部数据发送到 Nginx,因此 Nginx 就会报错,中断了连接。

解决方法是有的,那就是把内网访问的端口和外网访问的端口区分开来,内网访问的端口绑定里面不添加 proxy_protocol 和相关配置,而外网访问的绑定端口则维持添加 proxy_protocol 状态。但是笔者有一个刚性需求,就是笔者的手机需要在内网和外网都可以访问,笔者不想在回到家、需要使用手机使用可道云的时候,手动修改手机可道云APP的端口设置,很麻烦,那有没有方法可以不用经常修改手机APP端口设置,在内网外网都能同时访问,而且又能准确辨别来访者的公网IP呢?

方法还是有的,原理跟上面增加端口绑定的有点类似,但是还需要做一些调整。首先,针对内网访问的端口,如12345,不绑定任何的Proxy Protocol 头部和添加相关的配置,然后把 Nginx 中这部分的 server {} 配置全部复制到一个新的 server{} ,在这个新的 server {}中把端口号修改一下,比如改为12346,并且参考上一篇文章提到的方法,在端口号后面加上“proxy_protocol”和相关配置。最后,修改一下 frpc 配置文件中的端口转发设置,把公网服务器上的12345端口转发到新增加的端口12346中。

比如,原来的 Nginx 是这样的:

server
{
listen 12345 ssl;
http2 on;
server_name nas.kodbox.local;
index index.php index.html index.htm default.php default.htm default.html;
root /www/web/kodbox;
#后续配置忽略
}

修改后,Nginx 的配置是这样的:

server
{
listen 12345 ssl;
http2 on;
server_name nas.kodbox.local;
index index.php index.html index.htm default.php default.htm default.html;
root /www/web/kodbox;
#后续配置忽略
}

server
{
listen 12346 ssl proxy_protocol ;
http2 on;
server_name nas.kodbox.local;
index index.php index.html index.htm default.php default.htm default.html;
root /www/web/kodbox;

set_real_ip_from 0.0.0.0/0;
real_ip_header proxy_protocol;
real_ip_recursive on;
#后续配置忽略
}

然后 frpc 配置文件相关的配置项修改成下面这样:

[[proxies]]
name = "kodbox"
type = "tcp"
localIP = "127.0.0.1"
localPort = 12346
#可道云Nginx绑定的端口
remotePort = 12345
#公网服务器的端口
transport.proxyProtocolVersion = "v2"

做了上述设置之后,在内网可以正常通过12345端口访问可道云,而在外网访问12345端口的时候,会通过 frp 映射到可道云系统的12346端口进行正常的访问,这样就可以确保在内网、外网的客户端都可以通过12345端口访问可道云系统,也可以实现可道云系统的 Nginx 可以正常获取到外网来访者的公网IP了。

本文来自「IT人的工作生活 —— 分享IT技术实战经验,欢迎访问首页获取更多内容。如需转载本站的文章,请先通过电子邮件的方式联系站长,站长确认后方可转载,并需要注明出处。

为您推荐