2013-06-13 109 views
0

我希望能夠僅從本地主機(從127.0.0.1my_local_ip)獲取特定端口的請求;如何只允許來自本地主機的TCP連接

我試過如下:

int localhost = (127 << 24) + 1; // 127.0.0.1  
sock_address.sin_addr.s_addr = htonl(localhost);  

這讓我只能用127.0.0.1而不是從實際的本地IP連接。 我也試過:

char hostName[128] = ""; 
struct hostent  *pHost  = 0; 
gethostname(hostName, sizeof(hostName)); 
pHost = gethostbyname(hostName); 
memcpy(&sock_address.sin_addr, pHost->h_addr_list[0], pHost->h_length); 

到那個我不是能夠連接與127.0.0.1,我能夠與當地的IP連接,但遠程請求也回答

我在做什麼錯?有沒有其他方法?

謝謝!

+1

你是什麼意思「真正的IP」?你的機器可以有很多接口,每個接口可以有很多IP地址。實際上,127.0.0.1 *是*其中一個接口的地址之一。這與您的任何其他地址的「實際IP」一樣多。 –

+0

謝謝@Kerrek SB - 好吧,我的意思是,我希望能夠接受任何接口上要求我的機器上,但只能從我的機器,並阻止遠程連接 – kande

+0

好,枚舉所有的接口,並列舉每個的每個地址接口 - 然後檢查所需的地址是否在其中。 –

回答

1

從您的應用程序,您只能設置端口將綁定到哪些接口。在第一種情況下,您將其綁定到回送接口(lo,IP地址127.0.0.1),這意味着只有您可以連接到它,因爲只有您自己的主機才能訪問該接口。例如,如果將端口綁定到外部接口eth0(IP地址爲10.1.2.3),則如果沒有防火牆阻止連接請求,則外部主機可能能夠連接到該端口。

做你想做的事情的唯一方法是通過設置本地計算機的數據包過濾器(防火牆)拒絕/丟棄連接請求(SYN數據包)到來自IP地址的特定端口擁有。在這種情況下,遠程主機會認爲您的TCP端口已關閉或被阻止,具體取決於您如何設置過濾器。

嗯......你也可以接受來自任何接口的任何連接,並立即如果遠程主機是不是你自己的IP地址中的一個將其關閉,但由於某些原因,我想這是你真正想要的。

+1

謝謝。我明白 – kande

相關問題