如何配置从硬编码到 IP 的特定 IP 的流量以使用 iptables 转发到另一个 IP:PORT?

ccl*_*ark 7 networking iptables port-forwarding

不幸的是,我们有一个客户端硬编码了一个设备以指向特定的 IP 和端口。我们希望将流量从他们的 IP 重定向到我们的负载均衡器,负载均衡器会将 HTTP POST 发送到能够处理该请求的服务器池。我希望来自所有其他 IP 的现有流量不受影响。

我相信 iptables 是实现这一目标的最佳方式,我认为这个命令应该可以工作:

/sbin/iptables -t nat -A PREROUTING -s $CUSTIP -j DNAT -p tcp --dport 8080 -d $CURR_SERVER_IP --to-destination $NEW_SERVER_IP:8080
Run Code Online (Sandbox Code Playgroud)

不幸的是,它没有按预期工作。我不确定是否需要在POSTROUTING链中添加另一条规则?

下面我用真实的 IP 替换了上面的变量,并尝试在我的测试环境中逐步复制布局。

$CURR_SERVER_IP = 192.168.2.11  
$NEW_SERVER_IP = 192.168.2.12  
$CUST_IP = 192.168.0.50  
Run Code Online (Sandbox Code Playgroud)

完全按预期工作。

连接似乎超时。

  • 限制 IP 和端口转发仅应用于来自特定 IP 的请求

    /sbin/iptables -t nat -A PREROUTING -p tcp -s 192.168.0.50 -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080
    
    Run Code Online (Sandbox Code Playgroud)

我已经ACCEPT按照@Massimo 的建议添加了规则,但仍然没有看到任何成功。

我重新开始并运行了以下命令:

# /sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080   
# iptables -A FORWARD -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

规则现在看起来像:

# iptables -L  -v --line-numbers  (see FORWARD rule 7)

Chain INPUT (policy ACCEPT 1115M packets, 889G bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:domain   
2        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:domain   
3        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:bootps   
4        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:bootps   

Chain FORWARD (policy ACCEPT 112 packets, 5936 bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     all  --  any    virbr0  anywhere             192.168.122.0/24    state RELATED,ESTABLISHED 
2        0     0 ACCEPT     all  --  virbr0 any     192.168.122.0/24     anywhere              
3        0     0 ACCEPT     all  --  virbr0 virbr0  anywhere             anywhere              
4        0     0 REJECT     all  --  any    virbr0  anywhere             anywhere            reject-with icmp-port-unreachable 
5        0     0 REJECT     all  --  virbr0 any     anywhere             anywhere            reject-with icmp-port-unreachable 
6        0     0 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
7        6   336 ACCEPT     all  --  any    any     anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 813M packets, 428G bytes)
num   pkts bytes target     prot opt in     out     source               destination         
Run Code Online (Sandbox Code Playgroud)

# iptables -L -t nat -v --line-numbers
Chain PREROUTING (policy ACCEPT 3108K packets, 242M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  any    any     anywhere             192.168.2.11 tcp dpt:16000 to:192.168.2.12:8080 

Chain POSTROUTING (policy ACCEPT 13M packets, 790M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     8644 1979K MASQUERADE  all  --  any    any     192.168.122.0/24     anywhere            

Chain OUTPUT (policy ACCEPT 13M packets, 792M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
Run Code Online (Sandbox Code Playgroud)

有没有人看到我访问http://192.168.2.11:16000时会导致浏览器超时的明显问题?

Mas*_*imo 2

您的 NAT 规则似乎没问题,但是您是否还为此流量添加了 ACCEPT 规则?

否则,NAT 会很好地启动,但随后生成的数据包将默默地被丢弃......


更新:

您需要在转发链中使用此规则(这是处理通过防火墙但与防火墙不直接相关的数据包的地方)。

FORWARD 规则在 PREROUTING 规则(如 NAT)之后应用,因此应用此规则时,数据包将显示为来自原始 IP,但定向到修改后的新目标 IP。因此,规则应该有点像这样:

/sbin/iptables -A FORWARD -s $CUSTIP -d $NEW_SERVER_IP -j ACCEPT
Run Code Online (Sandbox Code Playgroud)