Linux搭建GRE隧道教程
一、GRE介绍
GRE隧道是一种IP-over-IP的隧道,是通用路由封装协议,可以对某些网路层协议的数据报进行封装,使这些被封装的数据报能够在IPv4/IPv6 网络中传输。Tunnel 是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel 的两端分别对数据报进行封装及解封装。 一个X协议的报文要想穿越IP网络在Tunnel中传输,必须要经过加封装与解封装两个过程。
1.1 应用场景
国家与国家之间的互联网如同一个孤岛。要想访问国外网站异常的缓慢,甚至被和谐了。可以通过建立一条隧道来避免这种情况,下面说说GRE隧道如何建立。
1.2 拓扑与实验要求
【注】实现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
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 查看
# ip addr show
【注】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
2.5 配置路由转发
2.5.1 设置路由和NAT转发
(1)配置路由
# 设置去往192.168.2.0网段默认的路由通过隧道走 route add -net 192.168.2.0 netmask 255.255.255.0 dev tun1 gw 10.10.10.1
(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
【注】A1和B1做同样的配置。
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
# 启动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云平台推荐
随便看看
- 2023-08-12Windows Server快速关闭自动更新功能
- 2021-03-02MongoDB性能分析之db.currentOp
- 2021-09-16开源SQL审计检查分析平台
- 2021-08-10开源对象存储服务MinIO容器化部署
- 2021-11-26MongoDB副本集设置节点优先级priority