GRE(General Routing Encapsulation),即通用路由封装,是一种三层 VPN 技术。它的最大作用是可以对某些网络层协议的报文进行封装,如对路由协议、语音、视频等组播报文或IPv报文进行封装。同时,也能够与 IPSec 结合,解决 GRE 的安全问题。
本文主要介绍 Linux 与 网络设备(华为防火墙、华为路由器、Juniper SRX防火墙)对接 GRE 的配置方法。
如下图所示,GRE 是按照 TCPIP 协议栈进行逐层封装,新的 IP 头会封装在原有的 IP 头中,然后运送出去,封装操作是通过 Tunnel 接口完成的,GRE 协议经过 Tunnel 口时,会将接口的封装协议设置为 GRE 协议。
CentOS 与 华为防火墙建立 GRE 隧道;
华为防火墙背后的内网网段
.../
通过 GRE 隧道从 CentOS 到 Internet;CentOS 配置端口映射,将
...
的端口映射到
CentOS
的公网地址...
的端口。
CentOS
配置接口与路由
[root@CentOS ~]# vim /etc/sysconfig/network-scripts/ifcfg-tun
DEVICE=tun
BOOTPROTO=none
ONBOOT=yes
DEVICETYPE=tunnel
TYPE=GRE
PEER_INNER_IPADDR=...
PEER_OUTER_IPADDR=...
MY_INNER_IPADDR=...
MY_OUTER_IPADDR=...
[root@CentOS ~]# vim /etc/sysconfig/network-scripts/route-tun
.../ via ...
[root@CentOS ~]# ifup tun
Iptables 配置
# 安装 iptables 管理服务
[root@CentOS ~]# yum install iptables-services
# 在 INPUT 方向要放行对端的公网地址
[root@CentOS ~]# iptables -I INPUT -s .../ -j ACCEPT
# 配置源地址转换
[root@CentOS ~]# iptables -t nat -A POSTROUTING -s .../ -j SNAT --to-source ...
# 端口映射
[root@CentOS ~]# iptables -t nat -A PREROUTING -d ... -p tcp --dport -j DNAT --to-dest ...:
# 保存 iptables
[root@CentOS ~]# service iptables save
开启 ipv 转发
[root@CentOS ~]# echo "net.ipv.ip_forward = " >> /etc/sysctl.conf
[root@CentOS ~]# sysctl -p
华为防火墙
本次以华为 USGE 系列防火墙为例:
配置接口,并添加到安全区域
interface Tunnel
ip address ... ...
tunnel-protocol gre
source ...
destination ...
# 将接口添加到安全区域内
[USGE] firewall zone tunnel
firewall zone name tunnel
set priority
add interface Tunnel
配置安全策略
在实际的实施中,可以将策略收紧一些,根据需求限制源和目的地址。
如果条件允许的话,可以先将默认安全策略设置为 permit,待调通之后,再修改安全策略:
security-policy
rule name tunnel_out
source-zone trust
destination-zone tunnel
action permit
rule name tunnel_in
source-zone tunnel
destination-zone trust
action permit
# 放行 tunnel 到 untrust 的流量
rule name tunnel_untrust
source-zone tunnel
destination-zone untrust
action permit
配置策略路由
[USGE]policy-based-route
#
policy-based-route
rule name PBR
source-zone trust
source-address ... mask ...
action pbr egress-interface Tunnel
配置 No-NAT
设置去往隧道的流量不使用源地址转换:
[USGE-policy-nat]dis th
nat-policy
rule name SNAT
source-zone tunnel
destination-zone untrust
source-address ... mask ...
action no-nat
主要有如下几个测试方法:
在 CentOS 或 防火墙 ping 对端的隧道地址;
使用
.../
网段内的设备 traceroute 公网地址,查看经过的路径以确认是否经过隧道转发。
Ubuntu 与华为路由器建立 GRE 隧道;
华为防火墙背后的内网网段
.../
通过 GRE 隧道从 CentOS 到 Internet;Ubuntu 配置端口映射,将
...
的端口映射到
CentOS
的公网地址...
的端口。
Ubuntu
netplan 配置
root@ubuntdemo:~# vim /etc/netplan/-installer-config.yaml
network:
ethernets:
ens:
addresses:
- .../
gateway: ...
nameservers:
addresses:
- ...
tunnels:
tun:
mode: gre
local: ...
remote: ...
addresses: [ .../ ]
routes:
- to: .../
via: ...
# 可以先执行 netplan try 验证一下,如果没有断掉的话可以按 ENTER 确认配置
# 如果和主机 SSH 中断,可以等待 S 会自动恢复
root@ubuntdemo:~# netplay try
iptables 设置
Ufw 是 Ubuntu 的防火墙配置工具,底层还是调用 iptables 处理的:
# 启用 ufw
ufw enable
# 放行 SSH
ufw allow ssh
# 放行 GRE 对端进入的流量
ufw allow from .../
# 配置 nat 映射
iptables -t nat -A POSTROUTING -s .../ -j SNAT --to-source ...
iptables -t nat -A PREROUTING -d ... -p tcp --dport -j DNAT --to-dest ...:
# 将 ufw 设置为开机自启动
systemctl enable ufw
开启 ipv 转发:
echo "net.ipv.ip_forward = " >> /etc/sysctl.conf
sysctl -p
华为路由器
以 AR 系列路由器为例:
配置接口
interface Tunnel//
ip address ... ...
tunnel-protocol gre
source ...
destination ...配置策略路由
# 配置 ACL
[AR] acl number
[AR-acl-adv-] rule permit ip destination ... ...
# 配置流分类
[AR] traffic classifier togretunnel
[AR-classifier-togretunnel] if-match acl
# 配置流行为
[AR] traffic behavior togretunnel
[AR-behavior-togretunnel] redirect ip-nexthop ...
# 配置流策略
[AR] traffic policy togretunnel
[AR-trafficpolicy-vlan] classifier togretunnel behavior togretunnel
# 在内网口调用流策略
[AR] interface gigabitethernet //
[AR-GigabitEthernet//] traffic-policy togretunnel inbound
验证方法同 CentOS 与 华为防火墙建立 GRE 隧道一致。
SRX 防火墙的出接口如果使用了 route-instances
,那么配置 tunnel 口时,一定要注意增加 route-instance destination,如下所示:
set interfaces gr-// unit tunnel source ...
set interfaces gr-// unit tunnel destination ...
set interfaces gr-// unit tunnel routing-instance destination EXAMPLE-INSTANCE
set interfaces gr-// unit family inet address .../
另外策略路由在 SRX 中称为 FBF,还有 No-NAT的配置示例如下:
# 配置 firewall filter,匹配需要进入隧道的流量
set firewall filter to-GreTunnel term from source-address .../
set firewall filter to-GreTunnel term then routing-instance EXAMPLE-INSTANCE
set firewall filter to-GreTunnel term then accept
set routing-options rib-groups global import-rib EXAMPLE-INSTANCE.inet.
# 配置去往 Gre Tunnel 的路由
set routing-instances EXAMPLE-INSTANCE instance-type forwarding
set routing-instances EXAMPLE-INSTANCE routing-options interface-routes rib-group inet global
set routing-instances EXAMPLE-INSTANCE routing-options static route .../ next-hop ...
# 在内网口调用 firewall filter
set interfaces reth unit family inet filter input to-GreTunnel
# 去往隧道口的流量不做 SNAT
set security nat source rule-set Gre-snat from zone Trust
set security nat source rule-set Gre-snat to zone EXAMPLE-INSTANCE
set security nat source rule-set Gre-snat rule to-cn-no-nat match source-address .../
set security nat source rule-set Gre-snat rule to-cn-no-nat match destination-address .../
set security nat source rule-set Gre-snat rule to-cn-no-nat then source-nat off
如果有使用 Linux 作为中转的场景,也就是说华为防火墙和 Linux 建立 GRE 隧道,Linux 又和其他设备建立,由 Linux 做中转流量,这种场景下,可以在 Linux 配置策略路由,如下所示:
# 临时配置,重启后会消失,可以作为调试使用
ip rule add from .../ table pref
ip route add .../ via ... table
# 将配置持久化
vim /etc/sysconfig/network-scripts/rule-eth
from .../ table pref
vim /etc/sysconfig/network-scripts/route-eth
default via ... dev tun
# 验证命令
ip rule show
ip route show table
GRE虽然配置还比较简单, 在实际项目中会经常用到。 Linux 通常需要系统工程师配置,而网络设备通常由网络工程师配置,如果对接有问题,则需要沟通协调,就比较浪费时间。如果一个工程师能够完成两种设备的配置,并进行排错,那么效率将会提高很多。
了解新钛云服
当IPFS遇见云服务|新钛云服与冰河分布式实验室达成战略协议
新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照
新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁
往期技术干货
刚刚,OpenStack 第 个版本来了,附项特性详细解读!