Linux的Network Tunnel技术
Linux的Network Tunnel技术
概要
Linux上可以使用ip tunnel命令创建多种类型的tunnel。
在 man ip-tunnel
中可以得知以下几种类型的tunnel:
MODE := { ipip | gre | sit | isatap | vti | ip6ip6 | ipip6 | ip6gre | vti6 | any }
ip tunnel的使用方法:
$ip tunnel help
Usage: ip tunnel { add | change | del | show | prl | 6rd } [ NAME ]
[ mode { ipip | gre | sit | isatap | vti } ] [ remote ADDR ] [ local ADDR ]
[ [i|o]seq ] [ [i|o]key KEY ] [ [i|o]csum ]
[ prl-default ADDR ] [ prl-nodefault ADDR ] [ prl-delete ADDR ]
[ 6rd-prefix ADDR ] [ 6rd-relay_prefix ADDR ] [ 6rd-reset ]
[ ttl TTL ] [ tos TOS ] [ [no]pmtudisc ] [ dev PHYS_DEV ]
Where: NAME := STRING
ADDR := { IP_ADDRESS | any }
TOS := { STRING | 00..ff | inherit | inherit/STRING | inherit/00..ff }
TTL := { 1..255 | inherit }
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网段传输。
underlay的传输IP: 192.168.40.2 <--------> 192.168.40.3
^ ^
| |
overlay的虚拟IP: 172.0.0.2 172.0.0.3
准备环境
在192.168.40.2,将网卡eth1加入到ipip-ns,配置IP 192.168.40.2:
ip netns add ipip-ns
ip link set eth1 netns ipip-ns
ip netns exec ipip-ns ip link set eth1 up
ip netns exec ipip-ns ip addr add 192.168.40.2 dev eth1
ip netns exec ipip-ns ip route add 192.168.40.0/24 via 192.168.40.2 dev eth1
$ip netns exec ipip-ns ping 192.168.40.1
PING 192.168.40.1 (192.168.40.1) 56(84) bytes of data.
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:
ip netns add ipip-ns
ip link set eth1 netns ipip-ns
ip netns exec ipip-ns ip link set eth1 up
ip netns exec ipip-ns ip addr add 192.168.40.3 dev eth1
ip netns exec ipip-ns ip route add 192.168.40.0/24 via 192.168.40.3 dev eth1
$ip netns exec ipip-ns ping 192.168.40.2
PING 192.168.40.2 (192.168.40.2) 56(84) bytes of data.
64 bytes from 192.168.40.2: icmp_seq=1 ttl=64 time=0.436 ms
创建tunnel
在192.168.40.2上:
modprobe ipip
//创建隧道,隧道本地端传输IP是192.168.40.2,远端的传输IP是192.168.40.3,通过eth1传输
$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
$ip netns exec ipip-ns ip addr add dev ipiptun 172.0.0.2 peer 172.0.0.3
//启动tunnel设备
$ip netns exec ipip-ns ip link set dev ipiptun up
//添加路由
$ip netns exec ipip-ns ip route add 172.0.0.0/24 via 172.0.0.2
在192.168.40.3上:
modprobe ipip
$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
$ip netns exec ipip-ns ip addr add dev ipiptun 172.0.0.3 peer 172.0.0.2
$ip netns exec ipip-ns ip link set dev ipiptun up
$ip netns exec ipip-ns ip route add 172.0.0.0/24 via 172.0.0.3
观察设备
观察192.168.40.2上的网络设备
$ip netns exec ipip-ns ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
...省略...
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:b3:6c:38 brd ff:ff:ff:ff:ff:ff
inet 192.168.40.2/32 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:feb3:6c38/64 scope link
valid_lft forever preferred_lft forever
4: ipiptun@eth1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN qlen 1
link/ipip 192.168.40.2 peer 192.168.40.3
inet 172.0.0.2 peer 172.0.0.3/32 scope global ipiptun
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:
$ip netns exec ipip-ns ping 172.0.0.3
PING 172.0.0.3 (172.0.0.3) 56(84) bytes of data.
64 bytes from 172.0.0.3: icmp_seq=1 ttl=64 time=0.319 ms
64 bytes from 172.0.0.3: icmp_seq=2 ttl=64 time=0.535 ms
64 bytes from 172.0.0.3: icmp_seq=3 ttl=64 time=0.552 ms
在192.168.40.3上抓包:
$ip netns exec ipip-ns tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
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)
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)
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)
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)
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)
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技术的更多相关文章
- Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机
(1).虚拟化产品对比介绍 虚拟化技术有以下三种:仿真虚拟化,这是一种对系统硬件没有要求,但性能最低的虚拟化技术:半虚拟化,这是一种直接使用物理硬件,性能高,但需要修改内核的虚拟化技术:全虚拟化,这是 ...
- Windows和Linux都有的Copy-on-write技术
Windows和Linux都有的Copy-on-write技术 MySQL技术内幕Innodb存储引擎第2版 P375 SQL Server2008 实现与维护(MCTS教程)P199 LVM快照技术 ...
- 转:Linux网络IO并行化技术概览
转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...
- 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 ...
- Linux的桌面虚拟化技术KVM(五)——virsh常用命令
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照 Linux的桌面虚 ...
- Linux的桌面虚拟化技术KVM(四)——虚拟机镜像格式对比与转换
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照 (1).常用镜像格 ...
- Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 (1).KVM虚拟机克隆 KVM虚拟克隆命令virt-clone [选项] 常用选项 ...
- Linux的桌面虚拟化技术KVM(二)——远程桌面管理
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 远程桌面管理,指的是远程图形界面管理,所以要保证物理机要有图形化界面. (1).VNC管理 安装VNC-server服务,并进行配置 [ro ...
- Linux服务器内存池技术是如何实现的
Linux服务器内存池技术是如何实现的
随机推荐
- Windows远程服务器不能复制粘贴
操作步骤: 在服务器上打开任务管理器,查看进程,有 rdpclip.exe 进程,关闭此进程: 然后 开始->运行->rdpclip.exe 重新运行此程序,恢复正常.
- IBATIS sql 小于(<) 写法 特殊符号写法
SELECT * FROM XXX where column1 <![CDATA [ < 100 ]]> ************************************ ...
- 洛谷 - P1403 - 约数研究 - 数论
https://www.luogu.org/problemnew/show/P1403 可以直接用线性筛约数个数求出来,但实际上n以内i的倍数的个数为n/i的下整,要求的其实是 $$\sum\limi ...
- python 容器 生成器 迭代器 总结
一.容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中. >> ...
- 使用pytesseract识别验证码,报错WindowsError: [Error 2]
问题现象: 按照网上的方式进行代码编写,使用pytesseract模块,然后导入指定图片进行解析,报错WindowsError: [Error 2] 问题原因: 源代码里面的路径设置错误,这里有一个坑 ...
- hdu 2189 悼念512汶川大地震遇难同胞——来生一起走 基础母函数
#include <iostream> #include <algorithm> #include <cstring> using namespace std; ] ...
- WIN7 64位操作系统 无法找到Access驱动
为了更充分的利用硬件资源,我想很多人都开使用64位操作系统了,同时你可以也发现了在64位操作系统上ODBC的驱动找不到了,所以ODBC的东西都没法用了. 因为2007以前版本的Office只有32位版 ...
- LCA+树状数组 POJ 2763 Housewife Wind
题目传送门 题意:两种操作,问u到v的距离,并且u走到了v:把第i条边距离改成w 分析:根据DFS访问顺序,将树处理成链状的,那么回边处理成负权值,那么LCA加上BIT能够知道u到v的距离,BIT存储 ...
- 482 License Key Formatting 注册码格式化
详见:https://leetcode.com/problems/license-key-formatting/description/ C++: class Solution { public: s ...
- python_9(模块补充)
第1章 re模块补充 1.1 贪婪匹配:回溯算法 1.2 .*?的用法 1.3 例:分组<name>取值 1.4 匹配整数删除小数 1.5 正则测试地址 第2章 重点模块 2.1 hash ...