You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
14 KiB
348 lines
14 KiB
This document describes how to use the kernel's L2TP drivers to |
|
provide L2TP functionality. L2TP is a protocol that tunnels one or |
|
more sessions over an IP tunnel. It is commonly used for VPNs |
|
(L2TP/IPSec) and by ISPs to tunnel subscriber PPP sessions over an IP |
|
network infrastructure. With L2TPv3, it is also useful as a Layer-2 |
|
tunneling infrastructure. |
|
|
|
Features |
|
======== |
|
|
|
L2TPv2 (PPP over L2TP (UDP tunnels)). |
|
L2TPv3 ethernet pseudowires. |
|
L2TPv3 PPP pseudowires. |
|
L2TPv3 IP encapsulation. |
|
Netlink sockets for L2TPv3 configuration management. |
|
|
|
History |
|
======= |
|
|
|
The original pppol2tp driver was introduced in 2.6.23 and provided |
|
L2TPv2 functionality (rfc2661). L2TPv2 is used to tunnel one or more PPP |
|
sessions over a UDP tunnel. |
|
|
|
L2TPv3 (rfc3931) changes the protocol to allow different frame types |
|
to be passed over an L2TP tunnel by moving the PPP-specific parts of |
|
the protocol out of the core L2TP packet headers. Each frame type is |
|
known as a pseudowire type. Ethernet, PPP, HDLC, Frame Relay and ATM |
|
pseudowires for L2TP are defined in separate RFC standards. Another |
|
change for L2TPv3 is that it can be carried directly over IP with no |
|
UDP header (UDP is optional). It is also possible to create static |
|
unmanaged L2TPv3 tunnels manually without a control protocol |
|
(userspace daemon) to manage them. |
|
|
|
To support L2TPv3, the original pppol2tp driver was split up to |
|
separate the L2TP and PPP functionality. Existing L2TPv2 userspace |
|
apps should be unaffected as the original pppol2tp sockets API is |
|
retained. L2TPv3, however, uses netlink to manage L2TPv3 tunnels and |
|
sessions. |
|
|
|
Design |
|
====== |
|
|
|
The L2TP protocol separates control and data frames. The L2TP kernel |
|
drivers handle only L2TP data frames; control frames are always |
|
handled by userspace. L2TP control frames carry messages between L2TP |
|
clients/servers and are used to setup / teardown tunnels and |
|
sessions. An L2TP client or server is implemented in userspace. |
|
|
|
Each L2TP tunnel is implemented using a UDP or L2TPIP socket; L2TPIP |
|
provides L2TPv3 IP encapsulation (no UDP) and is implemented using a |
|
new l2tpip socket family. The tunnel socket is typically created by |
|
userspace, though for unmanaged L2TPv3 tunnels, the socket can also be |
|
created by the kernel. Each L2TP session (pseudowire) gets a network |
|
interface instance. In the case of PPP, these interfaces are created |
|
indirectly by pppd using a pppol2tp socket. In the case of ethernet, |
|
the netdevice is created upon a netlink request to create an L2TPv3 |
|
ethernet pseudowire. |
|
|
|
For PPP, the PPPoL2TP driver, net/l2tp/l2tp_ppp.c, provides a |
|
mechanism by which PPP frames carried through an L2TP session are |
|
passed through the kernel's PPP subsystem. The standard PPP daemon, |
|
pppd, handles all PPP interaction with the peer. PPP network |
|
interfaces are created for each local PPP endpoint. The kernel's PPP |
|
subsystem arranges for PPP control frames to be delivered to pppd, |
|
while data frames are forwarded as usual. |
|
|
|
For ethernet, the L2TPETH driver, net/l2tp/l2tp_eth.c, implements a |
|
netdevice driver, managing virtual ethernet devices, one per |
|
pseudowire. These interfaces can be managed using standard Linux tools |
|
such as "ip" and "ifconfig". If only IP frames are passed over the |
|
tunnel, the interface can be given an IP addresses of itself and its |
|
peer. If non-IP frames are to be passed over the tunnel, the interface |
|
can be added to a bridge using brctl. All L2TP datapath protocol |
|
functions are handled by the L2TP core driver. |
|
|
|
Each tunnel and session within a tunnel is assigned a unique tunnel_id |
|
and session_id. These ids are carried in the L2TP header of every |
|
control and data packet. (Actually, in L2TPv3, the tunnel_id isn't |
|
present in data frames - it is inferred from the IP connection on |
|
which the packet was received.) The L2TP driver uses the ids to lookup |
|
internal tunnel and/or session contexts to determine how to handle the |
|
packet. Zero tunnel / session ids are treated specially - zero ids are |
|
never assigned to tunnels or sessions in the network. In the driver, |
|
the tunnel context keeps a reference to the tunnel UDP or L2TPIP |
|
socket. The session context holds data that lets the driver interface |
|
to the kernel's network frame type subsystems, i.e. PPP, ethernet. |
|
|
|
Userspace Programming |
|
===================== |
|
|
|
For L2TPv2, there are a number of requirements on the userspace L2TP |
|
daemon in order to use the pppol2tp driver. |
|
|
|
1. Use a UDP socket per tunnel. |
|
|
|
2. Create a single PPPoL2TP socket per tunnel bound to a special null |
|
session id. This is used only for communicating with the driver but |
|
must remain open while the tunnel is active. Opening this tunnel |
|
management socket causes the driver to mark the tunnel socket as an |
|
L2TP UDP encapsulation socket and flags it for use by the |
|
referenced tunnel id. This hooks up the UDP receive path via |
|
udp_encap_rcv() in net/ipv4/udp.c. PPP data frames are never passed |
|
in this special PPPoX socket. |
|
|
|
3. Create a PPPoL2TP socket per L2TP session. This is typically done |
|
by starting pppd with the pppol2tp plugin and appropriate |
|
arguments. A PPPoL2TP tunnel management socket (Step 2) must be |
|
created before the first PPPoL2TP session socket is created. |
|
|
|
When creating PPPoL2TP sockets, the application provides information |
|
to the driver about the socket in a socket connect() call. Source and |
|
destination tunnel and session ids are provided, as well as the file |
|
descriptor of a UDP socket. See struct pppol2tp_addr in |
|
include/linux/if_pppol2tp.h. Note that zero tunnel / session ids are |
|
treated specially. When creating the per-tunnel PPPoL2TP management |
|
socket in Step 2 above, zero source and destination session ids are |
|
specified, which tells the driver to prepare the supplied UDP file |
|
descriptor for use as an L2TP tunnel socket. |
|
|
|
Userspace may control behavior of the tunnel or session using |
|
setsockopt and ioctl on the PPPoX socket. The following socket |
|
options are supported:- |
|
|
|
DEBUG - bitmask of debug message categories. See below. |
|
SENDSEQ - 0 => don't send packets with sequence numbers |
|
1 => send packets with sequence numbers |
|
RECVSEQ - 0 => receive packet sequence numbers are optional |
|
1 => drop receive packets without sequence numbers |
|
LNSMODE - 0 => act as LAC. |
|
1 => act as LNS. |
|
REORDERTO - reorder timeout (in millisecs). If 0, don't try to reorder. |
|
|
|
Only the DEBUG option is supported by the special tunnel management |
|
PPPoX socket. |
|
|
|
In addition to the standard PPP ioctls, a PPPIOCGL2TPSTATS is provided |
|
to retrieve tunnel and session statistics from the kernel using the |
|
PPPoX socket of the appropriate tunnel or session. |
|
|
|
For L2TPv3, userspace must use the netlink API defined in |
|
include/linux/l2tp.h to manage tunnel and session contexts. The |
|
general procedure to create a new L2TP tunnel with one session is:- |
|
|
|
1. Open a GENL socket using L2TP_GENL_NAME for configuring the kernel |
|
using netlink. |
|
|
|
2. Create a UDP or L2TPIP socket for the tunnel. |
|
|
|
3. Create a new L2TP tunnel using a L2TP_CMD_TUNNEL_CREATE |
|
request. Set attributes according to desired tunnel parameters, |
|
referencing the UDP or L2TPIP socket created in the previous step. |
|
|
|
4. Create a new L2TP session in the tunnel using a |
|
L2TP_CMD_SESSION_CREATE request. |
|
|
|
The tunnel and all of its sessions are closed when the tunnel socket |
|
is closed. The netlink API may also be used to delete sessions and |
|
tunnels. Configuration and status info may be set or read using netlink. |
|
|
|
The L2TP driver also supports static (unmanaged) L2TPv3 tunnels. These |
|
are where there is no L2TP control message exchange with the peer to |
|
setup the tunnel; the tunnel is configured manually at each end of the |
|
tunnel. There is no need for an L2TP userspace application in this |
|
case -- the tunnel socket is created by the kernel and configured |
|
using parameters sent in the L2TP_CMD_TUNNEL_CREATE netlink |
|
request. The "ip" utility of iproute2 has commands for managing static |
|
L2TPv3 tunnels; do "ip l2tp help" for more information. |
|
|
|
Debugging |
|
========= |
|
|
|
The driver supports a flexible debug scheme where kernel trace |
|
messages may be optionally enabled per tunnel and per session. Care is |
|
needed when debugging a live system since the messages are not |
|
rate-limited and a busy system could be swamped. Userspace uses |
|
setsockopt on the PPPoX socket to set a debug mask. |
|
|
|
The following debug mask bits are available: |
|
|
|
PPPOL2TP_MSG_DEBUG verbose debug (if compiled in) |
|
PPPOL2TP_MSG_CONTROL userspace - kernel interface |
|
PPPOL2TP_MSG_SEQ sequence numbers handling |
|
PPPOL2TP_MSG_DATA data packets |
|
|
|
If enabled, files under a l2tp debugfs directory can be used to dump |
|
kernel state about L2TP tunnels and sessions. To access it, the |
|
debugfs filesystem must first be mounted. |
|
|
|
# mount -t debugfs debugfs /debug |
|
|
|
Files under the l2tp directory can then be accessed. |
|
|
|
# cat /debug/l2tp/tunnels |
|
|
|
The debugfs files should not be used by applications to obtain L2TP |
|
state information because the file format is subject to change. It is |
|
implemented to provide extra debug information to help diagnose |
|
problems.) Users should use the netlink API. |
|
|
|
/proc/net/pppol2tp is also provided for backwards compatibility with |
|
the original pppol2tp driver. It lists information about L2TPv2 |
|
tunnels and sessions only. Its use is discouraged. |
|
|
|
Unmanaged L2TPv3 Tunnels |
|
======================== |
|
|
|
Some commercial L2TP products support unmanaged L2TPv3 ethernet |
|
tunnels, where there is no L2TP control protocol; tunnels are |
|
configured at each side manually. New commands are available in |
|
iproute2's ip utility to support this. |
|
|
|
To create an L2TPv3 ethernet pseudowire between local host 192.168.1.1 |
|
and peer 192.168.1.2, using IP addresses 10.5.1.1 and 10.5.1.2 for the |
|
tunnel endpoints:- |
|
|
|
# modprobe l2tp_eth |
|
# modprobe l2tp_netlink |
|
|
|
# ip l2tp add tunnel tunnel_id 1 peer_tunnel_id 1 udp_sport 5000 \ |
|
udp_dport 5000 encap udp local 192.168.1.1 remote 192.168.1.2 |
|
# ip l2tp add session tunnel_id 1 session_id 1 peer_session_id 1 |
|
# ifconfig -a |
|
# ip addr add 10.5.1.2/32 peer 10.5.1.1/32 dev l2tpeth0 |
|
# ifconfig l2tpeth0 up |
|
|
|
Choose IP addresses to be the address of a local IP interface and that |
|
of the remote system. The IP addresses of the l2tpeth0 interface can be |
|
anything suitable. |
|
|
|
Repeat the above at the peer, with ports, tunnel/session ids and IP |
|
addresses reversed. The tunnel and session IDs can be any non-zero |
|
32-bit number, but the values must be reversed at the peer. |
|
|
|
Host 1 Host2 |
|
udp_sport=5000 udp_sport=5001 |
|
udp_dport=5001 udp_dport=5000 |
|
tunnel_id=42 tunnel_id=45 |
|
peer_tunnel_id=45 peer_tunnel_id=42 |
|
session_id=128 session_id=5196755 |
|
peer_session_id=5196755 peer_session_id=128 |
|
|
|
When done at both ends of the tunnel, it should be possible to send |
|
data over the network. e.g. |
|
|
|
# ping 10.5.1.1 |
|
|
|
|
|
Sample Userspace Code |
|
===================== |
|
|
|
1. Create tunnel management PPPoX socket |
|
|
|
kernel_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); |
|
if (kernel_fd >= 0) { |
|
struct sockaddr_pppol2tp sax; |
|
struct sockaddr_in const *peer_addr; |
|
|
|
peer_addr = l2tp_tunnel_get_peer_addr(tunnel); |
|
memset(&sax, 0, sizeof(sax)); |
|
sax.sa_family = AF_PPPOX; |
|
sax.sa_protocol = PX_PROTO_OL2TP; |
|
sax.pppol2tp.fd = udp_fd; /* fd of tunnel UDP socket */ |
|
sax.pppol2tp.addr.sin_addr.s_addr = peer_addr->sin_addr.s_addr; |
|
sax.pppol2tp.addr.sin_port = peer_addr->sin_port; |
|
sax.pppol2tp.addr.sin_family = AF_INET; |
|
sax.pppol2tp.s_tunnel = tunnel_id; |
|
sax.pppol2tp.s_session = 0; /* special case: mgmt socket */ |
|
sax.pppol2tp.d_tunnel = 0; |
|
sax.pppol2tp.d_session = 0; /* special case: mgmt socket */ |
|
|
|
if(connect(kernel_fd, (struct sockaddr *)&sax, sizeof(sax) ) < 0 ) { |
|
perror("connect failed"); |
|
result = -errno; |
|
goto err; |
|
} |
|
} |
|
|
|
2. Create session PPPoX data socket |
|
|
|
struct sockaddr_pppol2tp sax; |
|
int fd; |
|
|
|
/* Note, the target socket must be bound already, else it will not be ready */ |
|
sax.sa_family = AF_PPPOX; |
|
sax.sa_protocol = PX_PROTO_OL2TP; |
|
sax.pppol2tp.fd = tunnel_fd; |
|
sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr; |
|
sax.pppol2tp.addr.sin_port = addr->sin_port; |
|
sax.pppol2tp.addr.sin_family = AF_INET; |
|
sax.pppol2tp.s_tunnel = tunnel_id; |
|
sax.pppol2tp.s_session = session_id; |
|
sax.pppol2tp.d_tunnel = peer_tunnel_id; |
|
sax.pppol2tp.d_session = peer_session_id; |
|
|
|
/* session_fd is the fd of the session's PPPoL2TP socket. |
|
* tunnel_fd is the fd of the tunnel UDP socket. |
|
*/ |
|
fd = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax)); |
|
if (fd < 0 ) { |
|
return -errno; |
|
} |
|
return 0; |
|
|
|
Internal Implementation |
|
======================= |
|
|
|
The driver keeps a struct l2tp_tunnel context per L2TP tunnel and a |
|
struct l2tp_session context for each session. The l2tp_tunnel is |
|
always associated with a UDP or L2TP/IP socket and keeps a list of |
|
sessions in the tunnel. The l2tp_session context keeps kernel state |
|
about the session. It has private data which is used for data specific |
|
to the session type. With L2TPv2, the session always carried PPP |
|
traffic. With L2TPv3, the session can also carry ethernet frames |
|
(ethernet pseudowire) or other data types such as ATM, HDLC or Frame |
|
Relay. |
|
|
|
When a tunnel is first opened, the reference count on the socket is |
|
increased using sock_hold(). This ensures that the kernel socket |
|
cannot be removed while L2TP's data structures reference it. |
|
|
|
Some L2TP sessions also have a socket (PPP pseudowires) while others |
|
do not (ethernet pseudowires). We can't use the socket reference count |
|
as the reference count for session contexts. The L2TP implementation |
|
therefore has its own internal reference counts on the session |
|
contexts. |
|
|
|
To Do |
|
===== |
|
|
|
Add L2TP tunnel switching support. This would route tunneled traffic |
|
from one L2TP tunnel into another. Specified in |
|
http://tools.ietf.org/html/draft-ietf-l2tpext-tunnel-switching-08 |
|
|
|
Add L2TPv3 VLAN pseudowire support. |
|
|
|
Add L2TPv3 IP pseudowire support. |
|
|
|
Add L2TPv3 ATM pseudowire support. |
|
|
|
Miscellaneous |
|
============= |
|
|
|
The L2TP drivers were developed as part of the OpenL2TP project by |
|
Katalix Systems Ltd. OpenL2TP is a full-featured L2TP client / server, |
|
designed from the ground up to have the L2TP datapath in the |
|
kernel. The project also implemented the pppol2tp plugin for pppd |
|
which allows pppd to use the kernel driver. Details can be found at |
|
http://www.openl2tp.org.
|
|
|