Blame view
Documentation/networking/tuntap.rst
8.11 KB
973d55e59 docs: networking:... |
1 2 |
.. SPDX-License-Identifier: GPL-2.0 .. include:: <isonum.txt> |
1da177e4c Linux-2.6.12-rc2 |
3 |
|
973d55e59 docs: networking:... |
4 5 6 |
=============================== Universal TUN/TAP device driver =============================== |
1da177e4c Linux-2.6.12-rc2 |
7 |
|
973d55e59 docs: networking:... |
8 9 10 11 12 13 14 |
Copyright |copy| 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com> Linux, Solaris drivers Copyright |copy| 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com> FreeBSD TAP driver Copyright |copy| 1999-2000 Maksim Yevmenkin <m_evmenkin@yahoo.com> |
1da177e4c Linux-2.6.12-rc2 |
15 16 17 18 |
Revision of this document 2002 by Florian Thiel <florian.thiel@gmx.net> 1. Description |
973d55e59 docs: networking:... |
19 20 21 |
============== TUN/TAP provides packet reception and transmission for user space programs. |
1da177e4c Linux-2.6.12-rc2 |
22 |
It can be seen as a simple Point-to-Point or Ethernet device, which, |
973d55e59 docs: networking:... |
23 24 25 |
instead of receiving packets from physical media, receives them from user space program and instead of sending packets via physical media writes them to the user space program. |
1da177e4c Linux-2.6.12-rc2 |
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
In order to use the driver a program has to open /dev/net/tun and issue a corresponding ioctl() to register a network device with the kernel. A network device will appear as tunXX or tapXX, depending on the options chosen. When the program closes the file descriptor, the network device and all corresponding routes will disappear. Depending on the type of device chosen the userspace program has to read/write IP packets (with tun) or ethernet frames (with tap). Which one is being used depends on the flags given with the ioctl(). The package from http://vtun.sourceforge.net/tun contains two simple examples for how to use tun and tap devices. Both programs work like a bridge between two network interfaces. br_select.c - bridge based on select system call. br_sigio.c - bridge based on async io and SIGIO signal. However, the best example is VTun http://vtun.sourceforge.net :)) |
973d55e59 docs: networking:... |
43 44 45 46 |
2. Configuration ================ Create device node:: |
1da177e4c Linux-2.6.12-rc2 |
47 48 |
mkdir /dev/net (if it doesn't exist already) mknod /dev/net/tun c 10 200 |
973d55e59 docs: networking:... |
49 50 |
Set permissions:: |
ca6bb5d7a [NET]: Require CA... |
51 |
e.g. chmod 0666 /dev/net/tun |
973d55e59 docs: networking:... |
52 53 54 55 56 57 58 |
There's no harm in allowing the device to be accessible by non-root users, since CAP_NET_ADMIN is required for creating network devices or for connecting to network devices which aren't owned by the user in question. If you want to create persistent devices and give ownership of them to unprivileged users, then you need the /dev/net/tun device to be usable by those users. |
1da177e4c Linux-2.6.12-rc2 |
59 60 61 62 63 64 |
Driver module autoloading Make sure that "Kernel module loader" - module auto-loading support is enabled in your kernel. The kernel should load it on first access. |
973d55e59 docs: networking:... |
65 66 67 68 69 70 |
Manual loading insert the module by hand:: modprobe tun |
1da177e4c Linux-2.6.12-rc2 |
71 72 73 74 |
If you do it the latter way, you have to load the module every time you need it, if you do it the other way it will be automatically loaded when /dev/net/tun is being opened. |
973d55e59 docs: networking:... |
75 76 77 78 79 |
3. Program interface ==================== 3.1 Network device allocation ----------------------------- |
1da177e4c Linux-2.6.12-rc2 |
80 |
|
973d55e59 docs: networking:... |
81 82 83 84 |
``char *dev`` should be the name of the device with a format string (e.g. "tun%d"), but (as far as I can see) this can be any valid network device name. Note that the character pointer becomes overwritten with the real device name (e.g. "tun0"):: |
1da177e4c Linux-2.6.12-rc2 |
85 86 87 88 89 90 91 92 93 94 |
#include <linux/if.h> #include <linux/if_tun.h> int tun_alloc(char *dev) { struct ifreq ifr; int fd, err; if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) |
973d55e59 docs: networking:... |
95 |
return tun_alloc_old(dev); |
1da177e4c Linux-2.6.12-rc2 |
96 97 |
memset(&ifr, 0, sizeof(ifr)); |
973d55e59 docs: networking:... |
98 99 |
/* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device |
1da177e4c Linux-2.6.12-rc2 |
100 |
* |
973d55e59 docs: networking:... |
101 102 103 |
* IFF_NO_PI - Do not provide packet information */ ifr.ifr_flags = IFF_TUN; |
1da177e4c Linux-2.6.12-rc2 |
104 |
if( *dev ) |
973d55e59 docs: networking:... |
105 |
strncpy(ifr.ifr_name, dev, IFNAMSIZ); |
1da177e4c Linux-2.6.12-rc2 |
106 107 |
if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){ |
973d55e59 docs: networking:... |
108 109 |
close(fd); return err; |
1da177e4c Linux-2.6.12-rc2 |
110 111 112 |
} strcpy(dev, ifr.ifr_name); return fd; |
973d55e59 docs: networking:... |
113 114 115 116 117 118 |
} 3.2 Frame format ---------------- If flag IFF_NO_PI is not set each frame format is:: |
1da177e4c Linux-2.6.12-rc2 |
119 120 121 |
Flags [2 bytes] Proto [2 bytes] Raw protocol(IP, IPv6, etc) frame. |
973d55e59 docs: networking:... |
122 123 124 125 126 127 128 129 |
3.3 Multiqueue tuntap interface ------------------------------- From version 3.8, Linux supports multiqueue tuntap which can uses multiple file descriptors (queues) to parallelize packets sending or receiving. The device allocation is the same as before, and if user wants to create multiple queues, TUNSETIFF with the same device name must be called many times with IFF_MULTI_QUEUE flag. |
f422d2a04 net: docs: docume... |
130 |
|
973d55e59 docs: networking:... |
131 132 133 134 |
``char *dev`` should be the name of the device, queues is the number of queues to be created, fds is used to store and return the file descriptors (queues) created to the caller. Each file descriptor were served as the interface of a queue which could be accessed by userspace. |
f422d2a04 net: docs: docume... |
135 |
|
973d55e59 docs: networking:... |
136 |
:: |
f422d2a04 net: docs: docume... |
137 138 139 140 141 142 143 144 145 146 |
#include <linux/if.h> #include <linux/if_tun.h> int tun_alloc_mq(char *dev, int queues, int *fds) { struct ifreq ifr; int fd, err, i; if (!dev) |
973d55e59 docs: networking:... |
147 |
return -1; |
f422d2a04 net: docs: docume... |
148 149 150 151 152 153 154 155 156 157 158 159 |
memset(&ifr, 0, sizeof(ifr)); /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device * * IFF_NO_PI - Do not provide packet information * IFF_MULTI_QUEUE - Create a queue of multiqueue device */ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_MULTI_QUEUE; strcpy(ifr.ifr_name, dev); for (i = 0; i < queues; i++) { |
973d55e59 docs: networking:... |
160 161 162 163 164 165 166 167 |
if ((fd = open("/dev/net/tun", O_RDWR)) < 0) goto err; err = ioctl(fd, TUNSETIFF, (void *)&ifr); if (err) { close(fd); goto err; } fds[i] = fd; |
f422d2a04 net: docs: docume... |
168 169 170 171 172 |
} return 0; err: for (--i; i >= 0; i--) |
973d55e59 docs: networking:... |
173 |
close(fds[i]); |
f422d2a04 net: docs: docume... |
174 175 |
return err; } |
973d55e59 docs: networking:... |
176 177 178 179 |
A new ioctl(TUNSETQUEUE) were introduced to enable or disable a queue. When calling it with IFF_DETACH_QUEUE flag, the queue were disabled. And when calling it with IFF_ATTACH_QUEUE flag, the queue were enabled. The queue were enabled by default after it was created through TUNSETIFF. |
f422d2a04 net: docs: docume... |
180 |
|
973d55e59 docs: networking:... |
181 182 |
fd is the file descriptor (queue) that we want to enable or disable, when enable is true we enable it, otherwise we disable it:: |
f422d2a04 net: docs: docume... |
183 184 185 186 187 188 189 190 191 192 193 |
#include <linux/if.h> #include <linux/if_tun.h> int tun_set_queue(int fd, int enable) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); if (enable) |
973d55e59 docs: networking:... |
194 |
ifr.ifr_flags = IFF_ATTACH_QUEUE; |
f422d2a04 net: docs: docume... |
195 |
else |
973d55e59 docs: networking:... |
196 |
ifr.ifr_flags = IFF_DETACH_QUEUE; |
f422d2a04 net: docs: docume... |
197 198 199 |
return ioctl(fd, TUNSETQUEUE, (void *)&ifr); } |
973d55e59 docs: networking:... |
200 201 |
Universal TUN/TAP device driver Frequently Asked Question ========================================================= |
1da177e4c Linux-2.6.12-rc2 |
202 |
1. What platforms are supported by TUN/TAP driver ? |
973d55e59 docs: networking:... |
203 |
|
1da177e4c Linux-2.6.12-rc2 |
204 |
Currently driver has been written for 3 Unices: |
973d55e59 docs: networking:... |
205 206 207 208 |
- Linux kernels 2.2.x, 2.4.x - FreeBSD 3.x, 4.x, 5.x - Solaris 2.6, 7.0, 8.0 |
1da177e4c Linux-2.6.12-rc2 |
209 210 |
2. What is TUN/TAP driver used for? |
973d55e59 docs: networking:... |
211 212 |
As mentioned above, main purpose of TUN/TAP driver is tunneling. |
1da177e4c Linux-2.6.12-rc2 |
213 214 215 |
It is used by VTun (http://vtun.sourceforge.net). Another interesting application using TUN/TAP is pipsecd |
0211a9c85 trivial: fix an -... |
216 |
(http://perso.enst.fr/~beyssac/pipsec/), a userspace IPSec |
1da177e4c Linux-2.6.12-rc2 |
217 |
implementation that can use complete kernel routing (unlike FreeS/WAN). |
973d55e59 docs: networking:... |
218 |
3. How does Virtual network device actually work ? |
1da177e4c Linux-2.6.12-rc2 |
219 |
Virtual network device can be viewed as a simple Point-to-Point or |
973d55e59 docs: networking:... |
220 221 222 |
Ethernet device, which instead of receiving packets from a physical media, receives them from user space program and instead of sending packets via physical media sends them to the user space program. |
1da177e4c Linux-2.6.12-rc2 |
223 |
|
fe90689fe net: docs: replac... |
224 225 |
Let's say that you configured IPv6 on the tap0, then whenever the kernel sends an IPv6 packet to tap0, it is passed to the application |
973d55e59 docs: networking:... |
226 |
(VTun for example). The application encrypts, compresses and sends it to |
1da177e4c Linux-2.6.12-rc2 |
227 |
the other side over TCP or UDP. The application on the other side decompresses |
973d55e59 docs: networking:... |
228 |
and decrypts the data received and writes the packet to the TAP device, |
1da177e4c Linux-2.6.12-rc2 |
229 230 231 |
the kernel handles the packet like it came from real physical device. 4. What is the difference between TUN driver and TAP driver? |
973d55e59 docs: networking:... |
232 |
|
1da177e4c Linux-2.6.12-rc2 |
233 234 235 236 237 238 |
TUN works with IP frames. TAP works with Ethernet frames. This means that you have to read/write IP packets when you are using tun and ethernet frames when using tap. 5. What is the difference between BPF and TUN/TAP driver? |
973d55e59 docs: networking:... |
239 |
|
3d79c33bb BFP->BPF in Docum... |
240 |
BPF is an advanced packet filter. It can be attached to existing |
1da177e4c Linux-2.6.12-rc2 |
241 242 243 244 245 |
network interface. It does not provide a virtual network interface. A TUN/TAP driver does provide a virtual network interface and it is possible to attach BPF to this interface. 6. Does TAP driver support kernel Ethernet bridging? |
973d55e59 docs: networking:... |
246 247 |
Yes. Linux and FreeBSD drivers support Ethernet bridging. |