Linux与网络设备 GRE配置经验总结

GRE 介绍及应用场景

GRE(General Routing Encapsulation) 翻译过来是通用路由封装,是一种三层 VPN 技术,可以对某些网络层协议的报文进行封装,GRE的最大作用是对路由协议、语音、视频等组播报文或IPv6报文进行封装,另外 GRE 也可以与 IPSec 结合,来解决 GRE 的安全问题。

本文主要介绍 Linux 与 网络设备(华为防火墙、华为路由器、Juniper SRX防火墙)对接 GRE 的配置方法。

GRE 报文

如下图所示,GRE 是按照 TCPIP 协议栈进行逐层封装,新的 IP 头会封装在原有的 IP 头中,然后在运送出去,封装操作是通过 Tunnel 接口完成的,GRE 协议经过 Tunnel 口时,会将接口的封装协议设置为 GRE 协议。

image-20200901205719767

GRE 的配置场景

CentOS 7.6 与 华为防火墙建立 GRE 隧道

拓扑图

image-20200905182748526

实现目标

  • CentOS 与 华为防火墙建立 GRE 隧道

  • 华为防火墙背后的内网网段 192.168.1.0/24 通过 GRE 隧道从 CentOS 到 Internet

  • CentOS 配置端口映射,将 192.168.1.108080 端口映射到 CentOS 的公网地址 200.1.1.18080 端口

配置

  • CentOS

    • 配置接口与路由

      [root@CentOS ~]# vim /etc/sysconfig/network-scripts/ifcfg-tun0
      DEVICE=tun0
      BOOTPROTO=none
      ONBOOT=yes
      DEVICETYPE=tunnel
      TYPE=GRE
      PEER_INNER_IPADDR=172.16.1.2
      PEER_OUTER_IPADDR=100.1.1.1
      MY_INNER_IPADDR=172.16.1.1
      MY_OUTER_IPADDR=200.1.1.1
      
      [root@CentOS ~]# vim /etc/sysconfig/network-scripts/route-tun0
      192.168.1.0/24 via 172.16.1.2
      
      [root@CentOS ~]# ifup tun0
    • Iptables 配置

      # 安装 iptables 管理服务
      [root@CentOS ~]# yum install iptables-services
      
      # 在 INPUT 方向要放行对端的公网地址
      [root@CentOS ~]# iptables -I INPUT -s 100.1.1.1/32 -j ACCEPT
      
      # 配置源地址转换
      [root@CentOS ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 200.1.1.1
      
      # 端口映射
      [root@CentOS ~]# iptables -t nat -A PREROUTING -d 200.1.1.1 -p tcp --dport 8080 -j DNAT --to-dest 192.168.1.10:8080
      
      # 保存 iptables
      [root@CentOS ~]# service iptables save
    • 开启 ipv4 转发

      [root@CentOS ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
      
      [root@CentOS ~]# sysctl -p
  • 华为防火墙

    本次以华为 USG6300E 系列防火墙为例

    • 配置接口,并添加到安全区域

      interface Tunnel0
       ip address 172.16.1.2 255.255.255.0
       tunnel-protocol gre
       source 100.1.1.1
       destination 200.1.1.1
       
       # 将接口添加到安全区域内
      [USG6300E] firewall zone tunnel
      firewall zone name tunnel
       set priority 75
       add interface Tunnel0
    • 配置安全策略

      在实际的实施中,可以将策略收紧一些,根据需求限制源和目的地址

      如果条件允许的话,可以先将默认安全策略设置为 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
    • 配置策略路由

      [USG6300E]policy-based-route
      #
      policy-based-route
       rule name PBR
        source-zone trust
        source-address 192.168.1.0 mask 255.255.255.0
        action pbr egress-interface Tunnel0

      配置 No-NAT

      设置去往隧道的流量不使用源地址转换

      [USG6300E-policy-nat]dis th
      nat-policy
       rule name SNAT
        source-zone tunnel
        destination-zone untrust
        source-address 192.168.1.0 mask 255.255.255.0
        action no-nat

验证

主要有如下几个测试方法

  1. 在 CentOS 或 防火墙 ping 对端的隧道地址

  2. 使用 192.168.1.0/24 网段内的设备 traceroute 公网地址,查看经过的路径以确认是否经过隧道转发

Ubuntu 18 与 华为路由器建立 GRE 隧道

拓扑图

image-20200905182919741

实现目标

  • Ubuntu 18 与华为路由器建立 GRE 隧道

  • 华为防火墙背后的内网网段 192.168.1.0/24 通过 GRE 隧道从 CentOS 到 Internet

  • Ubuntu 配置端口映射,将 192.168.1.108080 端口映射到 CentOS 的公网地址 200.1.1.18080 端口

配置

  • Ubuntu

    • netplan 配置

      root@ubunt18demo:~# vim /etc/netplan/00-installer-config.yaml
      network:
          ethernets:
            ens3:
              addresses:
                - 200.1.1.1/24
              gateway4: 200.1.1.254
              nameservers:
                addresses:
                   - 114.114.114.114
          tunnels:
             tun0:
               mode: gre
               local: 200.1.1.1
               remote: 100.1.1.1
               addresses: [ 172.16.1.1/24 ]
               routes:
               - to: 192.168.1.0/24
                 via: 172.16.1.2
      
      # 可以先执行 netplan try 验证一下,如果没有断掉的话可以按 ENTER 确认配置
      # 如果和主机 SSH 中断,可以等待 120S 会自动恢复
      root@ubunt18demo:~# netplay try
    • iptables 设置

      Ufw 是 Ubuntu 的防火墙配置工具,底层还是调用 iptables 处理的

      # 启用 ufw
      ufw enable
      
      # 放行 SSH
      ufw allow ssh
      
      # 放行 GRE 对端进入的流量
      ufw allow from 100.1.1.1/32
      
      # 配置 nat 映射
      iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 200.1.1.1
      iptables -t nat -A PREROUTING -d 200.1.1.1 -p tcp --dport 8080 -j DNAT --to-dest 192.168.1.10:8080
      
      # 将 ufw 设置为开机自启动
      systemctl enable ufw

      开启 ipv4 转发

      echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
      
      sysctl -p
    • 华为路由器

      以 AR1200 系列路由器为例

      • 配置接口

        interface Tunnel0/0/1
         ip address 172.16.1.2 255.255.255.0
         tunnel-protocol gre
         source 100.1.1.1
         destination 200.1.1.1
      • 配置策略路由

        # 配置 ACL
        [AR1200] acl number 3000
        [AR1200-acl-adv-3000] rule 10 permit ip destination 192.168.1.0 0.0.0.255
        
        # 配置流分类
        [AR1200] traffic classifier togretunnel
        [AR1200-classifier-togretunnel] if-match acl 3000
        
        # 配置流行为
        [AR1200] traffic behavior togretunnel
        [AR1200-behavior-togretunnel] redirect ip-nexthop 172.16.1.1 
        
        # 配置流策略
        [AR1200] traffic policy togretunnel
        [AR1200-trafficpolicy-vlan10] classifier togretunnel behavior togretunnel
        
        # 在内网口调用流策略
        [AR1200] interface gigabitethernet 1/0/1
        [AR1200-GigabitEthernet3/0/0] traffic-policy togretunnel inbound

验证

验证方法同 CentOS 与 华为防火墙建立 GRE 隧道一致

Juniper SRX 防火墙的 GRE 配置

SRX 防火墙的出接口如果使用了 route-instances,那么配置 tunnel 口时,一定要注意增加 route-instance destination,如下所示

set interfaces gr-0/0/0 unit 0 tunnel source 100.1.1.1
set interfaces gr-0/0/0 unit 0 tunnel destination 200.1.1.1
set interfaces gr-0/0/0 unit 0 tunnel routing-instance destination EXAMPLE-INSTANCE 
set interfaces gr-0/0/0 unit 0 family inet address 172.16.1.2/24

另外策略路由在 SRX 中称为 FBF,还有 No-NAT的配置示例如下

# 配置 firewall filter,匹配需要进入隧道的流量
set firewall filter to-GreTunnel term 1 from source-address 192.168.1.0/24
set firewall filter to-GreTunnel term 1 then routing-instance EXAMPLE-INSTANCE
set firewall filter to-GreTunnel term 3 then accept

set routing-options rib-groups global import-rib EXAMPLE-INSTANCE.inet.0

# 配置去往 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 0.0.0.0/0 next-hop 172.16.1.1

# 在内网口调用 firewall filter
set interfaces reth2 unit 0 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-cn2-no-nat match source-address 192.168.1.0/24
set security nat source rule-set Gre-snat rule to-cn2-no-nat match destination-address 0.0.0.0/0
set security nat source rule-set Gre-snat rule to-cn2-no-nat then source-nat off

CentOS 的策略路由

如果有使用 Linux 作为中转的场景,也就是说华为防火墙和 Linux 建立 GRE 隧道,Linux 又和其他设备建立,由 Linux 做中转流量,这种场景下,可以在 Linux 配置策略路由,如下所示

# 临时配置,重启后会消失,可以作为调试使用
ip rule add from 192.168.1.0/24 table 100 pref 10
ip route add 0.0.0.0/0 via 200.1.1.254 table 100 

# 将配置持久化
vim /etc/sysconfig/network-scripts/rule-eth0
from 192.168.1.0/24 table 100 pref 10

vim /etc/sysconfig/network-scripts/route-eth0
default via 172.16.1.1 dev tun0

# 验证命令
ip rule show 
ip route show table 100

总结

GRE 在实际项目中会经常用到,虽然配置还是比较简单的,但 Linux 通常需要系统工程师配置,而网络设备通常由网络工程师配置,如果对接有问题,则需要沟通协调,就比较浪费时间,如果一个工程师能够完成两种设备的配置,并进行排错,那么效率将会提高很多。

作者:新钛云服  侯明明