linux tun open,云原生基座OpenKube开放容器实践六:理解linux虚拟网络设备tun

原标题:云原生基座OpenKube开放容器实践六:理解linux虚拟网络设备tun

tun是linux的另一种虚拟网络设备,与前面讲过的veth类似,只是另一端连的不一样,veth设备是一端连着内核协议栈,另一端连着另一个netns的协议栈;而tun设备是一端连着内核协议栈,另一端连接着一个用户程序,任何时候从协议栈发到tun网卡的数据都能从用户程序中读到,而从用户程序写入/dev/net/tun的数据都会被内核协议栈收到。

当我们通过程序打开/dev/net/tun设备时,就会发现我们的主机上多了一张网卡,打开多次会新增多张网卡,命名依次为tun0/tun1/tun2....,我们读写tun网卡的方式与正常读写一个文件一样,下面通过示例来了解一下。

首先编写一个c程序,文件名为tun.c,代码如下:

27da19acc59a6155357ac5b0b5cf65bb.png

0b6069771b9e6fcefc7b72b28d34c0e0.png

然后编译并执行:

7f84c5ee8cbd9fc8686b18a2d7b744a7.png

然后从另一个终端打开并查看网卡:

4a8824d2faafd75a315ecb157b5d60dc.png

c3fe5f8b026e62650d7ee698dea5aa46.png

发现已经多了一张tun0的网卡,我们给这个网卡配上地址,然后启动起来

fe135ab64fbc30897b19853b2212de90.png

注意我们给tun0配上地址时,主机上会多一条路由

最后,ping一下192.168.100.101,正常应该没有回应,但观察打开的第一个终端,发现有收到数据包:

342b192ea222751c6908948a83efbb22.png

可以看到,我们的用户程序已经收到了ICMP包,注意这里PING的不是我们给tun0设置的地址,如果你去ping tun0的地址192.168.100.100,会发现有正常的ICMP包回应,而终端1却什么也没收到,为什么要PING一个不存在的地址才行呢?让我们来捋一捋:

我们在主机上ping tun0的地址,进入协议栈后,在ROUTING判决时,发现这是本机地址,于是从lo网卡发送出去了,所以tun0永远也收不到这个包,要想让tun0收到包,要ping一个和tun0同网段的地址,因为这样才会让协议栈让这个包从tun0发出去,另一端是我们的程序,我们的程序啥也没干,只是打印了一下结果,所以ping的那一端不会有回应。

了解更多信息请登录:https://www.deepexi.com/bbs/developer-bbs返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值