
これには困惑しました:
私は pfSense ファイアウォール (と呼ぶことにしますpfs
) を持っており、その背後には複数のサーバーがあります。パブリック IP から LAN 上のさまざまなサーバーに複数のサービスを問題なく NAT しています。
サーバーの1つ( と呼ぶことにします)で、( の)VM( と呼ぶことにします)s1
を実行しています。vagrant
libvirt
v1
公共ネットワークが設定され、DHCP サーバー192.168.1.159
経由でIP を取得します。pfs
ここで、の SSHpfs
にアクセスするためにに単純な NAT を設定し、でアクセスします。問題ありません。s1
<wan>:6622 -> s1:22
mydomain.com:6622
有効なsshユーザーでアクセスv1:22
(または同等の)することもできます192.168.1.159:22
LAN内から問題なく。
pfs
ここで、たとえばに単純なNATを追加します<wan>:6722 -> v1:22
。アクセスしようとしていますmydomain.com:6722
ではない仕事?!
目的は、さらに「別のレイヤー」を追加することです。つまり、 などのパブリック ポートを持つコンテナーを で実行し--publish 9980:80
、などの対応する NAT を使用して や からv1
としてそれらにアクセスします。v1:9980
mydomain.com:9980
pfs
<wan>:9980 -> v1:9980
LANからv1:9980
これも期待どおりに動作しています (つまり、 LAN からアクセスできます) が、NAT 経由pfs
は動作しません。
同じネットワーク内の異なるマシンで問題なく動作する同様の設定があります。 には別のlibvirt
VM (非 Vagrant ですが )もありs1
、パブリック IP 経由で NAT 経由で ssh できます。しかし、どういうわけか上記の方法はマシンでは機能せずvagrant
、この問題の原因が何なのかまったくわかりません。 (参考net.ipv4.forward
までに、 では有効にしていますv1
)。
編集:
vagrant
一歩近づきました。を使用して VMの最初の既存の NIC を削除しvirt-manager
、2 番目の VM をrtl8139
の代わりにに設定しvirtio
(その後再起動) ると、vagrant ssh
機能は失われますが、NAT は機能します。そこで疑問になるのが、vagrant
プロビジョニングを介して同様の構成にするにはどうすればよいかということです。つまり、パブリック ネットワークはデフォルトのインターフェイス上にある必要があるということですか?
答え1
解決:
原因は、vagrant
ローカルインターフェース(プライベートネットワーク)をプライマリとして必要とし(したがって設定し)、それをオーバーライドする標準的な方法がないことです。(一部の情報はここしかし、vagrant
人々は自分たち自身もこの話題に困惑していることを認めています...)
デフォルト ルートを微調整するという概念の (より堅牢な) バリエーションが解決策をもたらしました。私はansible
プロビジョナーを使用しており、以下を実行します (ゲスト上で、プロビジョニング プレイブックを介して)。
- name: remove wrong default route on eth0 (again)
shell: |
eval $(route -n | awk '$0~/[.0]{4}/ && $3~/[.0]{4}/ && $8~/eth0/ { printf "ip route del default via %s dev %s; ",$3,$8 }')
(興味深いことに、プロビジョニング スクリプトの開始時にネットワークが完全に起動していないため、2 回 (またはしばらくしてから?) 実行する必要があります。)
これにより、 のデフォルト ルートが削除されeth0
( はによってpublic_network
のみ に自動的に設定されます)、外部接続が期待どおりに動作するようになります。これはおそらく (推測ですが)、着信 NAT 要求への応答がデフォルトで のデフォルト ルート (デフォルトで優先されます) 経由でファイアウォールにルーティングされ、VM の で着信するため NAT FW が混乱するためと考えられます。したがって、 を削除すると、着信と同じインターフェイスで外部要求にデフォルトで応答します。eth1
vagrant
eth0
vagrant
eth1
eth0