NAT の内側だけでなく外側からもアクセス可能な NAT の背後にある iptables サーバー

NAT の内側だけでなく外側からもアクセス可能な NAT の背後にある iptables サーバー

私は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 にルーティングされます。

関連情報