将传入的 ICMP 数据包路由到不同的接口/进程

将传入的 ICMP 数据包路由到不同的接口/进程

我有一个具有多个 IP 的接口enp4s0
ICMP从外部设备收到数据包(类型 8,回显请求)到 上的我的设备enp4s0
我尝试仅将发送到 的数据包路由192.168.1.90到同一设备上的另一个接口。在该接口上有一个应该处理这些数据包的进程。

7: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:08:11:22:33:44 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.174/24 metric 1024 brd 192.168.1.255 scope global dynamic enp4s0
       valid_lft 2556122sec preferred_lft 2556122sec
    inet 192.168.1.90/24 scope global secondary enp4s0
       valid_lft forever preferred_lft forever
    inet6 fe80::208:a2ff:fe0c:f648/64 scope link 
       valid_lft forever preferred_lft forever

我尝试路由到的接口是tap按如下方式添加的接口:

ip tuntap add tap0 mode tap
ip link set dev tap0 up
ip addr add 128.1.3.2/24 dev tap0

我有一个小程序,它read()来自该接口。由于该程序正在运行,因此接口状态为 UP:

80: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 7a:0e:b7:37:f4:74 brd ff:ff:ff:ff:ff:ff
    inet 128.1.3.2/24 scope global tap0
       valid_lft forever preferred_lft forever
    inet6 fe80::780e:b7ff:fe37:f474/64 scope link 
       valid_lft forever preferred_lft forever

我的目的是,我的应用程序tap0将读取数据包并应答ICMP数据包。
使用tcpdump并查看我的应用程序的输出,我可以看到当我tcpreplay直接使用 ( tcpreplay -i tap0 ...)注入一些数据包时流量

回到路由-
我正在尝试使用以下方法进行路由:

# cat /proc/sys/net/ipv4/ip_forward
1
iptables -t nat -A PREROUTING -p icmp -j DNAT --to-destination 128.1.3.2

注意:上述iptables规则是我想要的简化形式(仅icmp类型 8、仅具有特定的数据包dst address、仅来自特定的输入接口。这是因为我试图首先使其工作)。

这是当前的路由表:

 ip r
default via 192.168.1.1 dev enp4s0 proto dhcp src 192.168.1.174 metric 1024 
...
128.1.3.0/24 dev tap0 proto kernel scope link src 128.1.3.2 linkdown 
192.168.1.0/24 dev enp4s0 proto kernel scope link src 192.168.1.174 metric 1024 
192.168.1.1 dev enp4s0 proto dhcp scope link src 192.168.1.174 metric 1024 

我对以上所有内容的期望是,所有ICMP数据包都会被路由到接口tap0,但事实并非如此。发送
时,我会立即收到回复。 查看 ,我发现我的规则有效,这意味着上述规则被命中。 但没有任何内容(默认策略为)。 查看我可以看到数据包被接受了。ICMP
iptables -t nat -L -vnxiptables
iptables -L FORWARD -vnxACCEPT
iptables -L INPUT -vnx

请帮忙——可以进行这样的路由吗?

答案1

好的。
我重读将 ICMP 响应转发到 TAP 接口现在我明白了答案:

真正重要的是到 TAP 接口的路由。也就是说,由于在启动接口时添加了隐式路由,因此 10.0.4.0/24 中的任何 IP 除 10.0.4.1 之外。

# ip route get 10.0.4.1
local 10.0.4.1 dev lo src 10.0.4.1 uid 0 
    cache <local> 
# ip route get 10.0.4.2
10.0.4.2 dev tap0 src 10.0.4.1 uid 0 
    cache 

无论如何。我将iptables规则更改为与同一子网中的其他 IP,tap0现在它起作用了!谢谢@AB

相关内容