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;
}
}
如果設置成功,拿$proxy_protocol_addr 變量
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版本)
也可以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 填寫的轉發端口