两个 Tap 设备在同一台电脑上互相连接

两个 Tap 设备在同一台电脑上互相连接

我想要实现的是下面这样的内容。

                 192.168.1.1                                 192.168.1.2
+--------+      +----------+         +-----------+           +---------+       +---------+
|  APP0  +<---->+   tap0   +<------->+   myapp   +<--------->+   tap1  +<----->+   APP1  |
+--------+      +----------+         +-----------+           +---------+       +---------+
  1. 启动myapp,这将创建两个tap设备,并且tap0将在这两个tap设备之间转发数据包。tap1myapp
  2. APP0并将APP1与标准 tcp 套接字 API 进行通信。
  3. 所有这些应用程序和TAP设备都在一个Linux系统(Centos7.5)中。

但创建两个tap设备后,ping -I tap0 192.168.1.2并没有成功。

首先我发现存在ARP问题,然后我通过设置accept_localrp_filter文件解决它们。

echo 1 > /proc/sys/net/ipv4/conf/tap0/accept_local
echo 1 > /proc/sys/net/ipv4/conf/tap1/accept_local
echo 2 > /proc/sys/net/ipv4/conf/tap0/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/tap1/rp_filter;

使用tcpdump工具,我发现 ICMP 请求已到达tap1,但tap1ICMP 回复已到达lo设备。Linux 将通过设备路由所有本地流量lo

我怎样才能让本地流量跳过lo设备并进入分接设备?

我搜索了一下,发现有些解决方案需要配置 NAT 策略。我觉得它们很复杂。

答案1

我已经找到了此类问题的答案。

核心问题是如何绕过本地路由表。我从这里找到了一些有用的信息关联

我将展示如何通过 veth 接口来实现这一点。

  1. 创建 veth 对接口:veth0、veth1。并为其设置 IP。
ip link add veth0 type veth peer name veth1
ip link set dev veth0 up
ip link set dev veth1 up
ip addr add 10.8.1.3 dev veth0
ip addr add 10.8.1.4 dev veth1
  1. 使用 iptables 设置标记来标记从 veth0 和 veth1 发出的数据包
iptables -t mangle -s 10.8.1.3/32 -A OUTPUT -j MARK --set-mark 1
iptables -t mangle -s 10.8.1.4/32 -A OUTPUT -j MARK --set-mark 1
  1. 更改本地规则的优先级。您最好在系统启动时添加这些命令。该命令首先删除“本地”规则,这将导致您与 Linux 服务器的连接关闭。
ip rule del from all pref 0 lookup local
ip rule add from all pref 100 lookup local
  1. 向表100添加路由。这两条规则只是将数据包转发到其他接口。
ip route add 10.8.1.4/32 via 10.8.1.3 dev veth0 table 100
ip route add 10.8.1.3/32 via 10.8.1.4 dev veth1 table 100
  1. 添加一条新规则,该规则具有最高优先级。所有标记为 1 的数据包将首先触发此规则并在表 100 中查找路由。
ip rule add fwmark 1 pref 10 lookup 100
  1. 您还需要设置 accept_local 和 rp_filter 以使 ARP 正常工作。
echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local
echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local
echo 2 > /proc/sys/net/ipv4/conf/veth0/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/veth1/rp_filter;
  1. 现在您可以 ping 每个 IP 地址,ICMP 数据包将不会进入lo接口。

相关内容