私は2台のマシンを持っており、それぞれのマシンでKVMが動作しています。つまり、以下のネットワークを持つ2台のKVMです。
Host 1: 192.168.10.100 (eth2)
10.10.100.1 (virbr1)
KVM 1 (NAT with Host 1): 10.10.100.128 (eth0 inside kvm)
Host 2: 192.168.10.101 (eth2)
10.10.100.1 (virbr1)
KVM 2 (NAT with Host 2): 10.10.100.128 (eth0 inside kvm)
KVM はポート 6000 でサーバーをホストしています。KVM をクライアントとサーバーの両方として動作させたいと思います。たとえば、KVM1 はクライアントとして KVM2 上のサーバーと通信するか、KVM1 自身と通信するかを選択できます。この場合、KVM1 は 192.168.10.101 または 192.168.10.100 (KVM1 自身) に接続します。
このため、以下の iptables ルールを設定しましたが、KVM がそれ自体で実行されているサーバーと通信することができません。 不足しているリンクを解明するのを手伝ってくれる人はいませんか?
KVM1 と KVM2 の両方に以下のルールが設定されています (以下は私のボックスに表示される完全なルールです)。
デフォルトのテーブルでは、KVM のネットワークへの転送を設定しました。
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
114 7254 ACCEPT udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
314 103K ACCEPT udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
6810K 1271M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
43 2723 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8000
475 60252 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443
270 15588 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:111
35125 4776K ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:111
720 112K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4001
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:4001
6 328 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:564
6 500 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:564
14532 5776K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2049
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:2049
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4002
19070 1526K ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:4002
2900K 852M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6500flags: 0x17/0x02
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6550flags: 0x17/0x02
7294 379K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000
0 0 REJECT all -- eth0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
8574K 1767M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
934 642K ACCEPT all -- * * 0.0.0.0/0 10.10.100.0/24 state NEW,RELATED,ESTABLISHED
88 7740 ACCEPT all -- * virbr1 0.0.0.0/0 10.10.100.0/24 state RELATED,ESTABLISHED
533 39866 ACCEPT all -- virbr1 * 10.10.100.0/24 0.0.0.0/0
0 0 ACCEPT all -- virbr1 virbr1 0.0.0.0/0 0.0.0.0/0
4 240 REJECT all -- * virbr1 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- virbr1 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 8939K packets, 2177M bytes)
pkts bytes target prot opt in out source destination
NAT テーブルでは、PREROUTING でポート転送を設定し、kvm から仮想インターフェイスを出るすべてのパケットを MASQUERADE します。
Chain PREROUTING (policy ACCEPT 116K packets, 20M bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * !10.10.100.128 0.0.0.0/0 tcp dpt:8080 to:10.10.100.128:8080
0 0 DNAT tcp -- * * !10.10.100.128 0.0.0.0/0 tcp dpt:6002 to:10.10.100.128:6002
0 0 DNAT tcp -- * * !10.10.100.128 0.0.0.0/0 tcp dpt:6001 to:10.10.100.128:6001
0 0 DNAT tcp -- * * !10.10.100.128 0.0.0.0/0 tcp dpt:6000 to:10.10.100.128:6000
Chain INPUT (policy ACCEPT 114K packets, 20M bytes)
pkts bytes target prot opt in out source destination
54 16928 ACCEPT all -- * * 10.10.100.128 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 7539 packets, 410K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 7537 packets, 410K bytes)
pkts bytes target prot opt in out source destination
2 104 MASQUERADE all -- * virbr1 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 10.10.100.0/24 !10.10.100.0/24 masq ports: 1024-65535
0 0 MASQUERADE udp -- * * 10.10.100.0/24 !10.10.100.0/24 masq ports: 1024-65535
0 0 MASQUERADE all -- * * 10.10.100.0/24 !10.10.100.0/24
上記のルールでは、KVM1 は KVM2 上で実行されているサーバーと通信できますが、KVM1 自体で実行されているサーバーとは通信できません。これは、KVM のアドレスを持つソース パケットをすべて否定する上記の PREROUTING ルールのためです。
上記の PREROUTING ルールを次のように変更します。
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:x11 to:10.10.100.128:6000
この場合、問題は新しくなります。KVM1 から KVM2 へのすべての要求は、内部的に KVM1 にルーティングされます。