15

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属性会产生一个SIOCSIFDSTADDRioctl。

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.
4

2 回答 2

18

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

您无需设置目标地址。如果要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.110.66.66.2( 10.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 地址根本不需要在同一范围内。

或者,您可以使用/31, RFC3021

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的所有 IP都可以通过该接口直接访问:这增加了一个路由规则。192.0.2.0/24192.0.2.0/24 dev tun0

当本地 IP 地址和对等地址不属于同一 IP 子网时,Linux 内核支持另一种类型的配置:192.0.2.1 peer 198.51.100.1. 这意味着这个接口192.0.2.1的IP地址是,对端的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 子网。或者你可以分配一个 /31。使用目标地址/peer配置,您可以避免为此点对点链路分配子网。

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

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

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

于 2016-05-19T14:59:02.693 回答
0

如果你添加一个接口

inet 10.66.66.1 网络掩码 255.255.255.0

无论您是否将其创建为点对点,都将向内核添加一个新的路由条目,用于 10.66.66.1/24,其目标为新接口。

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

于 2016-04-06T16:58:03.890 回答