NAT 后面的 iptables 服务器可以从外部以及 nat 内部访问

NAT 后面的 iptables 服务器可以从外部以及 nat 内部访问

我有 2 台机器,每台机器上都运行一个 KVM - 所以两个 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 将连接到 192.168.10.101 或 192.168.10.100(本身)

为此,我设置了以下 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 和 MASQUERADE 中设置了端口转发,所有数据包均从 kvm 离开虚拟接口:

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 上运行的服务器通信,但不能与自身运行的服务器通信。这是因为上面的 PREROUTING 规则否定了具有 KVM 地址的任何源数据包。

如果我将上述 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!

相关内容