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.
答案 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.1
与10.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地址):
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的内核中,目的地为新接口。
所以我认为那里没有区别。