【问题标题】:What is the "destination address" for a TAP/TUN device?TAP/TUN 设备的“目标地址”是什么?
【发布时间】:2016-04-02 16:03:47
【问题描述】:

TAP/TUN 设备的“目标地址”的用途是什么?

Pytun让您轻松设置tap/tun设备的参数:

tun = TapTunDevice(name='mytun')
tun.addr = '10.66.66.1'
tun.dstaddr = '10.66.66.2'
tun.netmask = '255.255.255.0'
tun.up()

这样做会导致设备配置如下:

$ ifconfig mytun
mytun: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.66.66.1  netmask 255.255.255.0  destination 10.66.66.2
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我了解到系统现在有一个 IP 为 10.66.66.1 的虚拟接口。并且推测在这种情况下,TUN 设备将“连接”到 IP 地址为 10.66.66.2 的(例如 VPN 网关)设备。

但是具体的目的是什么,让内核知道这是一个“点对点”接口以及目标的 IP 地址是什么?它是否会以某种方式影响路由,而仅配置路由表无法实现?


设置dstaddr 属性会产生SIOCSIFDSTADDR ioctl。

netdevice(7) 手册页简单地说:

  SIOCGIFDSTADDR, SIOCSIFDSTADDR
          Get or set the destination address of a point-to-point  device
          using  ifr_dstaddr.  For compatibility, only AF_INET addresses
          are accepted or returned.  Setting the destination address  is
          a privileged operation.

【问题讨论】:

    标签: tun


    【解决方案1】:

    我不关心这一切我要配置我的界面

    您无需设置目标地址。如果要在界面上配置10.66.66.1/24,可以这样做:

    tun = TapTunDevice(name='mytun')
    tun.addr = '10.66.66.1'
    tun.netmask = '255.255.255.0'
    tun.up()
    

    这个接口只连接两个主机,所以你实际上不需要一个完整的/24。只能说10.66.66.1连接到10.66.66.210.66.66.1 peer 10.66.66.2):

    tun = TapTunDevice(name='mytun')
    tun.addr = '10.66.66.1'
    tun.dstaddr = '10.66.66.2'
    tun.netmask = '255.255.255.255'
    tun.up()
    

    在此设置中,两个 IP 地址根本不需要在同一范围内。

    或者,您可以使用/31RFC3021

    tun = TapTunDevice(name='mytun')
    tun.addr = '10.66.66.2'
    tun.dstaddr = '10.66.66.3'
    tun.netmask = '255.255.255.254'
    tun.up()
    

    注意,我必须更改 IP 地址才能使它们位于相同的 /31 中。

    什么是POINTOPOINT 设备?

    POINTOPOINT 表示此接口上没有第 2 层寻址(无 MAC 地址):

    • 没有 ARP 请求 (IPv4);
    • 没有 NDP 请求 (IPv6);
    • 邻居表对这个接口没用(ip neighbour);
    • 在此接口的路由表条目中,via 指令被忽略;
    • 此接口上的数据包始终发送到相同的(仅)下一跳。

    POINTOPOINT 设备示例

    • PPP 接口:PPP 没有第 2 层地址,因为这种类型的接口将单个主机连接到另一台主机(因此称为“点对点协议”)

    • TUN 接口:它们是没有第 2 层的纯 IP 接口。

    POINTOPOINT 表示这是一个点对点接口(惊喜!),这意味着在接口的另一端只能连接一个对等点:您在此接口上有一个邻居,您可以不需要使用 ARP/NDP 将 IP 地址映射到链路层地址(而且您根本没有链路层地址)。

    相比之下,以太网设备不是点对点接口,因为可以通过该接口直接访问多个主机。当您向此类设备发送 IP 数据包时,网络堆栈必须为预期的 IP 地址找到第 2 层标识符(使用 ARP、NDP)并将消息发送到此链路层地址。

    这样说,是你的路由表(在以太网中):

    default via 192.0.2.1 dev eth0  proto static  metric 100
    192.0.2.0/24 dev eth0 proto kernel  scope link  src 192.0.2.2 metric 100
    

    多个主机可以通过 eth0 接口直接连接到您。如果要向 198.51.100.1 发送数据包,则选择此路由:

    default via 192.0.2.1 dev eth0  proto static  metric 100
    

    这意味着在eth0设备上的所有邻居中,您必须将数据包发送到192.0.2.1。为此,您的网络堆栈必须使用 ARP 找到 192.0.2.1 的 MAC 地址。

    POINTOPOINT设备上,总是只有一个邻居,所以你不需要做ARP,你只需要发送数据包。

    TUN 和 PPP 接口是POINTOPOINT 设备。以太网、以太网 TAP 设备和 Wifi 接口不是POINTOPOINT

    目标(对等)地址是什么?

    通常接口的 IP 配置格式为:192.0.2.1/24。这意味着该接口的 IP 地址是 192.0.2.1,并且 192.0.2.0/24 子网中的所有 IP 都可以通过该接口直接访问:这会添加一个路由规则 192.0.2.0/24 dev tun0

    当本地 IP 地址和对等地址不属于同一 IP 子网时,Linux 内核支持另一种类型的配置:192.0.2.1 peer 198.51.100.1。这意味着这个接口的IP地址是192.0.2.1,而对端的IP地址是198.51.100.1:这就增加了一个路由规则198.51.100.1 dev tun0。可以使用更通用的形式:192.0.2.1 peer 198.51.100.1/24

    $ ip地址显示tun0 14: tun0: mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500 链接/无 inet 192.0.2.1 198.51.100.1/24 范围全局 tun0 valid_lft 永远首选_lft 永远

    dstaddr参数(和SIOCSIFDSTADDR)可用于设置目标地址等。

    如果您不想为两个对等方分配公共子网,这很有用。您不必使用带有点对点接口的特殊目标地址。您可以使用标准 IP 子网。或者你可以分配a /31。使用目的地址/peer配置,可以避免为这个点对点链路分配子网。

    对等/目标地址与POINTOPOINT 设备之间的关系是什么?

    这些是独立的。您没有在POINTOPOINT 接口上设置目标地址。您可以在POINTOPOINT 上设置目标地址,也可以在普通地址上设置。

    但是,使用对等目标地址对POINTOPOINT 接口特别/最有用。

    【讨论】:

    • IMO 这个答案不是很清楚——我和 OP 有完全相同的问题,我觉得你回答得不是特别清楚。 ://
    • @horseguy:在顶部添加了一个 TLDR。
    • 谢谢!但是我仍然很困惑,为什么甚至需要 dest 地址?如果你的答案是“因为它是第 3 层 p2p 接口”,你能解释为什么它是 p2p 吗?我问过其他人,他们只是陷入了一个循环,说“这就是第 3 层接口的工作方式”,直到他们最终承认他们并不真正理解,并认为目标地址只是一个虚拟地址......?
    • @horseguy:需要为接口配置 IP+网络掩码。 dtsaddress 只是一个方便的扩展,它确实独立于 POINTTOPOINT 事物。 AFAIU,您可以在没有 POINTTOPOINT 接口的情况下使用此功能。而且您不需要将它与 POINTTOPOINT 接口一起使用。
    • 谢谢,但“方便的扩展”是什么意思?我仍然不明白为什么它是必要的
    【解决方案2】:

    如果你添加一个接口

    inet 10.66.66.1 网络掩码 255.255.255.0

    无论您是否将其创建为点对点,都会将新的路由条目添加到 10.66.66.1/24 的内核中,并带有新接口的目标。

    所以我认为那里没有区别。

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 2012-08-09
      • 1970-01-01
      • 2014-02-28
      • 2013-07-04
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多