Iptables
將 ICMP 響應轉發到 TAP 介面
我正在嘗試進行測試,將 ICMP 響應轉發到 TAP 介面。我創建了一個 TAP 介面並為其分配了地址
10.0.4.1/24
。我的 linux 設置使用該界面
enp0s3
作為預設選項。要將任何 ICMP 響應轉發到 TAP 介面,我嘗試了以下規則:# iptables -t nat -A PREROUTING -i enp0s3 -p icmp -j DNAT --to 10.0.4.1 # iptables -A FORWARD -p icmp -i enp0s3 -j ACCEPT # iptables -t nat -A POSTROUTING -o 10.0.4.1 -j MASQUERADE
目前TAP介面處於UP狀態,我有一個程序正在監聽TAP介面。
如果我 ping 一個像 8.8.8.8 這樣的外部 IP,
ping
程序仍然能夠得到響應。我想問ping
程序不應該因為ICMP響應被轉發到TAP介面而沒有收到任何響應嗎?另外,我將流量重定向到 TAP 設備的方法是否正確?
分配給 TAP 介面的 IP 屬於主機,本地 IP 也是如此。例子:
# ip -4 address show tap0 20: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 inet 10.0.4.1/24 scope global tap0 valid_lft forever preferred_lft forever # ip route get 10.0.4.1 local 10.0.4.1 dev lo src 10.0.4.1 uid 0 cache <local>
重要的是到 TAP 介面的路由。即由於介面啟動時添加的隱式路由,10.0.4.0/24中除10.0.4.1外的任何IP。
# ip route get 10.0.4.2 10.0.4.2 dev tap0 src 10.0.4.1 uid 0 cache
因此,如果您希望您的程序實際看到任何流量,請嘗試將規則中的 10.0.4.1 替換為例如 10.0.4.2。如果這是目標,則由附加程序實際從該 IP 回复(如果使用 tap 而不是 tun,也回复 ARP)。
其他注意事項:
- 你在最後一條規則中打錯了,它是一個目標地址,所以
-d
而不是-o
. 完全由您來選擇 MASQUERADE 源,不需要將數據包路由到程序並將(正確的)回復發送回初始源。- 目前尚不清楚您是否真的讓其他同行參與測試。從主機本身進行測試不需要 nat/PREROUTING 和 filter/FORWARD,但需要 nat/OUTPUT 和 filter/OUTPUT。
- 如果確實涉及其他對等點,那麼您的測試將使用過濾器/輸入而不是過濾器/轉發,而不是使用 nat/POSTROUTING,因為目標是本地的。無論如何,一旦更正,它將使用過濾器/FORWARD 和 nat/POSTROUTING。
- 如果使用 tap(第 2 層:乙太網)而不是 tun(第 3 層:ip),則在查找此 icmp(使用 tcpdump 或在附加程序中)但未找到它時,還要查找未應答的 ARP 請求。
進一步參考:https ://backreference.org/2010/03/26/tuntap-interface-tutorial/