栏目头部广告

Linux搭建GRE隧道教程

一、GRE介绍

GRE隧道是一种IP-over-IP的隧道,是通用路由封装协议,可以对某些网路层协议的数据报进行封装,使这些被封装的数据报能够在IPv4/IPv6 网络中传输。Tunnel 是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel 的两端分别对数据报进行封装及解封装。 一个X协议的报文要想穿越IP网络在Tunnel中传输,必须要经过加封装与解封装两个过程。

1.1 应用场景

国家与国家之间的互联网如同一个孤岛。要想访问国外网站异常的缓慢,甚至被和谐了。可以通过建立一条隧道来避免这种情况,下面说说GRE隧道如何建立。

1.2 拓扑与实验要求

Linux搭建GRE隧道教程(图1)

【注】实现A2与B2、A2与B1之间的之间的通信通过GRE隧道,而不是直接走内网(公网)。完成实验后,在B1网卡上tcpdump隧道流量。

1.3 iptables常用命令补充

推荐文章:iptables与firewalls网络防火墙相关配置

二、隧道搭建

2.1 查看ip_gre模块的加载情况

【注】在Linux上创建GRE隧道,需要ip_gre内核模块,它是GRE通过IPv4隧道的驱动程序。

# modprobe ip_gre
# lsmod |grep ip_gre

Linux搭建GRE隧道教程(图2)

2.2 A1和B1开启路由转发

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p
cat /etc/sysctl.conf |grep ip_forward

2.3 建立隧道

ip tunnel add tun1 mode gre remote 192.168.2.10 local 192.168.1.10 ttl 255

# tun1改为你要搭建的隧道名,local后面添加的是本机器的内网IP。 remote为对端内网的IP,首先确保可以互通
ip link set tun1 up
ip addr add 10.10.10.1 peer 10.10.10.2 dev tun1

# 设定本机隧道的IP 10.10.10.1,对端的IP为 10.10.10.2
# ifconfig 查看

Linux搭建GRE隧道教程(图3)

# ip addr show

Linux搭建GRE隧道教程(图4)

【注】A1和B1两端同样配置。

ip tunnel add tun1 mode gre remote 192.168.1.10 local 192.168.2.10 ttl 255
ip link set tun1 up
ip addr add 10.10.10.2 peer 10.10.10.1 dev tun1

2.4 测试隧道tun1的联通性

  • A1侧隧道IP:10.10.10.1
  • B1侧隧道IP:10.10.10.2

tcpdump -i tun1

Linux搭建GRE隧道教程(图5)

2.5 配置路由转发

2.5.1 设置路由和NAT转发

(1)配置路由

Linux搭建GRE隧道教程(图6)

# 设置去往192.168.2.0网段默认的路由通过隧道走
route add -net 192.168.2.0 netmask 255.255.255.0 dev tun1 gw 10.10.10.1

Linux搭建GRE隧道教程(图7)

(2)配置NAT转发

# 将对端过来的10.10.10.2源地址nat转换成eth0上的地址
iptables -t nat -A POSTROUTING -o eth0 -s 10.10.10.2 -j MASQUERADE

# 开启对源地址10.10.10.2出口为eth0的转发功能
iptables -A FORWARD -s 10.10.10.2 -o eth0 -j ACCEPT

# 将源地址192.168.2.0网段的包nat成tun1的地址即为10.10.10.1
iptables -t nat -A POSTROUTING -o tun1 -s 192.168.2.0/24 -j MASQUERADE

# 开启转发源地址192.168.2.0网段的转发
iptables -A FORWARD -s 192.168.2.0/24 -o tun1 -j ACCEPT
iptables -t nat -L -n
iptables -L -n

Linux搭建GRE隧道教程(图8)

【注】A1B1做同样的配置。

route add -net 192.168.1.0 netmask 255.255.255.0 dev tun1 gw 10.10.10.2
iptables -t nat -A POSTROUTING -o eth0 -s 10.10.10.1 -j MASQUERADE
iptables -A FORWARD -s 10.10.10.1 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun1 -s 192.168.1.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.1.0/24 -o tun1 -j ACCEPT

Linux搭建GRE隧道教程(图9)

# 启动iptables并设置开机自启
systemctl restart iptables.service
systemctl enable iptables.service

# 永久保存规则
service iptables save

2.5.2 配置A2去往VPC2的路由和B2去往VPC1的路由

route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.10

【注】反向亦是如此。

2.6 删除GRE隧道

ip link set tun1 down
ip tunnel del tun1

三、GRE隧道问题与解决方案

GRE是将一个数据包封装到另一个数据包中,因此你可能会遇到GRE的数据包大于网络接口所设定的数据包最大尺寸的情况。解决这种问题的方法是在隧道接口上配置ip tcp adjust-mss 1436。另外,虽然GRE并不支持加密,但是你可以通过tunnel key命令在隧道的两头各设置一个密钥。这个密钥其实就是一个明文的密码。或者使用gre over ipsec,那样就比较复杂了再另说。

GRE隧道没有状态控制,可能隧道的一端已经关闭,而另一端仍然开启。这一问题的解决方案就是在隧道两端开启keepalive数据包。它可以让隧道一端定时向另一端发送keepalive数据,确认端口保持开启状态。如果隧道的某一端没有按时收到keepalive数据,那么这一侧的隧道端口 也会关闭。

作者:UStarGao
链接:https://www.starcto.com/service_operations/151.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`