
在我的家庭網路中,我有以下拓撲
Internet
|
wifi |
C ----------- A ---------- B
在哪裡
- A(靜態 IP 192.168.0.254)是我的 ISP 提供的路由器/AP。
- B(靜態IP 192.168.0.1)是一台Linux機器,作為本地DNS和DHCP伺服器(運行dnsmasq)
- C 是連接到 AP 並由 DHCP 設定的任何用戶端。
目前,B(作為 DHCP 伺服器)提供的預設網關只是 A。
然後,假設我想在 B 中捕獲來自任何客戶端 C 的所有流量。
啟動 IP 轉發
# sysctl net.ipv4.ip_forward=1"
供應 B 作為網關。當然B本身是使用A作為自己的網關
- 在 B 上運行 tcpdump 看看發生了什麼
在客戶端 C 上,我啟動任何請求,例如
$ traceroute www.google.com
現在,我預期來自 C 的流量會路由到 B,然後路由到 A,最後路由到網際網路。
什麼有效。C 能夠上網
什麼不起作用。除了第一個請求之外,似乎B完全被繞過:tcpdump沒有顯示任何東西; B 的位址不會出現在追蹤路由輸出中。不過,我確信會發生重新路由,因為如果我禁用 B 上的 IP 轉發,C 就會與互聯網斷開。
如果發生某種短路,我該如何避免?
免責聲明:我知道更改網路拓撲可以解決「捕獲所有流量」問題(例如透過連接埠鏡像等),但我真的想了解我的設定發生了什麼以及如何在不更改拓撲的情況下解決該問題。
答案1
您需要主機 B 進行 NAT 轉換,以便 A 不會再次看到相同的資料包。相反,B 應該透過 A 發送資料包,就像它們源自 B 一樣iptables
。
# iptables -t nat -A POSTROUTING -s ip-of-C -j MASQUERADE
根據該規則,從 B 發出的所有資料包將被重寫為好像源自 B,但保留反向轉換表,以便可以反向轉換相關回應並將其發送到 C。
請注意-s ...
將規則限制為僅適用於源自 C 的封包(或可將其設定為本機 LAN)的部分,例如不適用於回應封包。
編輯(考慮@theuncle的評論):關於為什麼它在沒有NAT的情況下不起作用的解釋是,主機B意識到數據包在同一接口上未經改變地傳入和傳出,因此它可以通過告訴C來改善網路直接與A洽談相關交通事宜。