基于UDP的静态L2TPv3隧道

隧道XFRM 同时被 2 个专栏收录
32 篇文章 2 订阅
24 篇文章 0 订阅

 

L2TP网络拓扑如下,两个系统Host-A与Host-B直连互通,网段为192.168.1.0/24:

           Host-A                            Host-B
    |-------------------|             |-------------------|
    |                   |             |                   |
    |   192.168.1.115   | <---------> |   192.168.1.142   |
    |                   |             |                   |
    |-------------------|             |-------------------|

 

Host-A配置


根据ip-l2tp的man文档,完整的tunnel隧道配置命令如下:

       ip l2tp add tunnel
               remote ADDR local ADDR tunnel_id ID peer_tunnel_id ID
               [ encap udp ]
               [ udp_sport PORT  ] [ udp_dport PORT  ]
               [ udp_csum { on | off } ] [ udp6_csum_tx { on | off } ] [ udp6_csum_rx { on | off } ]

本示例忽略最后三个校验csum相关的可选配置参数。封装采用UDP,本端的UDP源端口选用5000,目的端口号选用6000,可根据需要自行选择。具体配置命令如下:

$ ip l2tp add tunnel tunnel_id 10 peer_tunnel_id 20 udp_sport 5000 udp_dport 6000 encap udp local 192.168.1.115 remote 192.168.1.142

$ sudo ip l2tp show tunnel
Tunnel 10, encap UDP
  From 192.168.1.115 to 192.168.1.142
  Peer tunnel 20
  UDP source / dest ports: 5000/6000
  UDP checksum: disabled

 

之后,配置L2TP session,加载l2tp_eth内核模块。UDP封装类型,会话session创建的完整命令如下:

       ip l2tp add session [ name NAME  ]
               tunnel_id ID session_id ID peer_session_id ID
               [ cookie HEXSTR  ] [ peer_cookie HEXSTR  ]
               [ l2spec_type { none | default } ]
               [ seq { none | send | recv | both } ]
               [ offset OFFSET  ] [ peer_offset OFFSET  ]

 

本示例忽略其中的name参数,不指定将使用默认的规则创建会话接口设备,即l2tpethN,其中N为数字。忽略cookie和peer_cookie参数,如果指定的话将在L2TP头部携带此参数,通信两端将对cookie值进行校验;否则,L2TP头部不携带cookie参数。忽略l2spec_type参数。忽略seq参数,不在L2TP头部中携带序号。offset以及peer_offset参数指定报文中数据以L2TP头部开始的偏移位置,如果使用,此两个参数要相同,具体配置命令如下:

$ modprobe l2tp_eth
$ ip l2tp add session tunnel_id 10 session_id 100 peer_session_id 200

 

检查配置

$ sudo ip l2tp show session
Session 100 in tunnel 10
  Peer session 200, tunnel 20
  interface name: l2tpeth0
  offset 0, peer offset 0

如果系统第一次创建会话session,分配的设备名称为l2tpeth0。根据以上的会话session配置,L2TP的会话session头部长度为8字节,加上默认的二层特殊子层(Default L2-Specific Sublayer)头部的4个字节,共需要12个字节的额外空间,设置l2tpeth0的MTU值为1500-12=1488字节。

$ ip link set l2tpeth0 up mtu 1488
$ ip addr add 10.1.1.1/24 dev l2tpeth0

 


Host-B配置


Host-B的隧道tunnel配置与Host-A的配置要对称,包括tunnel_id和UDP的端口号,以及L2TP的源和目的地址。

$ ip l2tp add tunnel tunnel_id 20 peer_tunnel_id 10 udp_sport 6000 udp_dport 5000 encap udp local 192.168.1.142 remote 192.168.1.115

查看隧道配置:

$ sudo ip l2tp show tunnel tunnel_id 20
Tunnel 20, encap UDP
  From 192.168.1.142 to 192.168.1.115
  Peer tunnel 10
  UDP source / dest ports: 6000/5000

配置会话session,session_id要与Host-A的配置对称。

$ modprobe l2tp_eth
$ ip l2tp add session tunnel_id 20 session_id 200 peer_session_id 100

查看会话session的配置:

$ sudo ip l2tp show session session_id 200             
Session 200 in tunnel 20
  Peer session 100, tunnel 10
  interface name: l2tpeth0
  offset 0, peer offset 0

配置会话接口的MTU和IP地址。

$ ip link set l2tpeth0 up mtu 1488
$ ip addr add 10.1.1.2/24 dev l2tpeth0

 

多会话配置


可在隧道内配置多个会话,如下在Host-A上的隧道10上另外配置一个会话101。由于已经存在一个会话设备了,此时创建的设备名称为l2tpeth1:

$ ip l2tp add session tunnel_id 10 session_id 101 peer_session_id 201 
$ ip link set l2tpeth1 up mtu 1488 
$ ip addr add 20.1.1.1/24 dev l2tpeth1  

查看隧道10的所有会话:

$ sudo ip l2tp show tunnel tunnel_id 10 session
Session 100 in tunnel 10
  Peer session 200, tunnel 20
  interface name: l2tpeth0
  offset 0, peer offset 0

Session 101 in tunnel 10
  Peer session 201, tunnel 20
  interface name: l2tpeth1
  offset 0, peer offset 0

在Host-B的隧道20上配置另一个会话201:

$ ip l2tp add session tunnel_id 20 session_id 201 peer_session_id 101 
$ ip link set l2tpeth1 up mtu 1488
$ ip addr add 20.1.1.2/24 dev l2tpeth1 


连通性测试


在Host-B设备上使用ping测试L2TP连通性,如下命令:

[Host-B ~]$ ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.160 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=0.124 ms

在Host-A上抓包显示如下,wireshark没有解析L2TP头部,参见Data字段,表明时L2TP的版本为v3:

 

清除L2TP配置。清除隧道,与之关联的会话session被同时清除。

[Host-A ~]$ sudo ip l2tp del tunnel tunnel_id 10
[Host-B ~]$ sudo ip l2tp del tunnel tunnel_id 20

 

END

 

  • 0
    点赞
  • 10
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值