【问题标题】:Can't connect to external IP from local network behind iptables NAT无法从 iptables NAT 后面的本地网络连接到外部 IP
【发布时间】:2016-11-29 13:54:54
【问题描述】:

我们有几个虚拟机的 Proxmox 虚拟环境。主机服务器有多个外部 IP 地址。我们使用 iptables 将特定外部 IP+端口的连接转发到选定的虚拟机。我们使用 NAT 进行来自 VM 的传出连接。

到目前为止一切正常。当虚拟机尝试连接到主机外部 IP 时会出现问题,但它无法正常工作。

据我了解,我们需要的是发夹式 NAT(NAT 反射)。但是我们无法按照我们找到的说明让它工作。

我们的 iptables 规则:

# === FIREWALL ===
*filter
:INPUT ACCEPT [3174:1555907]
:FORWARD ACCEPT [2521:547542]
:OUTPUT ACCEPT [2753:2039466]
:fail2ban-ssh - [0:0]

# allow returnig packets
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# drop all other
-A INPUT -p tcp -d 1.2.3.4/32 -j DROP

COMMIT

# === NAT ===

*nat
:PREROUTING ACCEPT [140854:7345476]
:POSTROUTING ACCEPT [2635:170444]
:OUTPUT ACCEPT [25596:1617170]

# INCOMING
-A PREROUTING  -d 1.2.3.4/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.60.10:80
-A PREROUTING  -d 1.2.3.4/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.60.10:443
-A PREROUTING  -d 1.2.3.4/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.0.60.20:80

# OUTGOING
-A POSTROUTING -d 10.0.60.10 -s 10.0.0.0/16 -p tcp --dport 80 -j SNAT --to 10.0.0.1
-A POSTROUTING -o vmbr0 -j SNAT --to-source 1.2.3.4

COMMIT

1.2.3.4 - 主机的外部 IP

10.0.60.10、10.0.60.20 - 虚拟机的内部 IP

10.0.0.1 - 主机的内部 IP

【问题讨论】:

    标签: linux networking iptables nat proxmox


    【解决方案1】:

    解决了!我是错字了。

    这是发夹式 NAT 的有效解决方案:

    # === FIREWALL ===
    *filter
    :INPUT ACCEPT [3174:1555907]
    :FORWARD ACCEPT [2521:547542]
    :OUTPUT ACCEPT [2753:2039466]
    :fail2ban-ssh - [0:0]
    
    # allow returnig packets
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    # drop all other
    -A INPUT -p tcp -d 1.2.3.4/32 -j DROP
    
    COMMIT
    
    # === NAT ===
    
    *nat
    :PREROUTING ACCEPT [140854:7345476]
    :POSTROUTING ACCEPT [2635:170444]
    :OUTPUT ACCEPT [25596:1617170]
    
    # INCOMING
    -A PREROUTING  -d 1.2.3.4/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.60.10:80
    -A PREROUTING  -d 1.2.3.4/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.60.10:443
    -A PREROUTING  -d 1.2.3.4/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.0.60.20:80
    
    # OUTGOING
    -A POSTROUTING -s 10.0.0.0/16 -d 10.0.0.0/16 -p tcp -j SNAT --to-source 10.0.0.1
    -A POSTROUTING -o vmbr0 -j SNAT --to-source 1.2.3.4
    
    COMMIT
    

    【讨论】:

      【解决方案2】:
      iptables -A POSTROUTING -t nat -s 10.0.0.0/16 -d 1.2.3.4 -j MASQUERADE
      

      【讨论】:

      • 也不起作用。我已经尝试过类似的规则(仅对所有虚拟机使用 -s 10.0.0.0/16)
      • 然后使用iptables -A PREROUTING -t nat -s 10.0.0.0/16 -d 1.2.3.4 -j DNAT --to 10.0.60.10(错误)
      • 这应该替换吗? -A PREROUTING -d 1.2.3.4/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.60.10:80
      • 重点是我还需要基于端口的不同规则。这不在我的示例中,但我需要将到 8080 的连接转发到不同的机器,而不是到 80 的连接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2020-12-17
      • 1970-01-01
      • 2016-01-11
      • 2011-07-01
      • 1970-01-01
      • 2014-04-11
      相关资源
      最近更新 更多