考慮到下面的示例腳本,我正在將一個TCP連接從一臺服務器管道連接到另一臺服務器,這很好。在兩個網絡服務器之間發送連接元數據
net = require "net"
log = console.log
# This server needs to receive custom data eg. (remoteAddress or an uuid)
target = net.createServer (socket) ->
log('Target connection from ' + socket.remoteAddress)
target.listen(10000, '0.0.0.0',() -> log('Target ready'))
# User-facing server that pipes to the target server
front = net.createServer (socket) ->
log('Front connection from ' + socket.remoteAddress)
socket.on 'data', (data) ->
socket.proxy = net.createConnection 10000,() ->
socket.proxy.write(data)
socket.pipe(socket.proxy).pipe(socket)
front.listen(8006, '0.0.0.0',() -> log('Front ready'))
我面臨的問題是,我需要轉移到其他服務器通過原始套接字的IP地址(如:socket.remoteAddress
)。 它不需要覆蓋目標的socket.remoteAddress
,只是以某種方式檢索原始IP。
這裏是我正在測試這一點:
$ telnet 172.0.0.50 8006
Trying 172.0.0.50...
Connected to 172.0.0.50.
Escape character is '^]'.
SendingData
導致:
Target ready
Front ready
Front connection from 172.0.0.1
Target connection from 127.0.0.1
注意,target
服務器接收front
服務器的IP地址,我完全理解爲什麼。
不幸的是,我不能使用data
,因爲它可能會被客戶端完全加密。
X-轉發-的是一個HTTP頭,並沒有任何與TCP流不幸。該流可能會被加密,在這種情況下,我無法檢查它是HTTP,TLS還是其他。 – WooDzu
您無需關心數據是否已加密。你可以用uint32格式化ip來預先加載數據。當後端接收到代理數據時,刪除前置IP並解析它。 – Jerry
這實際上是有趣的想法。不是最乾淨的,但絕對值得一去。謝謝傑裏 – WooDzu