不幸的是,我们有一个客户端硬编码设备指向一个特定的IP和端口。 我们希望将stream量从他们的IPredirect到负载均衡器,负载均衡器会将HTTP POST发送到能够处理该请求的服务器池。 我希望所有其他IP的现有stream量不受影响。
我相信iptables是完成这个最好的方法,我认为这个命令应该工作:
/ sbin / iptables -t nat -A PREROUTING -s $ CUSTIP -j DNAT -p tcp –dport 8080 -d $ CURR_SERVER_IP – 到目标$ NEW_SERVER_IP:8080
不幸的是,它没有按预期工作。 我不确定是否需要添加另一个规则,可能在POSTROUTING链中?
下面我用上面的variablesreplace了真实的IP地址,并试图在testing环境中以增量的步骤复制布局。
$ CURR_SERVER_IP = 192.168.2.11
$ NEW_SERVER_IP = 192.168.2.12
$ CUST_IP = 192.168.0.50
/ sbin / iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 –dport 16000 -j DNAT – 到目的地192.168.2.11:8080
完全按照预期工作。
/ sbin / iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 –dport 16000 -j DNAT – to-destination 192.168.2.12:8080
连接似乎超时。
/ 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
我已经添加了接受规则@Massimobuild议,但仍然没有看到任何成功。
我开始新鲜并运行以下命令:
# /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
规则现在看起来像:
# 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
和
# 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
有没有人看到明显的问题,会导致浏览器超时,当我去http://192.168.2.11:16000 ?
谢谢,
您的NAT规则似乎没问题,但是您是否也为此stream量添加了“接受”规则?
否则,NAT将踢得很好,但是这样的结果会悄无声息地被丢弃。
您需要在FORWARD链中使用此规则(这是处理通向防火墙但与其无直接关系的数据包的地方)。
FORWARD规则在 PREROUTING规则(如NAT) 之后应用,所以当应用这个规则时,数据包将显示为来自原始IP,但是指向修改后的新的目的地IP。 这个规则应该是这样的:
/sbin/iptables -A FORWARD -s $CUSTIP -d $NEW_SERVER_IP -j ACCEPT
(这里最严重的问题之一是人们不知道如何提问,这使得Serverfault.com看起来像Guesswhatfault.com)。
在你的问题没有说布特拓扑 ,唉。 我们不知道您的服务器是否可以覆盖您的客户端 – 实际上,它们位于不同的子网中。 您的客户是否认为服务器可达是另一个问题。 您可以尝试使用MASQUERADE / SNAT来更改客户的IP,或者想一些如何解释您的问题。
我假设你正在使用Linux的盒子作为路由器,而这个Linux的盒子可以看到新的IP。
我相信只有当/ proc / sys / net / ipv4 / ip_forward设置为1时,NAT表才会启动。为了保持这种持久性,请将以下行放在/etc/sysctl.conf中:
net.ipv4.ip_forward = 1
我发表了一个类似的问题,并find了我自己的答案。 链接在这里 : –
如何使用iptables将请求转发到运行在不同机器上的jBoss服务器?
有一个sysctl设置防止dnat回环。 将下面的eth0replace为您的外部接口stream量正在进入。
允许它
sysctl -w net.ipv4.conf.eth0.route_localnet=1 要么
echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet 并检查设置。
cat /proc/sys/net/ipv4/conf/eth0/route_localnet 现在你可以dnat到127.0.0.1