Linux
Linux:攔截連接建立
我希望能夠攔截連接建立,例如想知道某個程序(任何程序)何時建立連接。有沒有辦法做到這一點?
我唯一能想到的就是攔截
connect()
系統呼叫。但可能有其他方法嗎?可能是在核心中創建網路上下文時?目標是根據某些要求過濾程序並實時啟用/禁用連接建立。
提前致謝。
PS我這樣做是出於絕對合法的目的。
PPS 我在Google搜尋過,但只找到瞭如何攔截已經建立的連接(不完全是我想要的)。我要的是一個想法,一個搜尋方向,而不是程式碼。
對於僅提取資訊的方面,可以使用 iptables 使用 AUDIT 匹配(如果您不需要大量資訊,也可以使用 LOG 匹配)來做到這一點。
對於基於一些複雜規則實時允許或禁止連接的情況,我不確定您是否可以在 Linux 上可靠地做到這一點。選項包括:
- Seccomp-BPF,但我不確定它是否可以做到這一點(一旦在給定程序中實例化,過濾器將是靜態的)。
- 使用 LD_PRELOAD 或其他方法覆蓋各種套接字呼叫。這是不可靠的,因為它很容易繞過(直接進行系統呼叫是微不足道的,您也可以
dlopen()
使用任何 libc 並以這種方式進行呼叫)。- 對照
net_cls
組。這需要防火牆設置,可能會影響活動連接,並且可能無法完全按照您的意願工作(它將需要一個守護程序,在程序啟動時將它們移動到適當的控制組中)。- 如果您可以容忍一些數據進入網路,您可以使用 iptables NFLOG 目標並觀察有趣的連接(如果您想要實時評估,您需要記錄所有新連接並解析使用者空間中的內容),然後被動地關閉您不想要的連接。
- 您可以在其自己的網路命名空間中執行每個應用程序並強制出站流量通過主機系統,然後使用基於源的策略路由來控製到達實際網路的內容。
也就是說,您可能需要重新評估為什麼需要它。除非您從神經網路或其他啟發式方法(由於多種原因,這兩種方法都是有問題的選項)做出決策,否則您幾乎總是會更好地將事物直接編碼到防火牆中(iptables 可以做到一些非常複雜的東西,例如僅將使用特定 IP 協議的連接匹配到由特定 UID 以均勻分佈的隨機速率發起的特定埠,並將不匹配的數據包發送到不同的目的地),或使用調度工具或其他掛鉤來更新防火牆動態規則(例如,在系統應該不使用時更改防火牆規則,或者在該使用者登錄時僅允許源自給定 UID 的新連接)。