web-dev-qa-db-ja.com

KVM Guest with NAT + Bridged networking

現在、ブリッジネットワークを備えた専用サーバーにいくつかのKVMゲストがいます(これは機能します)。ifconfigを介して割り当てた外部IPを(ゲスト内で)正常にpingできます。

ただし、パブリックipv4のIPアドレスが5つしかないため、次のような転送サービスを移植したいと思います。

hostip:port-> kvm_guest:port

[〜#〜] update [〜#〜]

KVMには「デフォルト」が付属していることを発見しましたNATインターフェースなので、仮想NICをゲストvirsh構成に追加しました次に、ゲストで構成します。IPアドレスがあります。

192.168.122.112

192.168.122.112に正常にpingを実行し、KVMホストから192.168.122.112のすべてのポートにアクセスできるので、次のようにポートフォワードを試みました。

iptables -t nat -I PREROUTING -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521
iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

telnet KVM_Host_IP 5222「試してみる」だけでハングアップする

telnet 192.168.122.112 2521機能

[root@node1 ~]# tcpdump port 5222
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
23:43:47.216181 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445777813 ecr 0,sackOK,eol], length 0
23:43:48.315747 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445778912 ecr 0,sackOK,eol], length 0
23:43:49.415606 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445780010 ecr 0,sackOK,eol], length 0

フィルターによって受信された7パケットカーネルによってドロップされた0パケット

[root@node1 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.0/24    state NEW,RELATED,ESTABLISHED 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   


[root@node1 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 976 packets, 57008 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   11   640 ACCEPT     all  --  *      *       0.0.0.0/0            192.168.122.0/24    state NEW,RELATED,ESTABLISHED 

Chain OUTPUT (policy ACCEPT 673 packets, 40901 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@node1 ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 549 packets, 34067 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 
    3   192 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5225 to:192.168.122.112:2521 
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 

Chain POSTROUTING (policy ACCEPT 45 packets, 3169 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 44 packets, 3105 bytes)
 pkts bytes target     prot opt in     out     source               destination         

すべての助けに感謝します。

ありがとう。

4
Daniel

この方法でkvmを実行する場合:

kvm -drive... -net nic -net tap .... 

tapX(Xは数字)という名前の新しいインターフェイス(ルートホスト内)になります。このインターフェイスは通常、デフォルトで/etc/etc/kvm/kvm-ifup/etc/qemu-ifupなど)のどこかにあるスクリプトを介して構成され、次のように変更できます:kvm -drive... -net nic -net tap,script=mynatbrigescript...

そこから、このインターフェイスを各ポイントで構成する必要があります。

ifconfig tapX 192.168.124.1/30

およびクライアントOS:

ifconfig eth0 192.168.124.2/30

したがって、(ルートホストで)ヒットすると、新しいローカルネットワークが表示されます(パブリックIPが1.2.3.4であると想定)。

ip r s
1.2.3.4 dev eth0 ...
192.168.124.0/30 dev tapX  proto kernel  scope link src 192.168.124.1

そこから、ルートホストから192.168.124.2にpingできる必要があります。次に、次のコマンドを使用して、着信TCPパケットをDNATできます。

iptables -t nat -A PREROUTING -i eth0 -d 192.168.122.31 --dport 5222 -j DNAT --to-destination 192.168.124.2:2521

SNAT反対方向の応答パケット:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.124.2 -j SNAT --to-source 192.168.122.31

ここで、ルートノードの場合、この作業は次のとおりです。

telnet 192.168.124.2 2521

次に、ローカルドメインから、これは同じことをする必要があります:

telnet 1.2.3.4 5222

ルートホストはIPパケットを転送する必要があります。これは次の方法で確認できます。

cat /proc/sys/net/ipv4/ip_forward 
1

または

sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

これは次のように設定できます。

echo 1 > /proc/sys/net/ipv4/ip_forward

または

sysctl net.ipv4.conf.all.forwarding=1
1
F. Hauri

まず、DNATルールを更新して、KVMホストの宛先IPを含める必要があります。そのままで、仮想マシンからインターネット(ポート5222)に向かうトラフィックでさえDNATtedを取得します。

iptables -t nat -F PREROUTING
iptables -t nat -A PREROUTING 1 -d KVM_Host_IP -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521

それ以外は、iptablesの設定は問題ないようです。私が提案できる唯一のことは、システムがIP転送を許可していることを確認することです。

sysctl -w net.ipv4.ip_forward=1

上記のコマンドを実行して問題が解決した場合は、/etc/sysctl.confを更新して、再起動後も保持されるようにする必要があります。

他の人が示唆しているように、KVMホストでtcpdump -nn -i any port 5222 or port 2521を実行すると、パケットが転送されているかどうかのヒントが得られます。telnet KVM_Host_IP 5222を試すと、2つ表示されます。パケット。1つはKVM_Host_IP.5222に行き、もう1つは192.168.122.112.2521に行きます。

0
chutz