帮助中心 > 安全 > 高防IP > 常见问题 > 非网站防护TCP协议如何获取用户真实IP

非网站防护TCP协议如何获取用户真实IP

非网站防护TCP协议如何获取用户真实IP

Proxy protocol 协议流程

1.设置proxy protocol 开启

当前高防IP使用的为proxy_protocol 的V1版本

使用nginx 转发的请参考如下配置

server {
    listen 8443  ssl proxy_protocol default;
    server_name
    $host
   ;

   ssl on;
   ssl_certificate     "/usr/local/nginx/conf/keys/52os.net.crt";
   ssl_certificate_key "/usr/local/nginx/conf/keys/52os.net.key";

location / {
        proxy_pass http://backend.example2.com:8088;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
    }
}
获取真实ip

如果设置成功,拿$proxy_protocol_addr 变量

3.使用自建TCP服务器获取真实ip

  1. 在三次握手后,数据接收阶段获取的报文中.会首先收到一个字符串,如("PROXY TCP4 119.188.212.127 123.129.229.123 41774 8082").
  2. 其中以空格为分隔符,119.188.212.127 为客户端的真实IP,123.129.229.123 为高防ip,8082 为端口
  3. 实现代码(PHP swoole版本):
on("Connect", function ($server, $fd) {
    echo "Client: Connect.\n";
});

//监听数据接收事件
$server->on("Receive", function ($server, $fd, $from_id, $data) {
   $fd_info = $server->getClientInfo($fd);
//var_dump($fd_info);
var_dump($data);
$is_proxy = substr($data,0,5);
if($is_proxy == "PROXY"){
    $proxy_arr = explode(" ",$data);
    echo "真实ip:".$proxy_arr[2]."\n";
    echo "高防ip:".$proxy_arr[3]."\n";

}
    $server->send($fd, "Server: " . $data);
});

//监听连接关闭事件
$server->on("Close", function ($server, $fd) {
    echo "Client: Close.\n";
});

//启动服务器
$server->start();

?>

实现代码(Nodejs版本)

  1. 到github下载对应的库 https://github.com/moznion/proxy-protocol-js

也可以npm proxy-protocol-js

服务器解析(高防IP使用V1版本的 代理协议)
V1 protocol

var net = require('net');
const proxyProtocol = require('proxy-protocol-js');

const PORT = 18001;
const HOST = '0.0.0.0';

var clientHandler = function(socket){

    //客户端发送数据的时候触发data事件
  socket.on('data', function dataHandler(data) {//data是客户端发送给服务器的数据


    var is_proxy = data.toString().substring(0,5);

    if(is_proxy == "PROXY"){
      const proto = proxyProtocol.V1ProxyProtocol.parse(data.toString());
      console.log(proto);
    }else{
      console.log(socket.remoteAddress, socket.remotePort, 'send', data.toString());
    }

        //服务器向客户端发送消息
    socket.write('server received\n');
  });

    //当对方的连接断开以后的事件
  socket.on('close', function(){
    console.log(socket.remoteAddress, socket.remotePort, 'disconnected');
  })
};

//创建TCP服务器的实例
//传入的参数是:监听函数clientHandler
var app = net.createServer(clientHandler);

app.listen(PORT, HOST);
console.log('tcp server running on tcp://', HOST, ':', PORT);

测试结果
使用telnet 高防IP 填写的转发端口

参考文档

https://www.cnblogs.com/zhangmingda/p/12672588.html

免费拨打  400 100 2938 免费拨打 400 100 2938
24小时售后技术支持 24小时售后技术支持
返回顶部 返回顶部