2015-12-01 114 views
0

我有以下情況:CNAME重定向之前攔截交通

用戶連接到域:test.com

我想這個域名,例如重定向到google.com

要做到這一點,我已將一條CNAME記錄指向google.com:www google.com(TTL:automatic)

是否有可能攔截t raffic在發送到google.com之前在test.com上發佈? (自定義協議,而不是http或https)

我找到了一個名爲:native-dns的庫,我認爲它可能會承載一個dns服務器?

我將其配置如下:

"use strict"; 

var dns = require('native-dns'), 
    tcpserver = dns.createTCPServer(), 
    server = dns.createServer(); 

var onMessage = function (request, response) { 
    console.log('request from:', request.address); 
    var i; 
    response.additional.push(dns.CNAME({ 
    name: 'www.mydomain.com', 
    data: 'otherdomain.com' 
    })); 
    response.additional.push(dns.NS({ 
    name: 'ns1.mydomain.com', 
    data: '127.0.0.1' 
    })); 

    response.send(); 
}; 

var onError = function (err, buff, req, res) { 
    console.log(err.stack); 
}; 

var onListening = function() { 
    console.log('server listening on', this.address()); 
    //this.close(); 
}; 

var onSocketError = function (err, socket) { 
    console.log(err); 
}; 

var onClose = function() { 
    console.log('server closed', this.address()); 
}; 

server.on('request', onMessage); 
server.on('error', onError); 
server.on('listening', onListening); 
server.on('socketError', onSocketError); 
server.on('close', onClose); 

server.serve(53, '127.0.0.1'); 

我想知道的事情是我怎麼實際上可以使這個DNS服務器功能。我想ping www.mydomain.com並獲取otherdomain.com作爲答案。

目前我正在使用運行在節點腳本上的ubuntu服務器。 ping將從Windows 10計算機執行

回答

2

在此設置中,您無法攔截test.com的流量,因爲它絕不會直接指向您的服務器。

當一個客戶端要連接到test.com,首先它試圖通過查找test.com的DNS A記錄解析test.com爲IP地址。您沒有此類記錄,但CNAME會重定向到www.google.com的A記錄(或CNAME)。根據DNS請求是遞歸的(並且在絕大多數情況下,其遞歸爲),客戶端或者接收到IP地址www.google.com或隨後的CNAME引用。

請注意,在與您的服務建立任何連接之前,整個名稱解析過程都會發生:CNAME只是讓客戶端繞過您運行的任何服務。

根據代碼示例,您只需將到達您的test.com服務器的所有流量代理到Google,這是攔截流量的絕佳方式。您只需要而不是即可使用CNAME,因爲它表示在網絡連接的不同階段進行轉發。

+0

我想找到一種方法,我不必代理服務,代理將花費太多的服務器權力,因爲它是一款遊戲。 –

+0

@MaximGeerinck:好的,如果你想攔截整個流量,你需要以這樣或那樣的方式接收完整的流量。如果您可以操縱客戶端網絡,則可以在任何端點或兩者之間進行。但是,如果您只需要知道某個特定客戶是否試圖連接到該服務,則可能有辦法做到這一點 - 請告訴我是哪種情況。 – PeterK

+0

感謝您的回覆,在最好的情況下,我需要知道流量的第一部分(例如用於登錄的用戶名)。但只知道客戶端是否嘗試連接也是一個很好的選擇 –