我正在尝试进行一项测试,将 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/