社区首页 >问答首页 >用tun设备发送原始IP包

用tun设备发送原始IP包
EN

Stack Overflow用户
提问于 2017-08-21 02:37:35
回答 1查看 2.6K关注 0票数 3

我试图以编程方式通过TUN装置构建和发送IP数据包。

我已经设置了TUN装置和正确的路线:

代码语言:javascript
代码运行次数:0
复制
# ip tuntap add mode tun tun0
# ip link set tun0 up
# ip addr add 10.0.0.2/24 dev tun0

其结果是:

代码语言:javascript
代码运行次数:0
复制
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use 
Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    600    0        0 wlp3s0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
192.168.0.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp3s0

$ ifconfig tun0
tun0: flags=4241<UP,POINTOPOINT,NOARP,MULTICAST>  mtu 1500
    inet 10.0.0.2  netmask 255.255.255.0  destination 10.0.0.2
    inet6 fe80::f834:5267:3a1:5d1d  prefixlen 64  scopeid 0x20<link>
    unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)

IP转发启动:# echo 1 > /proc/sys/net/ipv4/ip_forward

我已经为tun0数据包设置了NAT:

代码语言:javascript
代码运行次数:0
复制
# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o wlp3s0 -j MASQUERADE
# iptables -t nat -L -v
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination                   
0     0 MASQUERADE  all  --  any    wlp3s0  10.0.0.0/24          anywhere

然后,我使用python脚本来生成ICMP数据包:

代码语言:javascript
代码运行次数:0
复制
import os
from fcntl import ioctl
import struct
import time
import random

# pip install pypacker==4.0
from pypacker.layer3.ip import IP
from pypacker.layer3.icmp import ICMP

TUNSETIFF = 0x400454ca
IFF_TUN   = 0x0001
IFF_NO_PI = 0x1000

ftun = os.open("/dev/net/tun", os.O_RDWR)
ioctl(ftun, TUNSETIFF, struct.pack("16sH", b"tun0", IFF_TUN | IFF_NO_PI))

req_nr = 1
req_id = random.randint(1, 65000)
while True:
    icmp_req = IP(src_s="10.0.0.2", dst_s="8.8.8.8", p=1) +\
        ICMP(type=8) +\
        ICMP.Echo(id=req_id, seq=req_nr, body_bytes=b"povilas-test")
    os.write(ftun, icmp_req.bin())
    time.sleep(1)
    req_nr += 1

我可以看到来自tun0接口的数据包:

代码语言:javascript
代码运行次数:0
复制
# tshark -i tun0
1 0.000000000     10.0.0.28.8.8.8      ICMP 48 Echo (ping) request  id=0xb673, seq=1/256, ttl=64
2 1.001695939     10.0.0.28.8.8.8      ICMP 48 Echo (ping) request  id=0xb673, seq=2/512, ttl=64
3 2.003375319     10.0.0.28.8.8.8      ICMP 48 Echo (ping) request  id=0xb673, seq=3/768, ttl=6

但是wlp3s0接口是无声的,所以包似乎没有被NAT‘’ed和路由到wlp3s0接口,这是我的无线局域网卡。

知道我错过了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-22 02:14:17

我正在运行Debian 9。结果发现数据包转发被禁用-转发链的默认策略是DROP:

代码语言:javascript
代码运行次数:0
复制
# iptables -L -v
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

所以我改变了政策:

代码语言:javascript
代码运行次数:0
复制
# iptables -P FORWARD ACCEPT
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

此外,我还必须将IP数据包源地址更改为10.0.0.2以外的其他地址,这是tun0接口的首选源地址:

代码语言:javascript
代码运行次数:0
复制
$ ip route
10.0.0.0/24 dev tun0 proto kernel scope link src 10.0.0.2

因此,我将包源地址更改为10.0.0.4

代码语言:javascript
代码运行次数:0
复制
icmp_req = IP(src_s="10.0.0.4", dst_s="8.8.8.8", p=1) +\
    ICMP(type=8) +\
    ICMP.Echo(id=req_id, seq=req_nr, body_bytes=b"povilas-test")

然后内核开始将来自tun0接口的数据包转发到网关接口:

代码语言:javascript
代码运行次数:0
复制
# tshark -i wlp3s0

5 0.008428567 192.168.0.1038.8.8.8      ICMP 62 Echo (ping) request  id=0xb5c7, seq=9/2304, ttl=63
6 0.041114028      8.8.8.8192.168.0.103 ICMP 62 Echo (ping) reply    id=0xb5c7, seq=9/2304, ttl=48 (request in 5)

此外,ping响应也被发送回tun0

代码语言:javascript
代码运行次数:0
复制
# tshark -i tun0

1 0.000000000     10.0.0.48.8.8.8      ICMP 48 Echo (ping) request  id=0xb5c7, seq=113/28928, ttl=64
2 0.035470191      8.8.8.810.0.0.4     ICMP 48 Echo (ping) reply    id=0xb5c7, seq=113/28928, ttl=47 (request in 1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45794992

复制
相关文章
LVS-IP TUN集群
DR方式是通过MAC,规模是一个交换网络。而TUN方式,是通过给数据包加上新的IP头部来实现,这个可以跨整个广域网。
胡齐
2019/09/23
1.6K0
LVS-IP TUN集群
tun设备的妙用-V**篇
疫情期间,二哥在家远程工作了。因为每天都要通过V**访问公司内部服务,二哥想起来,何不给大家介绍下V**的工作原理呢?V**协议有很多个,最典型的有IPSec和OpenV**,这里二哥只聊OpenV**。
LanceZhang
2022/04/15
1.5K0
tun设备的妙用-V**篇
k8s集群网络(13)-flannel udp overlay网络通讯
在上一篇文章里我们介绍了k8s集群中flannel udp overlay网络的创建,这在里我们基于上一篇文章中的例子,来介绍在flannel udp overlay网络中pod到pod的通讯。
TA码字
2020/04/01
1.2K0
k8s集群网络(13)-flannel udp overlay网络通讯
原始UDP封包发送
发送原始UDP封包时: 1 以IPPROTO_UDP 为协议类型创建一个原始套接字,打开原始套接字上的IP_HDRINCL选项 2 构建UDP封包,要先设置IP头,设置UDP头,最后UDP净荷数据。 3 初始化完整的UDP封包之后,调用sendto函数即可将他发送。 计算UDP封包校验和的过程如下: void ComputeUdpPseudoHeaderChecksum( IPHeader *pIphdr, UDPHeader *pUdphdr, char *payloa
用户1154259
2018/01/17
1.9K0
tun设备的妙用-VPN篇
疫情期间,二哥在家远程工作了。因为每天都要通过VPN访问公司内部服务,二哥想起来,何不给大家介绍下VPN的工作原理呢?VPN协议有很多个,最典型的有IPSec和OpenVPN,这里二哥只聊OpenVPN。
LanceZhang
2022/06/20
5.6K0
tun设备的妙用-VPN篇
tun设备的妙用-OpenV**篇全流程补充
这篇是对上一篇《tun设备的妙用-V**篇》的补充。有朋友问二哥能不能把 OpenV** server 端的细节也画出来。安排!
LanceZhang
2022/04/15
1K0
tun设备的妙用-OpenV**篇全流程补充
Linux Tun/Tap 介绍
在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。
赵化冰
2022/08/01
2.8K0
Linux Tun/Tap 介绍
理解Linux IPIP隧道
IPIP隧道是一种点对点的隧道协议,用于在IPv4网络上传输IPv4或IPv6数据包。
编程黑洞
2023/10/23
8540
理解Linux IPIP隧道
k8s集群网络(14)-flannel underlay overlay 网络通讯对比
在前面的几篇文章里我们介绍了基于flannel的underlay网络和overlay网络,包括host-gw模式的underlay网络,基于vxlan的overlay网络,基于udp的overlay网络。这里我们做一下回顾总结和对比,相关文章可以参考如下:
TA码字
2020/04/01
2.4K0
理解Linux IPIP隧道
IPIP隧道是一种点对点的隧道协议,用于在IPv4网络上传输IPv4或IPv6数据包。
编程黑洞
2023/10/23
3910
理解Linux IPIP隧道
tun设备的妙用-Flannel UDP模式篇
在文章《特洛伊木马-图解VXLAN容器网络通信方案》里,二哥画了下面这张鸟瞰大图。它把基于Flannel VXLAN模式实现的K8s Overlay网络模型所需要的各类网路设备放在了一起,主要突出的是这些设备之间的数据流向。但那篇文章有些许缺点(凡尔赛一下):
LanceZhang
2022/04/15
1K0
tun设备的妙用-Flannel UDP模式篇
一文看懂Flannel-UDP在kubernetes中如何工作
Kubernetes是用于大规模管理容器化应用程序出色的编排工具。但是,您可能知道,使用kubernetes并非易事,尤其是后端网络实现。我在网络中遇到了许多问题,花了我很多时间弄清楚它是如何工作的。
公众号: 云原生生态圈
2021/02/26
1.3K0
详解云计算网络底层技术——虚拟网络设备 tap/tun 原理解析
在云计算时代,虚拟机和容器已经成为标配。它们背后的网络管理都离不开一样东西,就是虚拟网络设备,或者叫虚拟网卡,tap/tun 就是在云计算时代非常重要的虚拟网络网卡。
Linux云计算网络
2019/05/25
5.5K0
LVS负载均衡的三种工作模式的解析
NAT(Network Address Translation)即网络地址转换,原理是是通过修改数据报头,让内网IP地址可以访问外网,以及外部用用户可以访问位于内网的IP主机。LVS负载调度器可以使用两块网卡配置不同的IP地址,eth0设置为私有IP与内部网络通过交换设备相互连接,eth1设备为外网IP与外部网络联通。
用户7459214
2020/07/02
1.1K0
Keepalived LVS TUN
LVS 只实现到了四层,Keepalived 可以实现七层的简单检查,Keepalived 可以通过预设的检查逻辑来管理 LVS 配置,从而实现对 LVS 自动且动态的调配,让整个 LB 系统更加灵活且健壮
franket
2021/08/10
1.2K0
云原生虚拟网络 tun/tap & veth-pair
以前在研究 k8s 网络的时候,很多东西都看不太懂,只是蜻蜓点水过一下,这段时间打算恶补一下虚拟网络方面的知识,感兴趣的不妨一起探讨学习一下。
luozhiyun
2022/10/04
2K0
云原生虚拟网络 tun/tap & veth-pair
CentOS下使用TUN/TAP虚拟网卡的基本教程
在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。 TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。 操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。 服务器如果拥有TUN/TAP模块,就可以开启VPN代理功能。 虚拟网卡TUN/TAP 驱动程序设计原理:
云知识Online
2018/05/03
5.8K0
CentOS下使用TUN/TAP虚拟网卡的基本教程
深入理解kubernetes(k8s)网络原理之五-flannel原理
flannel有udp、vxlan和host-gw三种模式,udp模式因为性能较低现在已经比较少用到,host-gw我们在前面简单介绍过,因为使用场景比较受限,所以vxlan模式是flannel使用最多的模式,本章我们来介绍一下vxlan模式的原理。
一生无聊
2021/09/02
3.9K0
深入理解kubernetes(k8s)网络原理之五-flannel原理
玩转CVM之搭建GRE隧道
一种技术(协议)或者策略的两个或多个子网穿过另一种技术(协议)或者策略的网络实现互联,称之为overlay topology,这一技术是电信技术的永恒主题之一。
苏欣
2019/07/17
7.1K0
原始套接字 IP_HDRINCL 转
原始套接字可以访问ICMP和ICMP等协议包,可以读写内核不处理的IP数据包。可以创建自定义的IP数据包首部。一句话,使用原始套接字可以   编写基于IP协议的通讯程序。   1.创建原始套接字具体格式如下:int sockfd;sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);第一个参数:协议族 AF_INET 代表TCP/IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@如果指定协议为0时,原始套接字可以接收内核传递给原始套接字
战神伽罗
2019/08/30
2.4K0

相似问题

原始插座vs TUN设备

011

使用LWIP发送原始IP数据包

10

内核不回ICMP ping包写到tun设备?

12

用Python发送原始IP流量:检测MTU

13

使用ip tuntap命令点击接口和/dev/net/tun设备

210
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文