爲了測試的目的,我想構建一個服務器,用於偵聽某個接口(例如,eth0)上每個端口(或至少在大多數端口上)的TCP連接。服務器通過SSH訪問eth1,所以沒有問題。 (我不在乎UDP或其他協議)收聽機器上的每個端口
我想做一種特殊的中間盒檢測/分析,因此我需要能夠完全建立連接。有一個HTTP連接將是最好的,因爲「客戶端」可以在瀏覽器中實現爲JS。
我從一個簡單的碼頭服務器開始,但必須認識到,碼頭需要至少在每個端口上產生線程,它正在偵聽。當我想聽幾千個端口時,這會導致問題。 或者有沒有辦法解決這個問題?
我的下一個嘗試是使用iptables
:
須藤的iptables -t NAT -A PREROUTING -i eth0的-p TCP -j DNAT --to目的地127.0.0.1:8080`
它似乎工作。它允許連接每個端口,並將流量路由到碼頭監聽的本地端口8080。但現在我不知道客戶端使用了哪個端口。因爲碼頭認爲通過端口8080建立了連接。有沒有一種方法可以確定碼頭的真正輸入端口?我可以將端口作爲HTTP請求的一部分發送,但是如果客戶端嘗試聯繫端口1234 ..並且中間框將此端口重定向到端口5678 ..我無法知道使用了哪個端口。
我也試過像socat
這樣的userland解決方案。問題比以前更糟糕。因爲現在jetty也將遠程IP視爲127.0.0.1。
或者,還有其他方法可以實現嗎?
哦,順便說一句:我完全控制了機器。所以我可以改變內核或任何需要的東西。現在我使用Ubuntu 14.04 LTS,但是如果解決方案需要其他東西,我可以使用它。
我認爲這可能是堆棧溢出偏離主題。您是否考慮過使用'inetd'將腳本附加到端口? – Sobrique
我也不確定是否應該嘗試超級用戶而不是stackoverflow。但通常stackoverflow吸引更多exper。我還沒有試過'inetd',我會看看它。 – masgo
wireshark是被動的。我需要能夠建立與完整的TCP握手等連接。 – masgo