EVE-NGで外部へのアクセスを行うには

2020年12月6日

EVE-NGでは仮想ラボ環境からEVENGをインストールしているホストのIF経由して外部環境へアクセスすることが可能です。例えば物理サーバにEVE-NGをインストールしている場合、外部のネットワークや機器と物理NIC経由で接続することが可能です。VM環境であれば、EVE-NGをインストールしたVMと仮想スイッチ経由で接続することができます。

これによって、仮想ラボ機ラボ外の物理や仮想アプライアンスと連携したり、インターネットにアクセスしてSaaSの連携や、Linuxであればパッケージの更新なども行うことが可能です。

これらの方法は公式Cookbook ”EVE Clouds and Networks"に記載されていますので、このドキュメントの情報をもとに外部アクセスへの方法をご紹介したいと思います。なおホスト環境(物理、VM、クラウド)によって外部アクセスする際の注意点もことなってきますので、これらについてもご紹介したいと思います。

仮想ラボ環境から外部環境へのアクセス

EVE-NGのラボから外部へアクセスするには、基本的にネットワークオブジェクト「Cloud」を利用します。

左側のメニューから"Add an object" -> “Network"を選択

ネットワークオブジェクトは、以下のように「bridge」と「Cloud」の2種類あります。

ネットワークオブジェクト

「bridge」は、スイッチの形をしたオブジェクトで、ラボに配置し仮想ノードを繋げば、仮想ノード間をL2接続してくれます。bridgeオブジェクトの実態はそのままlinux bridgeです。

bridge オブジェクト

「Cloud」は、雲の形をしたオブジェクトで、「bridge」と同様にCloudオブジェクトを配置し仮想ノードを接続すると、仮想ノード間にL2接続を提供します。実態もlinux bridgeとなります。

Cloud オブジェクト

「Cloud」と「bridge」と異なる点は、「Cloud」にはそれぞれのIDに該当するホスト上のインタフェース(eth)が、bridge IFとして接続されている点です。

つまり、インタフェースが外部接続されている環境であれば、「Cloud」に仮想ノードを接続することで、仮想ノードと外部環境を接続することができます。

図にすると、以下のようなイメージとなります。

イメージ図

例えば、物理マネージメントネットワークに仮想ノードを接続したい場合、以下の図のように、Cloud0を配置し仮想ノードを接続すればOKです(eth0の先にマネジメントネットワークがある前提です)。

構成例

さて、EVE-NGで外部アクセスするには「Cloud」オブジェクトを使うことが基本となるのですが、ホスト環境によっては、外部アクセスする際に少し癖があるものもあります。この点について触れておきたいと思います。

ESXi環境の場合

ESXi環境の場合、インスタンスの接続先はESXiのvSwitchになります。

注意すべき点としては、vSwitchの設定変更が必要であることです。vSwitchの設定画面からPromiscuous mode -> Accept、と設定する必要があります。

Promiscuous mode Rejectとなっている場合には、仮想ノードと通信できないようですのでご注意ください。

GCP環境の場合

GCP環境の場合、インスタンスの接続先はGCPの内部ネットワークになりますが、この内部ネットワークには注意しないといけません。なぜなら単純なL2/L3環境ではなさそうだからです。例えばGCPのマネジメントネットワークに仮想ノードを接続させようと、仮想ノードをCloud0に接続しても、GCPの内部ネットワークからはアドレスは払い出されないようです。

そもそもインスタンスに払い出されるIPアドレスは/32と特殊であり、これは内部のSDNの仕様なんだろうと推測します。GCPインスタンス上でEVE-NGを使うと外部との接続はできないのか。。なんとかしたい(この時はLinuxサーバのapt upgradeしたかったです)。外部接続今回はこの辺の仕様を追うよりも、他の方法で外部アクセスできないか検討してみました。それが以下の2つのNAT形式による対応です。

プロフェッショナル版 – Nat Cloud

まず有料のプロフェッショナル版のほうにはNat Cloudという機能があり、こちらを使うことで外部アクセスできるようです(私は使ってないので動作未確認です)。なるほど、NATを使えばGCPでも外部と通信できるかもしれませんね。

各エディションの機能: https://www.eve-ng.net/features/compare

自家製 – NAT Cloud スクリプト

NATで外部アクセスできるかもしれないと、ということがわかりましたので、頑張って「簡単なNATスクリプト」を作成してみました。スクリプトは以下の通りです。

sudo -s
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
iptables -A FORWARD -i pnet0 -o pnet9 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i pnet9 -o pnet0 -j ACCEPT

ip addr add 192.168.1.1/24 dev pnet9
dnsmasq --dhcp-range=192.168.1.10,192.168.1.30,12h

インスタンスにスクリプトを流し込んだ後、ネットワークオブジェクトのCloud9(pnet9)にノードを接続すれば、DHCPサーバ(dnsmasq)から192.168.1.x/24 でアドレスが払い出され、Cloud0(pnet0)のNAT経由でインターネットや他インスタンスへのアクセスが可能という想定です。以下の図のようなイメージとなります。

イメージ図

実際に外部ネットワークへアクセスできるか試したところ、意外に一発で動作してくれました。以下の通り仮想ラボのネットワークからPublic DNSに通信できることを確認しています。

Nexus9000vとLinuxサーバから外部へPing
CloudのTypeはCloud 9を指定

あとは “/etc/rc.local" などにスクリプトを書き込んでおくと、EVE-NGを起動時に、自動でNAT Cloudが起動するようになります。少なくともバージョン(v2.0.3-95)では動作しています。もし動かないようなことがあればコメントでお知らせいただけると幸いです。