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 上
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.11:8080
Run Code Online (Sandbox Code Playgroud)
完全按预期工作。
IP 和端口转发到不同的机器
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080
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时会导致浏览器超时的明显问题?
您的 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)
归档时间: |
|
查看次数: |
19259 次 |
最近记录: |