通过proxy_protocol协议实现真实IP

1年前 15

说到实现真实IP,之前我用nginx反向代理实现过(点此了解)。操作略微复杂,而且服务端还要求安装nginx,并配置nginx。

我的环境还是那样——通过FRP内网穿透本地lnmp环境。如果是这种情况的话,这应该是最简单实现真实IP的方法——proxy_protocol协议。最先了解的就是这个,可一直没搞明白,搁置了。今天终于搞明白了。

proxy_protocol协议是什么?网上一大堆了,我折腾这么多年,搜了好几个搜索引擎的资料,看最多的就是proxy_protocol的介绍。具体是什么呢?我也不大清楚,反正他能让后端获取客户端的网络信息,也就是IP地址以及TCP端口。它有两种格式——v1和v2,当然现在用的最多的是v2了。

而FRP用proxy_protocol最简单,在穿透的隧道后面加上“proxy_protocol_version = v2”即可。譬如:

[liuyuanlin_https]
# 配置 http 访问
type = https
# 本地 Web 服务的端口(与前面的配置一样,都对应同一个 Web 服务)
local_port = 443
# 需要反向代理的域名(当访客通过此域名访问 A 机器时,才会将请求反向代理到此 Web 服务)
custom_domains = liuyuanlin.com, www.liuyuanlin.com
use_encryption=true
use_compression=true
proxy_protocol_version = v2

注意的是,不要再加https2http、https2https这类插件了,因为这类插件就好比nginx的反向代理,会出现502错误。此时你打开网站会出现“ERR SSL PROTOCOL ERROR”的错误,这说明此站流量在走proxy_protocol协议。是正常的。

20231004194037.png
“ERR SSL PROTOCOL ERROR”的错误

然后我们配置后端nginx:

server{

	......
	#listen 端口后面加上proxy_protocol字段,开启Proxy Protocol协议
	listen 12443 ssl http2 proxy_protocol;
	listen [::]:12443 ssl http2 proxy_protocol;
	......

	#proxy_protocol协议头部真实IP
	real_ip_header proxy_protocol;
	real_ip_recursive on;
	set_real_ip_from 127.0.0.1;
	set_real_ip_from 内网IP,公网IP;
	#需要排除的IP,如果你有CDN,可以再加
	...

	#SSL ON
	此处为SSL证书信息,必须得有;
	#SSL END

}

然后重启nginx和frpc服务,搞定!这样默认的REMOTE_ADDR记录的就是客户端的IP了。也不用在wp-config.php多余的配置了。你可以将下面代码保存为.php文件,来测试客户端IP。

<?php
$REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];             // 客户端与服务器握手IP,如果使用代理则会获取到代理IP
$HTTP_CLIENT_IP = $_SERVER['HTTP_CLIENT_IP'];          // 代理服务器发送的HTTP头(可伪造)
$HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];    // 用户是在哪个IP使用的代理(可伪造)
$X_Real_IP = $_SERVER['X-Real-IP'];

echo 'REMOTE_ADDR'.$REMOTE_ADDR.'<br/>';
echo 'HTTP_CLIENT_IP'.$HTTP_CLIENT_IP.'<br/>';
echo 'HTTP_X_FORWARDED_FOR'.$HTTP_X_FORWARDED_FOR.'<br/>';
echo 'X_Real_IP'.$X_Real_IP.'<br/>';
?>

总之呢,现在你不用花昂贵的价钱买阿里云、腾讯云、天翼云、京东云服务器了,只需要花十分之一的价钱买FRP服务或者免费的FRP服务就可以穿透自己本地搭建的网站了。

在此,感谢FRP老朱alain lam军哥LNMP以及网络肯分享技术的大佬们!希望此文可以帮助曾经跟我一样糊涂的童鞋们。

15 条评论

  1. #1

    技术达人

    • @sagrre 呵呵,只是想简单实现想要的功能而已。内网穿透挺适合你的,不要求备案,还省钱,只需要家里常年在线的电脑即可,配置不要求多高,用免费的frp服务,只需要交点电费和网费就行了。

  2. #2

    感觉有难度目前不知道怎么开始,需要添加其他配件吗?常年在线电脑这个倒是不难

    • @sagrre 非常简单。电脑上安装lnmp环境,直接在Windows安装也行,用VMware虚拟机也行,Windows推荐宝塔Windows版本、phpenv,Linux推荐LNMP,宝塔Linux版,然后用frp穿透,我记得你公网服务器还有好几年到期,可以直接用你的服务器,不能浪费嘛!frp需要配置,其实也很简单,如果你着手做起来,到时候针对你的站,我把配置写好发邮件给你

    • @sagrre 不需要其他配件,只需要电脑、电、网!

      • @皇家元林 那真适合我这两天我研究研究,新买了域名懒得备案试试看

  3. #3

    完美解决了问题,真棒!

  4. #4

    这个不用备案吗?不备案使用的是香港服务器吧?元林兄弟你网站是备案的使用的也是阿里云呀,你是购买了阿里云服务器自己做的frp穿透是吧?这方面的教程可以详细写写,我现在买两个服务器做的三个网站,以后可以少买一个用自己的电脑做了。以前也用免费的frp试过,还花了百来元买过他们付费服务,可是不稳定没法用起来,后来就放弃了。
    跟电费这些比起来,活动期间买的服务器也不算贵了,不过配置确实太差了,2H2G或4G也不时会有问题。

    • @墨铺网 是的,国内所有主机都是需要备案的。
      我的意思是,可以直接用frp服务,而不需要阿里云这样服务器,当然你有条件用服务器更好了。你这配置已经很好了,frp不要求配置多好,只要带宽足就很快!
      关于frp的教程我已经写了好几篇了,也是记录我的折腾过程。本地搭建服务器,备份非常方便,速度快。即使公网服务关了,也一点不影响你本地的数据。
      另外现在老用户阿里云的服务器续费还是购买都很贵,要不是我舍不得我的备案,我早弃了。

  5. #5

    我腾讯云服务器都是CentOS,安装的没界面,操作上面不熟悉,这两天新开了一台win服务器在折腾,还是没搞明白,在服务器的设置7500查看状态已经成功了,也能显示客户端有连接,但域名访问打不开,下载的也是frp_0.53.2版本的,可能跟网上的教程有差异。
    ,只能找元林哥帮写个配置啦
    CentOS全代码的不好上手,我前面建站都是通过宝塔操作的。可能需要学会使用后,老服务器也要装win
    想要实现的还挺多的,需要支持https,还有本地客户端要能做多个网站,不知道是不是开几个客户端来实现的呢?
    ok99668@qq.com这个邮箱更常用些,然后帮我跟客户端也一起发吧,老版本的ini,新版本toml,有些区别的好像。

  6. #6

    非常感谢元林老哥,刚使用域名已经可以安装wp了,多谢详细指导!

  7. #7

    ssh的端口可以过去好获取到真实ip吗?

    • @萌孩子 你这个用法倒是不常见,如果是走 proxy_protocol 协议是可以获取真实 IP 的。