linux中IP in IP隧道、IP GRE隧道和vxlan隧道的配置方法和报文结构。

目录

IP in IP隧道

IP GRE隧道

vxlan隧道


IP in IP隧道

拓扑:

1.0/24---eth0:1 (1.1)-vm1-eth0(100.1)------eth0(100.2)-vm2-eth0:1 (2.1)---2.0/24

IP地址前两个字节是192.168。所有的子网前缀长度都是24位。

为了简化环境,在eth0上配置第二个IP地址,形式上是给接口eth0:1配置IP地址。用来模拟vm后面的子网和主机。

vm1上配置

ifconfig eth0 192.168.100.1/24

ifconfig eth0:1 192.168.1.1/24

modprobe ipip

ip tunnel add tun0 mode ipip remote 192.168.100.2 local 192.168.100.1 ttl 64

ip link set tun0 up

ip addr add 192.168.3.1/24 peer 192.168.3.2/24 dev tun0

ip route add 192.168.2.0/24 dev tun0

iptables -F

vm2上配置

ifconfig eth0 192.168.100.1/24

ifconfig eth0:1 192.168.2.1/24

modprobe ipip

ip tunnel add tun0 mode ipip remote 192.168.100.1 local 192.168.100.2 ttl 64 

ip link set tun0 up 

ip addr add 192.168.3.2/24 peer 192.168.3.1/24 dev tun0 

ip route add 192.168.1.0/24 dev tun0 

iptables -F

说明:如果隧道接口不启用什么协议,只作为静态路由出接口,则可以不配置IP地址。比如上面的例子中vm1、vm2中的ip addr add命令可以不配置。如果隧道接口要启用协议,比如OSPF,才需要配置IP地址。可以为隧道接口配置独立的IP地址,上面的例子中就是为隧道接口配置了独立的IP地址。也可以让隧道接口借用其它私网地址,但是这样对协议运行可能构成一定的限制。例如上面的例子中,vm1的ip addr add命令修改为ip addr add 192.168.1.1/24 peer 192.168.2.1/24 dev tun0,vm2 的ip addr add命令修改为ip addr add 192.168.2.1/24 peer 192.168.1.1/24 dev tun0。这样就是让隧道接口借用vm1的eth0:1和vm2的eth0:1的地址。这里说的Tunnel接口IP地址配置的三种方式也同样适用于下面的IP GRE隧道和VXLAN隧道。

vm1上查看接口状态和路由:

# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.100.1  netmask 255.255.255.0  broadcast 192.168.101.255

       inet6 fe80::f816:3eff:fe1c:79e5  prefixlen 64  scopeid 0x20<link>

       ether fa:16:3e:1c:79:e5  txqueuelen 1000  (Ethernet)

       RX packets 17  bytes 2006 (1.9 KiB)

       RX errors 0  dropped 0  overruns 0  frame 0

       TX packets 21  bytes 2386 (2.3 KiB)

       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255

       ether fa:16:3e:1c:79:e5  txqueuelen 1000  (Ethernet)

tun0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1480 #mtu已经考虑了隧道开销为20个字节。

       inet 192.168.3.1  netmask 255.255.255.0  destination 192.168.3.2

       tunnel   txqueuelen 1000  (IPIP Tunnel)

       RX packets 0  bytes 0 (0.0 B)

       RX errors 0  dropped 0  overruns 0  frame 0

       TX packets 0  bytes 0 (0.0 B)

       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# route -n      

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.101.1   0.0.0.0         UG    0      0        0 eth0

192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 tun0

192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 tun0

192.168.100.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

这样一来vm1后面的192.168.1.0/24和vm2后面的192.168.2.0/24就可以通过ip in ip隧道通信了。

Vm1上ping:

# ping -I 192.168.1.1 192.168.2.1

PING 192.168.2.1 (192.168.2.1) from 192.168.1.1 : 56(84) bytes of data.

64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=1.11 ms

报文结构:外层IP头部的protocol字段是4,再往内就是内层IP头部。

IP GRE隧道

拓扑同ip in ip隧道

IP GRE隧道的配置方式和IP in IP隧道非常相似。只需要加载ip_gre模块,隧道模式改为gre即可。

vm1上配置

ifconfig eth0 192.168.100.1/24

ifconfig eth0:1 192.168.1.1/24

modprobe ipip

modprobe ip_gre

ip tunnel add tun0 mode gre remote 192.168.100.2 local 192.168.100.1 ttl 64 

ip link set tun0 up 

ip addr add 192.168.3.1/24 peer 192.168.3.2/24 dev tun0 

ip route add 192.168.2.0/24 dev tun0 

iptables -F

vm2上配置

ifconfig eth0 192.168.100.1/24

ifconfig eth0:1 192.168.2.1/24

modprobe ip_gre

ip tunnel add tun0 mode gre remote 192.168.100.1 local 192.168.100.2 ttl 64 

ip link set tun0 up 

ip addr add 192.168.3.2/24 peer 192.168.3.1/24 dev tun0 

ip route add 192.168.1.0/24 dev tun0 

iptables -F

vm1上查看tun0接口状态和路由。

# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.100.1  netmask 255.255.255.0  broadcast 192.168.101.255

       inet6 fe80::f816:3eff:feaa:e1fb  prefixlen 64  scopeid 0x20<link>

       ether fa:16:3e:aa:e1:fb  txqueuelen 1000  (Ethernet)

       RX packets 19  bytes 2198 (2.1 KiB)

       RX errors 0  dropped 0  overruns 0  frame 0

       TX packets 22  bytes 2428 (2.3 KiB)

       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

       inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255

       ether fa:16:3e:aa:e1:fb  txqueuelen 1000  (Ethernet)

tun0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1476 #mtu已经考虑了隧道开销为24个字节。

       inet 192.168.3.1  netmask 255.255.255.0  destination 192.168.3.2

       inet6 fe80::5efe:c0a8:6508  prefixlen 64  scopeid 0x20<link>

       unspec C0-A8-65-08-00-00-C0-6F-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)

       RX packets 0  bytes 0 (0.0 B)

       RX errors 0  dropped 0  overruns 0  frame 0

       TX packets 1  bytes 56 (56.0 B)

       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

             

# route -n      

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.101.1   0.0.0.0         UG    0      0        0 eth0

192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 tun0

192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 tun0

192.168.100.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

这样一来vm1后面的192.168.1.0/24和vm2后面的192.168.2.0/24就可以通过ip gre ip隧道通信了。

Vm1上ping:

# ping -I 192.168.1.1 192.168.2.1

PING 192.168.2.1 (192.168.2.1) from 192.168.1.1 : 56(84) bytes of data.

64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=1.11 ms

报文结构:外层IP头部的protocol字段是47,再往内就是GRE头部,GRE头部的protocol type是0x0800,再往内是内层IP头部。

vxlan隧道

拓扑仍然同ip in ip隧道

vm1上配置

ifconfig eth0 192.168.100.1/24

ifconfig eth0:1 192.168.1.1/24

# id是指vni。两侧的vni要相同。

ip link add vxlan0 type vxlan id 1 dstport 4789 192.168.100.2 local 192.168.100.1 ttl 64

ifconfig vxlan0 mtu 1450  #缺省vxlan0接口mtu和vm的eth0的mtu值相同,这样会因为分片导致吞吐量降低。vxlan隧道开销是50个字节,所以这里mtu设置为1500-50=1450。

ip link set vxlan0 up

ip addr add 192.168.3.1/24 peer 192.168.3.2/24 dev vxlan0

ip route add 192.168.2.0/24 dev vxlan0

iptables -F

vm2上配置

ifconfig eth0 192.168.100.1/24

ifconfig eth0:1 192.168.2.1/24

ip link add vxlan0 type vxlan id 1 dstport 4789 remote 192.168.100.1 local 192.168.100.2

ifconfig vxlan0 mtu 1450

ip link set vxlan0 up

ip addr add 192.168.3.2/24 peer 192.168.3.1/24 dev vxlan0

ip route add 192.168.1.0/24 dev vxlan0

iptables -F

vm1上查看接口状态和路由:

# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.100.1  netmask 255.255.255.0  broadcast 192.168.101.255

        inet6 fe80::f816:3eff:fe37:6481  prefixlen 64  scopeid 0x20<link>

        ether fa:16:3e:37:64:81  txqueuelen 1000  (Ethernet)

        RX packets 20  bytes 2506 (2.4 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 24  bytes 2708 (2.6 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255

        ether fa:16:3e:37:64:81  txqueuelen 1000  (Ethernet)

vxlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450

        inet 192.168.3.1  netmask 255.255.255.0  broadcast 0.0.0.0

        inet6 fe80::64:78ff:fe25:44f4  prefixlen 64  scopeid 0x20<link>

        ether 02:64:78:25:44:f4  txqueuelen 1000  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 3  bytes 224 (224.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# route -n

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.101.1   0.0.0.0         UG    0      0        0 eth0

192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 vxlan0

192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 vxlan0

192.168.100.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

这样一来vm1后面的192.168.1.0/24和vm2后面的192.168.2.0/24就可以通过vxlan隧道通信了。

Vm1上ping:

# ping -I 192.168.1.1 192.168.2.1

PING 192.168.2.1 (192.168.2.1) from 192.168.1.1 : 56(84) bytes of data.

64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=1.11 ms

报文结构:

VXLAN报文的封装格式为:在原始二层数据帧外添加VXLAN头、UDP头、IP头和以太头。其中,UDP目的端口号为4789,表明内层是VXLAN头。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值