Протокол GRE создавался компанией Cisco Systems для организации сетевых тунелей. И хотя в настоящее время GRE теряет актуальность, так как не поддерживает шифрование и не работает через NAT, в случае необходимости быстрой организации туннеля между двумя локальными сетями именно GRE будет в числе самых простых вариантов.
Два маршрутизатора (Net-R0 и Net-R2) на базе Linux CentOS 7 с такими вводными:
Net-R0:
WAN enp0s3 192.168.113.63 LAN enp0s8 10.0.0.1 GRE 172.17.254.1
Net-R2:
WAN enp0s3 192.168.113.65 LAN enp0s8 172.16.8.1 GRE 172.17.254.2
Поднять тонель и получить доступ к внутренним сетям.
# sysctl net.ipv4.ip_forward=1
Net-R0 (Host1)
# cat ifcfg-gre1 DEVICE=gre1 BOOTPROTO=none ONBOOT=no TYPE=GRE ## Addr Srv Net-R0 MY_OUTER_IPADDR=192.168.113.63 MY_INNER_IPADDR=172.17.254.1 PEER_OUTER_IPADDR=192.168.113.65 PEER_INNER_IPADDR=172.17.254.2
# cat route-gre1 172.16.8.0/24 via 172.17.254.2 dev gre1
Net-R2 (Host2)
# cat ifcfg-gre1 DEVICE=gre1 BOOTPROTO=none ONBOOT=no TYPE=GRE ## Addr Srv Net-R2 MY_OUTER_IPADDR=192.168.113.65 ## Addr Srv in a tonnel MY_INNER_IPADDR=172.17.254.2 # Addr Peer (other side Net-R0) PEER_OUTER_IPADDR=192.168.113.63 PEER_INNER_IPADDR=172.17.254.1
# cat route-gre1 10.0.0.0/24 via 172.17.254.1 dev gre1
Firewall
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT # firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p gre -j ACCEPT # firewall-cmd --reload
Iptables
# iptables -I INPUT -p gre -j ACCEPT
Проверяем:
[root@Net-R2]# ping 10.0.0.1
[root@net-r0]# tcpdump -envvn proto gre
tcpdump: listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
14:37:45.776948 08:00:27:5b:03:19 > 08:00:27:5c:5e:08, ethertype IPv4 (0x0800), length 122: (tos 0x0, ttl 64, id 761, offset 0, flags [DF], proto GRE (47), length 108)
192.168.113.65 > 192.168.113.63: GREv0, Flags [none], proto IPv4 (0x0800), length 88
(tos 0x0, ttl 64, id 24605, offset 0, flags [DF], proto ICMP (1), length 84)
172.17.254.2 > 10.0.0.2: ICMP echo request, id 9655, seq 1, length 64
14:37:46.957099 08:00:27:5b:03:19 > 08:00:27:5c:5e:08, ethertype IPv4 (0x0800), length 122: (tos 0x0, ttl 64, id 1554, offset 0, flags [DF], proto GRE (47), length 108)
192.168.113.65 > 192.168.113.63: GREv0, Flags [none], proto IPv4 (0x0800), length 88
(tos 0x0, ttl 64, id 24723, offset 0, flags [DF], proto ICMP (1), length 84)
172.17.254.2 > 10.0.0.2: ICMP echo request, id 9655, seq 2, length 64
Краткая шпаргалка:
HOST1: ip link add grelan type gretap local <IP1> remote <IP2> HOST1: ip link set grelan up HOST1: iptables -I INPUT -p gre -s <IP2> -j ACCEPT HOST2: ip link add grelan type gretap local <IP2> remote <IP1> HOST2: ip link set grelan up HOST2: iptables -I INPUT -p gre -s <IP1> -j ACCEPT