Tun/Tap虚拟网卡外网通讯

Catalogue
  1. 1. 简介
  2. 2. 1. ip转发方式实现外网通讯
    1. 2.1. @开启物理网卡的ip转发
    2. 2.2. @配置网卡防火墙规则
  3. 3. 2. 桥接网卡模式
    1. 3.1. 配置桥接

简介

tap属于2层协议,也就是他能够像读取文件一样获取拥有完整的数据包,包括以太网封装的mac目的地址和源地址等。拥有自己的ip地址和网段mac地址、等信息,可以当做完整独立的网卡

tun数据2层协议,也就是只能获取ip数据包结构,不能获得mac地址等等网络层以下的数据信息

  1. 默认tap网卡有自己的网段,和本地物理网卡不在同一个网段,那么收发的数据包需要路由配置,但是无法转发到网关路由器
  2. 有两种方法可以让tap网卡收发外网数据包,
  • 新建一个网桥bridge,并把tap和物理网卡桥接到该网桥下
  • tap网卡的数据包所有的都转发到本地物理网卡上,让物理网卡替tap 收发数据包到网关
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ ↑ |
|..............|................................|................|
| ↓ ↓ |
| +----------+ +------------+ |
| | eth0 | | tap0 | |
| +----------+ +------------+ |
| 10.0.2.15 ↑ 192.168.1.1 |
| | |
| | |
+--------------|-------------------------------------------------+

Physical Network

可以看到新建的tap虚拟网卡,可以自己定义协议栈和收发数据,但是却无法和物理网卡通讯

1. ip转发方式实现外网通讯

本质来说,就是让tap和 本地网卡通讯,只是目的ip依然为外网ip,那么本地网卡收到数据包后,判断ip为外网后替你转发到网卡后,进行一下跳,直到收到对方的包,然后在回复给tap网卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+----------------------------------------------------------------+
| |
| +------------------------- | -----------------------+ |
| | Newwork Prot | ocol Stack | |
| +------------------------- | -----------------------+ |
| ↑ ↑ |
|..............|................................|................|
| ↓ ↓ |
| +----------+ +------------+ |
| | eth0 | <-------> | tap0 | |
| +----------+ +------------+ |
| 10.0.2.15 ↑ 192.168.1.1 |
| | |
| | |
+--------------|-------------------------------------------------+

Physical Network

总的来说就是所有的数据包都发给eth0,mac目的地址填eth0的MAC地址,目的ip地址保持不变,传给eth0 让他去判断后转发给网关,最后转发到外网去。

@开启物理网卡的ip转发

临时

1
# echo "1"> /proc/sys/net/ipv4/ip_forward

永久

1
2
3
# nano /etc/sysctl.conf
net.ipv4.ip_forward=1 //取消注释
# sysctl -p //保存

第三种

1
# sudo sysctl net.ipv4.ip_forward=1

@配置网卡防火墙规则

配置物理网卡接受来自tap网段的数据包,并进行nat转发

1
2
3
4
# iptables -F	//清除所有的iptables规则
# iptables -P INPUT ACCEPT //允许接收
# iptables -P FORWARD ACCEPT //允许发送数据包
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE //MASQUERADE方式配置nat

2. 桥接网卡模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ ↑ |
|.........................|...........................|..........|
| ↓ ↓ |
| +------+ +--------+ +-------+ |
| | | | .2.15 | |192.168.1.0 |
| +------+ +--------+ <---------- +-------+ |
| | eth0 |<--->| br0 | | tap | |
| +------+ +--------+ +-------+ |
| ↑ |
| | |
| | |
| | |
+------------|---------------------------------------------------+

Physical Network

可以看到,tap网卡所有的写入数据都会转发到网桥br0上,处理,也能发送到网关连通外网,但是我的tap网卡却收不到网桥发回的数据,

比如tap发送一个tcp sync 包到外网ip114.148.199.89(瞎编的),那么他的流程实际是这样

  1. tap -> br0 br0收到目的ip不是本机,则发给网关,并带上源mac地址为br0地址
  2. br0 -> gateway 网关收到数据后进行下一跳,直到发送给114.148.199.89
  3. 114.148.199.89 -> br0 114.148.199.89收到sync包,并发送ack给br0
  4. br0 收到了该ack包,但是发现目的ip也就是tap的ip地址路由不到,就会发送icmp rst复位数据包告诉 114.148.199.89 连接错误
1
现在没有解决为什么tap网卡收不到外网包的问题!

配置桥接

  1. 桥接物理网卡到网桥上
1
2
3
4
- `brctl addbr br0`                 #创建网桥
- `brctl addif br0 eth0` #将eth0先加入网桥
- `ifconfig br0 10.0.2.15 up` #启动网桥并分配IP
- `ifconfig eth0 0.0.0.0` #eth0现在不需要IP地址了
  1. 创建tap网卡
1
2
3
- sudo ip tuntap add mode tap tap0
- sudo ip link set tap0 up
- sudo ip addr add 192.168.1.1/24 dev tap0
  1. 桥接tap网
1
- brctl addif br0 tap0
  1. 转移网关到网桥上
1
- ip route add defalut via 10.0.2.2 dev br0
  1. 配置nat 防火墙转发
1
- iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o br0 -j MASQUERADE