Linux的Network Tunnel技术

概要

Linux上可以使用ip tunnel命令创建多种类型的tunnel。

在 man ip-tunnel

中可以得知以下几种类型的tunnel:

  1. MODE := { ipip | gre | sit | isatap | vti | ip6ip6 | ipip6 | ip6gre | vti6 | any }

ip tunnel的使用方法:

  1. $ip tunnel help
  2. Usage: ip tunnel { add | change | del | show | prl | 6rd } [ NAME ]
  3. [ mode { ipip | gre | sit | isatap | vti } ] [ remote ADDR ] [ local ADDR ]
  4. [ [i|o]seq ] [ [i|o]key KEY ] [ [i|o]csum ]
  5. [ prl-default ADDR ] [ prl-nodefault ADDR ] [ prl-delete ADDR ]
  6. [ 6rd-prefix ADDR ] [ 6rd-relay_prefix ADDR ] [ 6rd-reset ]
  7. [ ttl TTL ] [ tos TOS ] [ [no]pmtudisc ] [ dev PHYS_DEV ]
  8. Where: NAME := STRING
  9. ADDR := { IP_ADDRESS | any }
  10. TOS := { STRING | 00..ff | inherit | inherit/STRING | inherit/00..ff }
  11. TTL := { 1..255 | inherit }
  12. KEY := { DOTTED_QUAD | NUMBER }

ipip mode

ipip tunnel是最简单的一种,将ipv4报文封装在ip协议中送出,一对ipip tunnel设备之间只能建立一个tunnel。

因为ipip只能点对点等建立隧道,因此只能封装ipv4的单播报文,不能处理OSPF、RIP等多播协议。

下面在两台机器(192.168.40.2)和(192.168.40.3)之间建立ipip tunnel。

为了结构清晰,在两台机器上个创建一个ns,为这两个ns建立ipip tunnel。

试验规划

172.0.0.0/24网段的报文经封装后通过192.168.40.0/24网段传输。

  1. underlay的传输IP: 192.168.40.2 <--------> 192.168.40.3
  2. ^ ^
  3. | |
  4. overlay的虚拟IP: 172.0.0.2 172.0.0.3

准备环境

在192.168.40.2,将网卡eth1加入到ipip-ns,配置IP 192.168.40.2:

  1. ip netns add ipip-ns
  2. ip link set eth1 netns ipip-ns
  3. ip netns exec ipip-ns ip link set eth1 up
  4. ip netns exec ipip-ns ip addr add 192.168.40.2 dev eth1
  5. ip netns exec ipip-ns ip route add 192.168.40.0/24 via 192.168.40.2 dev eth1
  1. $ip netns exec ipip-ns ping 192.168.40.1
  2. PING 192.168.40.1 (192.168.40.1) 56(84) bytes of data.
  3. 64 bytes from 192.168.40.1: icmp_seq=1 ttl=64 time=0.304 ms

在192.168.40.3,将网卡eth1加入到ipip-ns,配置IP 192.168.40.3:

  1. ip netns add ipip-ns
  2. ip link set eth1 netns ipip-ns
  3. ip netns exec ipip-ns ip link set eth1 up
  4. ip netns exec ipip-ns ip addr add 192.168.40.3 dev eth1
  5. ip netns exec ipip-ns ip route add 192.168.40.0/24 via 192.168.40.3 dev eth1
  1. $ip netns exec ipip-ns ping 192.168.40.2
  2. PING 192.168.40.2 (192.168.40.2) 56(84) bytes of data.
  3. 64 bytes from 192.168.40.2: icmp_seq=1 ttl=64 time=0.436 ms

创建tunnel

在192.168.40.2上:

  1. modprobe ipip

//创建隧道,隧道本地端传输IP是192.168.40.2,远端的传输IP是192.168.40.3,通过eth1传输

  1. $ip netns exec ipip-ns ip tunnel add ipiptun mode ipip local 192.168.40.2 remote 192.168.40.3 ttl 64 dev eth1

//隧道的本地端虚拟IP是172.0.0.2,远端的虚拟IP是172.0.0.3

  1. $ip netns exec ipip-ns ip addr add dev ipiptun 172.0.0.2 peer 172.0.0.3

//启动tunnel设备

  1. $ip netns exec ipip-ns ip link set dev ipiptun up

//添加路由

  1. $ip netns exec ipip-ns ip route add 172.0.0.0/24 via 172.0.0.2

在192.168.40.3上:

  1. modprobe ipip
  1. $ip netns exec ipip-ns ip tunnel add ipiptun mode ipip local 192.168.40.3 remote 192.168.40.2 ttl 64 dev eth1
  2. $ip netns exec ipip-ns ip addr add dev ipiptun 172.0.0.3 peer 172.0.0.2
  3. $ip netns exec ipip-ns ip link set dev ipiptun up
  4. $ip netns exec ipip-ns ip route add 172.0.0.0/24 via 172.0.0.3

观察设备

观察192.168.40.2上的网络设备

  1. $ip netns exec ipip-ns ip addr
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
  3. ...省略...
  4. 2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
  5. link/ipip 0.0.0.0 brd 0.0.0.0
  6. 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  7. link/ether 08:00:27:b3:6c:38 brd ff:ff:ff:ff:ff:ff
  8. inet 192.168.40.2/32 scope global eth1
  9. valid_lft forever preferred_lft forever
  10. inet6 fe80::a00:27ff:feb3:6c38/64 scope link
  11. valid_lft forever preferred_lft forever
  12. 4: ipiptun@eth1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN qlen 1
  13. link/ipip 192.168.40.2 peer 192.168.40.3
  14. inet 172.0.0.2 peer 172.0.0.3/32 scope global ipiptun
  15. valid_lft forever preferred_lft forever

可以看到增加了一个ipiptun@eth1设备,就是在上面创建的ipiptun设备。

该设备的本地IP是192.168.40.2和172.0.0.2,对端IP是192.168.40.3和172.0.0.3。

联通测试

在192.168.40.2上发起ping:

  1. $ip netns exec ipip-ns ping 172.0.0.3
  2. PING 172.0.0.3 (172.0.0.3) 56(84) bytes of data.
  3. 64 bytes from 172.0.0.3: icmp_seq=1 ttl=64 time=0.319 ms
  4. 64 bytes from 172.0.0.3: icmp_seq=2 ttl=64 time=0.535 ms
  5. 64 bytes from 172.0.0.3: icmp_seq=3 ttl=64 time=0.552 ms

在192.168.40.3上抓包:

  1. $ip netns exec ipip-ns tcpdump -i eth1
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
  3. listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
  4. 08:02:29.287573 IP 192.168.40.2 > 192.168.40.3: IP 172.0.0.2 > 172.0.0.3: ICMP echo request, id 4363, seq 1, length 64 (ipip-proto-4)
  5. 08:02:29.287631 IP 192.168.40.3 > 192.168.40.2: IP 172.0.0.3 > 172.0.0.2: ICMP echo reply, id 4363, seq 1, length 64 (ipip-proto-4)
  6. 08:02:30.288665 IP 192.168.40.2 > 192.168.40.3: IP 172.0.0.2 > 172.0.0.3: ICMP echo request, id 4363, seq 2, length 64 (ipip-proto-4)
  7. 08:02:30.288749 IP 192.168.40.3 > 192.168.40.2: IP 172.0.0.3 > 172.0.0.2: ICMP echo reply, id 4363, seq 2, length 64 (ipip-proto-4)
  8. 08:02:31.290073 IP 192.168.40.2 > 192.168.40.3: IP 172.0.0.2 > 172.0.0.3: ICMP echo request, id 4363, seq 3, length 64 (ipip-proto-4)
  9. 08:02:31.290157 IP 192.168.40.3 > 192.168.40.2: IP 172.0.0.3 > 172.0.0.2: ICMP echo reply, id 4363, seq 3, length 64 (ipip-proto-4)

可以看到172.0.0.0/24网段的报文,经过封装后,通过192.168.40.0/24网段完成了传输。

高级应用

如果远端的设备上设置NAT,那么本地就可以通过建立的IPIP隧道,接入到远端机器所在的另一个网络。

Linux的Network Tunnel技术的更多相关文章

  1. Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机

    (1).虚拟化产品对比介绍 虚拟化技术有以下三种:仿真虚拟化,这是一种对系统硬件没有要求,但性能最低的虚拟化技术:半虚拟化,这是一种直接使用物理硬件,性能高,但需要修改内核的虚拟化技术:全虚拟化,这是 ...

  2. Windows和Linux都有的Copy-on-write技术

    Windows和Linux都有的Copy-on-write技术 MySQL技术内幕Innodb存储引擎第2版 P375 SQL Server2008 实现与维护(MCTS教程)P199 LVM快照技术 ...

  3. 转:Linux网络IO并行化技术概览

    转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...

  4. linux 启动network后报错:device eth0 does not seem to be present, delaying initialization

    问题背景: 在vsphere client中部署ovf模板后启动linux 的network后提示:device eth0 does not seem to be present, delaying ...

  5. Linux的桌面虚拟化技术KVM(五)——virsh常用命令

    Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照 Linux的桌面虚 ...

  6. Linux的桌面虚拟化技术KVM(四)——虚拟机镜像格式对比与转换

    Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照 (1).常用镜像格 ...

  7. Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照

    Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 (1).KVM虚拟机克隆 KVM虚拟克隆命令virt-clone [选项] 常用选项 ...

  8. Linux的桌面虚拟化技术KVM(二)——远程桌面管理

    Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 远程桌面管理,指的是远程图形界面管理,所以要保证物理机要有图形化界面. (1).VNC管理 安装VNC-server服务,并进行配置 [ro ...

  9. Linux服务器内存池技术是如何实现的

    Linux服务器内存池技术是如何实现的

随机推荐

  1. Hadoop 三大调度器源码分析及编写自己的调度器

    如要转载,请注上作者和出处.  由于能力有限,如有错误,请大家指正. 须知: 我们下载的是hadoop-2.7.3-src 源码. 这个版本默认调度器是Capacity调度器. 在2.0.2-alph ...

  2. [工具]kali-linux-2016.2 更新后

    使用官方的,会自动选择最近的服务器/etc/apt/sources.list # 就这一句就好了,不用添加一堆 deb http://http.kali.org/kali kali-rolling m ...

  3. Google Play应用商店的下载路径(转载)

    转自:http://blog.yanwen.org/archives/1660.html 其实,好久之前就想知道google play中下载的应用到哪里去了.之前用的MIUI系统里面,google p ...

  4. bzoj 2331: [SCOI2011]地板【插头dp】

    一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...

  5. thinkphp5 +elasticsearch

    php7使用elasticsearch 1.安装 官网下载地址:https://www.elastic.co/downloads/elasticsearch # 解压到非root目录,运行时使用非ro ...

  6. (数位DP)51NOD 1042 数字0-9的数量

    给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次.   输入 ...

  7. Luogu P1663 山【二分答案/实数域】By cellur925

    题目传送门 现在要在山上的某个部位装一盏灯,使得这座山的任何一个部位都能够被看到. 给出最小的y坐标,如图的+号处就是y坐标最小的安装灯的地方. 这个题嘛...今年省选前学姐来我们(破烂)的机房串门的 ...

  8. pycharm 整段缩进

    转自 https://blog.csdn.net/zoulonglong/article/details/79869787 在使用pycharm时,经常会需要多行代码同时缩进.左移,pycharm提供 ...

  9. 正睿OI提高组十连测 day1 总结

    可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...

  10. Hdu 5459 Jesus Is Here (2015 ACM/ICPC Asia Regional Shenyang Online) 递推

    题目链接: Hdu 5459 Jesus Is Here 题目描述: s1 = 'c', s2 = 'ff', s3 = s1 + s2; 问sn里面所有的字符c的距离是多少? 解题思路: 直觉告诉我 ...