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

时间:2016-04-02 16:03:47

标签: tun

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.

2 个答案:

答案 0 :(得分:6)

我不在乎所有这些我想要配置我的界面

您不需要设置目的地地址。如果要在界面上配置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.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层地址,因为这种类型的接口将单个主机连接到另一个主机(因此名称为#34;点对点协议&#34;)

  • 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地址。

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

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

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

接口的IP配置通常采用以下格式:192.0.2.1/24。这意味着此接口的IP地址为192.0.2.1,并且192.0.2.0/24子网中的所有IP都可通过此接口直接到达:这会添加路由规则{{1} }。

当本地IP地址和对等地址不属于同一IP子网时,Linux内核支持另一种配置:192.0.2.0/24 dev tun0。这意味着此接口的IP地址为192.0.2.1 peer 198.51.100.1,并且对等体的IP地址为192.0.2.1:这会添加路由规则198.51.100.1。可以使用更通用的表单:198.51.100.1 dev tun0

$ ip address show tun0
14: tun0:  mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet 192.0.2.1 198.51.100.1/24 scope global tun0
       valid_lft forever preferred_lft forever

192.0.2.1 peer 198.51.100.1/24参数(以及dstaddr)可用于设置目标地址。

如果您不想为两个对等体分配公共子网,这将非常有用。您不必使用具有点对点接口的特殊目标地址。您可以使用标准IP子网。或者您可以分配a /31。使用目标地址/ SIOCSIFDSTADDR配置,可以避免为此点对点链接分配子网。

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

这些是独立的。您没有在POINTOPOINT界面上设置目标地址。您可以在POINTOPOINT上设置目标地址,也可以在正常地址上设置。

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

答案 1 :(得分:0)

如果使用

添加界面
  

inet 10.66.66.1 netmask 255.255.255.0

无论您是否将其创建为点对点,或者不是 - 新内存路由条目将添加到10.66.66.1/24的内核中,目的地为新接口。

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