将 ICMP 响应转发到 TAP 接口

将 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 外部 IP(例如 8.8.8.8),程序ping仍然能够获得响应。我想问一下,ping由于 ICMP 响应正在转发到 TAP 接口,程序是否不应该收到任何响应?此外,我将流量重定向到 TAP 设备的方法是否正确?

答案1

分配给 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 中的任何 IP除了10.0.4.1.

# 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。 是否伪装源完全取决于您,无需将数据包路由到程序并将(正确的)答复发送回初始源。
  • 不清楚您是否真的让其他对等方参与测试。从主机本身进行测试不需要 nat/PREROUTING 和 filter/FORWARD,但需要 nat/OUTPUT 和 filter/OUTPUT。
  • 如果确实有其他对等点参与,您的测试将使用 filter/INPUT 而不是 filter/FORWARD,并且不使用 nat/POSTROUTING,因为目标是本地的。无论如何,一旦更正,它将使用 filter/FORWARD 和 nat/POSTROUTING。
  • 如果使用 tap(第 2 层:以太网)而不是 tun(第 3 层:ip),则在查找此 icmp(使用 tcpdump 或附加程序)而未看到它时,还要查找未答复的 ARP 请求。

进一步参考:https://backreference.org/2010/03/26/tuntap-interface-tutorial/

相关内容