Iptables

將 ICMP 響應轉發到 TAP 介面

  • March 25, 2019

我正在嘗試進行測試,將 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/

引用自:https://serverfault.com/questions/959778