1つの外部IPアドレスを持つサーバーがあります(例:_1.2.3.4
_)。そのサーバーでlibvirtを使用して仮想マシンを実行します。次に、外部からssh(_port 1234
_)を介してホスト上の仮想サーバーにアクセスしたいと思います。
私のホストシステムでは、外部IP(_eth0
_)に接続されているネットワークインターフェイス_1.2.3.4
_を取得しました。
私の仮想マシンは、_virbr0
_と呼ばれるnatインターフェースを介してホストマシンにip _192.168.122.235
_で接続されています。
ポートを転送する必要があるので、iptable
で次のようにしました
_iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 1234 -j DNAT --to-destination 192.168.122.235:1234
_
_iptables -A FORWARD -p tcp -d 192.168.122.235 --dport 1234 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
_
基本的なネットワーキングでは、ホストでUFW
を実行しても_port 1234
_が許可されます。
_Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), allow (routed)
New profiles: skip
To Action From
-- ------ ----
[SOMEOTHERPORTS]
1234/tcp ALLOW IN Anywhere
1234/tcp (v6) ALLOW IN Anywhere (v6)
_
関係するすべてのネットワークインターフェイスで転送が許可されていることを確認しました。
_user@someserver ~ # cat /proc/sys/net/ipv4/conf/virbr0/forwarding
1
user@someserver ~ # cat /proc/sys/net/ipv4/conf/eth0/forwarding
1
_
外部ネットワークから_1.2.3.4
_にssh経由でサーバーに接続しようとすると、次のようになります。
_ssh: connect to Host 1.2.3.4 port 1234: Connection refused
_
完全に機能しているホストからのssh接続を確認しました。
考慮すべき点がいくつかあります。
ここで何が悪いのですか?
現在のiptables設定を見てみましょう。次に、それを調べます。
UFWはiptablesに干渉しますか?
UFWはiptablesのコマンドラインフロントエンドですが、iptablesの機能の多くが不足しています。 iptables構成があると、入力したコマンドに基づいてUFWが何をしたかがわかります。ただし、同じコンピューター上で両方を使用してルールを作成しないでください。それは合併症を求めています。 UFWでコマンドを入力する予定がある場合は、iptablesスクリプトを無効にする必要があります。 iptablesにコマンドを入力する場合は、UFWを削除する必要があります。
どうすればこれを機能させることができますか?
これを試して。
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 1234 -j DNAT --to 192.168.122.235:1234
iptables -A FORWARD -i eth0 -o vibr0 -p tcp --dport 1234 -j ACCEPT
ただし、ゲストはNAT=アダプターを使用してホストに接続されているため、これはおそらく機能しません。
本当に考慮すべきことは、アダプターの種類をNATからブリッジに変更することです。
また、ブリッジ接続を使用する必要があると思います。
ネットワークの名前を調べてみてください。
virsh net-edit <network name>
Virt Managerで確認できるネットワークの名前。通常はデフォルトです:
virsh net-edit default
NAT=からbridge(また、Virt Managerにあるブリッジ名)に変更します)
<network>
<name>default</name>
<uuid>cc45a671-e8d8-4149-a6a5-8d5547551a58</uuid>
<forward mode='route'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='AA:CC:DD:86:53:54'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
備考:
この例では、DHCPを使用してVMに名前を付けました。静的な設定もできます
Ifconfigを使用すると、次のようになります。
virbr0 Link encap:Ethernet Hardware Adresse AA:VV:CC:86:53:54
inet Adresse:192.168.122.1 Bcast:192.168.122.255 Maske:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1 RX-Pakete:127 Fehler:0 Verloren:0Überläufe:0 Fenster:0 TX- Pakete:44 Fehler:0 Verloren:0Überläufe:0Träger:0 Kollisionen:0Sendewarteschlangenlänge:0 RX-Bytes:13032(13.0 KB)TX-Bytes:4707(4.7 KB)
基本的に、sshにはポート22を使用する必要があります
使用してみてください:
Sudo iptables -t nat -A POSTROUTING -s 192.168.122.235 -j SNAT --to-source 1.2.3.4
したがって、ポートに問題がある場合は、ローカライズできます。実際、VMのポートをGufwで閉じると、.
ほぼ同じ問題が発生しました。 NATネットワークを使用して、ホストマシンからKVMを実行しているVMにポート22を転送したいと思いました。
私はこの投稿を見つけました: https://ubuntuforums.org/showthread.php?t=2261173&p=13210545#post13210545
私には答えがありました。
TL; DR
192.168.1.161は、内部ネットワーク上のサーバーのIPです。 192.168.122.2は、ホスト上の私のVMのIPです。
iptables -t nat -I PREROUTING -p tcp -d 192.168.1.161 --dport 22 -j DNAT --to-destination 192.168.122.2:22
iptables -I FORWARD -m state -d 192.168.122.2/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
免責事項。これが正確に何をするのか私にはわかりません。他の多くの回答と同じように見えますが、パラメータタグの一部がわずかに異なっています。
これらはかなり順調な私の転送ルールです。
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
-A POSTROUTING -s 192.168.122.0/24 -o br1 -j MASQUERADE
-A INPUT -s 192.168.122.0/24 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j ACCEPT
-A FORWARD -i br1 -o virbr0 -j ACCEPT