GREとはGeneric Routing Encapsulationの略で簡単な設定で作成できるIPトンネル。
トンネル始端でIPヘッダの前にトンネル用のIPヘッダとGREヘッダを付加してトンネル終端へ転送。 トンネル終端では始端が付加したIPヘッダとGREヘッダを除去してからパケットを処理する。 外側のIPヘッダに設定するGREのプロトコル番号は47。
通常は、トンネルの両端で送信用の設定をすると、その相手先からのGREパケットを受け付けるようになる。 言い換えると、片方向だけトンネルを設定して送信しても受信側はパケットを破棄する。
他のVPNとは異なり本格的な認証や暗号化等のセキュリティ機能はない。 両端で共有するkeyが設定されているかどうかをチェックするオプションがある程度。
LinuxではL2のブリッジに接続してEoIPで転送するgretap
、ip6gretap
もある。RHEL8 ネットワークの設定および管理
typeがip-tunnel
でmodeがgre
またはip6gre
のコネクションを作成すると、GREのトンネルデバイスを作成できる。
そのコネクションにipv4やipv6の設定を加えるとパケットの転送(ルーティング)が出来るようになる。
参照: nm-settings(5)
ip-tunnel(8)
CentOS 7では、ipv6.method disabled
をipv6.method ignore
にすること。
firewalldを実行している場合は、GREプロトコルの受信を許可する。
# firewall-cmd --add-service gre # firewall-cmd --runtime-to-permanent
他のサーバから受信したパケットを別のサーバに転送(フォワーディング)するならカーネルパラメータを変更する。
# cat <<EOF > /etc/sysctl.d/ip_forward.conf net.ipv4.ip_forward = 1 EOF # sysctl --system
サーバAとサーバBをつなぐ単純であまり実用的でない、トンネル作成時のパラメータによる違いを説明するための構成。
色々なパラメータとその組み合わせで作成できるが、
対向がremote
に設定したアドレスで送信しないと受け取ってもらえないため、
ネットワーク的に自明であってもremote
とlocal
を設定するのが無難。
ここでは割愛するがlocal
とdev
を両方とも設定することも可能。
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 \ ipv4.method manual ip4 192.168.0.0/31 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 \ ipv4.method manual ip4 192.168.0.1/31 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local any ttl inherit # ip link show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 0.0.0.0 peer 172.31.0.102 # ip addr show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 0.0.0.0 peer 172.31.0.102 inet 192.168.0.0/31 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 100 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 100 192.168.0.0/31 dev tun2b proto kernel scope link src 192.168.0.0 metric 675
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 dev eth0 \ ipv4.method manual ip4 192.168.0.0/31 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 dev eth0 \ ipv4.method manual ip4 192.168.0.1/31 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local any dev eth0 ttl inherit # ip link show dev tun2b 8: tun2b@eth0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 0.0.0.0 peer 172.31.0.102 # ip addr show dev tun2b 8: tun2b@eth0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 0.0.0.0 peer 172.31.0.102 inet 192.168.0.0/31 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 100 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 100 192.168.0.0/31 dev tun2b proto kernel scope link src 192.168.0.0 metric 675
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 local 172.31.0.101 \ ipv4.method manual ip4 192.168.0.0/31 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 local 172.31.0.102 \ ipv4.method manual ip4 192.168.0.1/31 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local 172.31.0.101 ttl inherit # ip link show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 # ip addr show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 inet 192.168.0.0/31 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 100 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 100 192.168.0.0/31 dev tun2b proto kernel scope link src 192.168.0.0 metric 675
input-key
とoutput-key
に設定可能な値は、数値またはIPアドレスのように“.”で区切った4つの数値。
input-key
とoutput-key
に同じ値を設定できる。
その場合、トンネルデバイスのパラメータはikey
とokey
の二つではなくkey
一つになる。
当然ながらoutput-key
と対向のinput-key
が一致しない場合、パケットは破棄される。
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 \ ip-tunnel.input-key 1234 ip-tunnel.output-key 5678 \ ipv4.method manual ip4 192.168.0.0/31 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 \ ip-tunnel.input-key 5678 ip-tunnel.output-key 1234 \ ipv4.method manual ip4 192.168.0.1/31 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local any ttl inherit ikey 1234 okey 5678 # ip link show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1472 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 0.0.0.0 peer 172.31.0.102 # ip addr show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1472 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 0.0.0.0 peer 172.31.0.102 inet 192.168.0.0/31 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 100 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 100 192.168.0.0/31 dev tun2b proto kernel scope link src 192.168.0.0 metric 675
WAN側の172.31.0.101と172.31.0.102を終端としてGREトンネルを作成。 LAN側の192.168.10.0/24と192.168.20.0/24が疎通するようにする。
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 local 172.31.0.101 \ ipv4.method manual ip4 192.168.0.0/31 ipv4.routes 192.168.20.0/24 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 local 172.31.0.102 \ ipv4.method manual ip4 192.168.0.1/31 ipv4.routes 192.168.10.0/24 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local 172.31.0.101 ttl inherit # ip link show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 # ip addr show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 inet 192.168.0.0/31 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 103 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 103 192.168.0.0/31 dev tun2b proto kernel scope link src 192.168.0.0 metric 675 192.168.20.0/24 dev tun2b proto static scope link metric 675
WAN側の172.31.0.101と172.31.0.102を終端としてGREトンネルを作成。 LAN側の2001:db8:10::/64と2001:db8:20::/64が疎通するようにする。
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 local 172.31.0.101 \ ipv4.method disabled ipv6.method manual ip6 2001:db8:aa::1/64 ipv6.routes 2001:db8:20::/64
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 local 172.31.0.102 \ ipv4.method disabled ipv6.method manual ip6 2001:db8:aa::2/64 ipv6.routes 2001:db8:10::/64
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local 172.31.0.101 ttl inherit # ip link show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 # ip addr show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 inet6 2001:db8:aa::1/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::d781:253b:3686:8174/64 scope link noprefixroute valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 103 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 103 # ip -6 route ::1 dev lo proto kernel metric 256 pref medium 2001:db8:10::/64 dev eth1 proto kernel metric 104 pref medium 2001:db8:20::/64 dev tun2b proto static metric 675 pref medium 2001:db8:aa::/64 dev tun2b proto kernel metric 675 pref medium fe80::/64 dev eth1 proto kernel metric 1024 pref medium fe80::/64 dev tun2b proto kernel metric 1024 pref medium
WAN側の2001:db8::101と2001:db8::102を終端としてGREトンネルを作成。 LAN側IPの192.168.10.0/24と192.168.20.0/24が疎通するようにする。
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode ip6gre remote 2001:db8::102 local 2001:db8::101 \ ipv4.method manual ip4 192.168.0.0/31 ipv4.routes 192.168.20.0/24 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode ip6gre remote 2001:db8::101 local 2001:db8::102 \ ipv4.method manual ip4 192.168.0.1/31 ipv4.routes 192.168.10.0/24 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc # ip -6 tun ip6tnl0: ipv6/ipv6 remote :: local :: encaplimit 0 hoplimit inherit tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) ip6gre0: gre/ipv6 remote :: local :: encaplimit 0 hoplimit inherit tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) tun2b: gre/ipv6 remote 2001:db8::102 local 2001:db8::101 encaplimit 0 hoplimit inherit tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) # ip link show dev tun2b 12: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1448 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre6 2001:db8::101 peer 2001:db8::102 permaddr 26ad:541e:f5ea:: # ip addr show dev tun2b 12: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1448 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre6 2001:db8::101 peer 2001:db8::102 permaddr 26ad:541e:f5ea:: inet 192.168.0.0/31 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip route 192.168.0.0/31 dev tun2b proto kernel scope link src 192.168.0.0 metric 675 192.168.10.0/24 dev eth1 proto kernel scope link src 192.168.10.1 metric 104 192.168.20.0/24 dev tun2b proto static scope link metric 675 # ip -6 route ::1 dev lo proto kernel metric 256 pref medium 2001:db8::/64 dev eth0 proto kernel metric 105 pref medium fe80::/64 dev eth0 proto kernel metric 1024 pref medium
local
を設定しないと、journalctlにmanager: (tun2b) couldn't create the device: Failed to create IPv6 tunnel interface 'tun2b' for 'tun2b': File exists
と出力してトンネルデバイスの作成に失敗する。
Rocky Linux 8.7では疎通しない。
conntrackのstateがinvalidになっているようでfirewalldがSTATE_INVALID_DROP
で破棄してしまう。
--add-rich-ruleや--add-protocolで許可設定をしてもルールにct state { new, untracked }
が追加されてしまうので解決しない。
firewalldを停止すると疎通するが脆弱になる。
ip6tablesやnftでfilterテーブルのINPUTチェーンにルールを追加してもfirewalld.direct(5)のCAVEATSで説明されているように、 netfilterの仕様によりfirewalldのチェーンとINPUTチェーンの両方に通らないと破棄されてしまうので意味が無い。
firewalld.direct(5)にあるように、firewalldのバックエンドをnftablesからiptablesに変更してdirectルールを追加すると、 firewalldによる保護を受けつつip6greのパケットが疎通するようになる。
# grep ^FirewallBackend /etc/firewalld/firewalld.conf FirewallBackend=iptables # systemctl restart firewalld # firewall-cmd --direct --add-rule ipv6 filter INPUT 0 -p gre -j ACCEPT
拠点3つをGREトンネルのメッシュでつなぐ。LAN側ネットワークは相互に通信可能。
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 local 172.31.0.101 \ ipv4.method manual ip4 192.168.0.0/31 ipv4.routes 192.168.20.0/24 ipv6.method disabled # nmcli con add con-name tun2c ifname tun2c type ip-tunnel mode gre remote 172.31.0.103 local 172.31.0.101 \ ipv4.method manual ip4 192.168.0.2/31 ipv4.routes 192.168.30.0/24 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 local 172.31.0.102 \ ipv4.method manual ip4 192.168.0.1/31 ipv4.routes 192.168.10.0/24 ipv6.method disabled # nmcli con add con-name tun2c ifname tun2c type ip-tunnel mode gre remote 172.31.0.103 local 172.31.0.102 \ ipv4.method manual ip4 192.168.0.4/31 ipv4.routes 192.168.30.0/24 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 local 172.31.0.103 \ ipv4.method manual ip4 192.168.0.3/31 ipv4.routes 192.168.10.0/24 ipv6.method disabled # nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 local 172.31.0.103 \ ipv4.method manual ip4 192.168.0.5/31 ipv4.routes 192.168.20.0/24 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local 172.31.0.101 ttl inherit tun2c: gre/ip remote 172.31.0.103 local 172.31.0.101 ttl inherit # ip link show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 # ip link show dev tun2c 9: tun2c@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.103 # ip addr show dev tun2b 8: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 inet 192.168.0.0/31 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip addr show dev tun2c 9: tun2c@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.103 inet 192.168.0.2/31 scope global noprefixroute tun2c valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 100 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 100 192.168.0.0/31 dev tun2b proto kernel scope link src 192.168.0.0 metric 675 192.168.0.2/31 dev tun2c proto kernel scope link src 192.168.0.2 metric 676 192.168.20.0/24 dev tun2b proto static scope link metric 675 192.168.30.0/24 dev tun2c proto static scope link metric 676
拠点3つをGREトンネルのメッシュでつなぐ。LAN側ネットワークは相互に通信可能。
トンネルデバイスに設定するIPアドレスは、複数のトンネルデバイスで同じIPアドレスを使用できる。 また、物理ネットワークインタフェースのIPアドレスも使用できる。 この構成ではトンネルデバイスにeth1のIPアドレスを設定している。
# nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 local 172.31.0.101 \ ipv4.method manual ip4 192.168.10.1 ipv4.routes 192.168.20.0/24 ipv6.method disabled # nmcli con add con-name tun2c ifname tun2c type ip-tunnel mode gre remote 172.31.0.103 local 172.31.0.101 \ ipv4.method manual ip4 192.168.10.1 ipv4.routes 192.168.30.0/24 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 local 172.31.0.102 \ ipv4.method manual ip4 192.168.20.1 ipv4.routes 192.168.10.0/24 ipv6.method disabled # nmcli con add con-name tun2c ifname tun2c type ip-tunnel mode gre remote 172.31.0.103 local 172.31.0.102 \ ipv4.method manual ip4 192.168.20.1 ipv4.routes 192.168.30.0/24 ipv6.method disabled
# nmcli con add con-name tun2a ifname tun2a type ip-tunnel mode gre remote 172.31.0.101 local 172.31.0.103 \ ipv4.method manual ip4 192.168.30.1 ipv4.routes 192.168.10.0/24 ipv6.method disabled # nmcli con add con-name tun2b ifname tun2b type ip-tunnel mode gre remote 172.31.0.102 local 172.31.0.103 \ ipv4.method manual ip4 192.168.30.1 ipv4.routes 192.168.20.0/24 ipv6.method disabled
# ip tun gre0: gre/ip remote any local any ttl inherit nopmtudisc tun2b: gre/ip remote 172.31.0.102 local 172.31.0.101 ttl inherit tun2c: gre/ip remote 172.31.0.103 local 172.31.0.101 ttl inherit # ip link show dev tun2b 10: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 # ip link show dev tun2c 11: tun2c@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.103 # ip addr show dev tun2b 10: tun2b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.102 inet 192.168.10.1/32 scope global noprefixroute tun2b valid_lft forever preferred_lft forever # ip addr show dev tun2c 11: tun2c@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000 link/gre 172.31.0.101 peer 172.31.0.103 inet 192.168.10.1/32 scope global noprefixroute tun2c valid_lft forever preferred_lft forever # ip route default via 172.31.0.1 dev eth0 proto static metric 100 172.31.0.0/24 dev eth0 proto kernel scope link src 172.31.0.101 metric 100 192.168.20.0/24 dev tun2b proto static scope link metric 675 192.168.30.0/24 dev tun2c proto static scope link metric 676