簡體   English   中英

UDP套接字:recvfrom和接收地址

[英]UDP sockets: recvfrom and receive address

BSD / POSIX套接字API recvfrom()調用(通過<sys/socket.h>頭文件提供給C或C ++程序員)提供了源地址“ out”參數struct sockaddr *src_addr ,用於存儲IP地址。發送接收到的數據報的遠程服務器。

對於 UDP數據報發送到某個遠程終結點然后接收響應的任何應用程序(例如DNS解析器),認為始終確保任何接收到的數據報來自同一IP地址是否被視為必要的安全預防措施?作為最后發送的數據報(即上一個sendto調用中使用的地址?)

換句話說,如果調用sendto並將數據報發送到某個地址,是否應該始終確保相應的recvfrom調用來自同一地址

考慮到如果遠程服務器位於防火牆或具有多個IP地址的某些分布式系統的一部分后面,則響應數據報可能合法地源自其他IP,這似乎是不可行的。

但是,如果我們不驗證接收到的數據報與上次sendto調用的地址來自同一 IP地址,那么如何防止某些攻擊者攔截數據報,然后將惡意數據報發送給客戶端?

您如何知道收到的數據包是答復? 通常,這是使用接收到的數據包中的源地址和端口來完成的。

但是,無法驗證UDP數據包中的源地址。 發件人可以放置他們想要的任何源地址。 因此,僅當您信任所有在Internet上浮動的數據包時,檢查才足夠,這顯然是不可行的。

因此,您需要一些其他機制:隨機cookie,序列號等。

對於將UDP數據報發送到某個遠程終結點然后接收到響應的任何應用程序(例如DNS解析器),

您可以使用隨機的出站端口號。 這就是DNS可以減輕欺騙攻擊的方式

是否始終確保任何接收到的數據報與上次發送的數據報來自同一IP地址(即,先前的sendto調用中使用的地址)是否被認為是必要的安全預防措施?

換句話說,如果調用sendto並將數據報發送到某個地址,是否應該始終確保相應的recvfrom調用來自同一地址?

不僅為了安全,而且為了功能。 如果您有多個出站連接,則需要知道與每個連接對應的UDP答復。 這可以通過遠端的IP地址和端口組合來實現。

考慮到如果遠程服務器位於防火牆或具有多個IP地址的某些分布式系統的一部分后面,則響應數據報可能合法地源自其他IP,這似乎是不可行的。

遠程系統應通過與接收答復相同的接口發送答復。 如果不是,它將是“非標准的”,並且不適用於您的應用程序或需要接收和回復UDP數據包的其他應用程序。

但是,如果我們不驗證接收到的數據報與上次sendto調用的地址來自同一IP地址,那么如何防止某些攻擊者攔截數據報,然后將惡意數據報發送給客戶端?

沒有。 如果攻擊者可以MITM UDP連接,則他們可以攔截並更改他們想要的任何內容。 他們可能只是將具有欺騙性IP地址的UDP數據包發送到您的服務。

如果需要保留數據包的完整性和機密性,則需要實施某種加密。 例如。 如果需要支持數據報,請查看DTLS

某些NAT支持UDP穿孔,它也可以完全執行您提到的IP驗證,因此無需在應用程序中進行。

對於自定義協議,您可能需要在有效負載中實現某種序列號,以進一步提高安全級別。

在一般情況下,任意接收的數據報不是對先前請求的響應,這是不正確的。 您必須例如通過connect(),進行篩選,以確保僅處理作為響應的響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM