如何使用iptables将来自端口80的入站外部stream量NAT到本地不同的端口?

我有一个Tomcat在127.0.0.1:8780上监听的单个盒子,我只是希望所有的HTTPstream量都被redirect到那个端口。 它从本地主机运行,但不是来自同一(虚拟)局域网中的另一台机器。

目前我故意允许所有入站stream量来find正确的NATconfiguration,稍后我打算开始阻塞一些端口,并保持HTTP 80打开状态。

 root @ box1:〜$ netstat -tulpn
活动的Internet连接(仅限服务器)
原始Recv-Q发送-Q本地地址外部地址状态PID /程序名称
 tcp 0 0 127.0.0.1:8780 0.0.0.0:* LISTEN 779 / java               
 udp 0 0 0.0.0.0:29411 0.0.0.0:* 419 / dhclient    
 udp 0 0 0.0.0.0:68 0.0.0.0:* 419 / dhclient    
 udp6 0 0 ::: 56705 ::: * 419 / dhclient    
 iptables -N RULE_0
 iptables -A OUTPUT -m状态 - 状态NEW -j RULE_0
 iptables -A INPUT -m状态 - 状态NEW -j RULE_0
 iptables -A FORWARD -m状态 - 状态NEW -j RULE_0
 iptables -A RULE_0 -j LOG  - 日志级信息 - 日志前缀“RULE 0  -  ACCEPT”
 iptables -A RULE_0 -j ACCEPT

 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT  - 到8780
 iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT  - 到端口8780
 root @ box1:〜#iptables -L
连锁input(政策接受)
目标人select源目的地         
 RULE_0所有 - 任何地方任何地方状态新

连锁FORWARD(政策接受)
目标人select源目的地         
 RULE_0所有 - 任何地方任何地方状态新

链式输出(策略ACCEPT)
目标人select源目的地         
 RULE_0所有 - 任何地方任何地方状态新

链RULE_0(3参考)
目标人select源目的地         
 LOG全部 - 任何地方的任何地方LOG级别信息前缀“RULE 0  -  ACCEPT”
 LOG全部 - 任何地方的任何地方LOG级别信息前缀“RULE 0  -  ACCEPT”
随时随地接受            
 root @ box1:/ etc / halo#nc localhost 80;  echo $?
 0
 usr @ box2:〜$ nc box1 80;  echo $?
 box1 [192.168.56.100] 80(http):连接超时
 1
 usr @ box2:〜$ ping box1 PING box1(192.168.56.100)56(84)字节的数据。 来自box1(192.168.56.100)的64个字节:icmp_seq = 1 ttl = 63时间= 0.985ms来自box1(192.168.56.100)的64个字节:icmp_seq = 2ttl = 63时间= 0.972ms来自box1的64字节(192.168.56.100): icmp_seq = 3 ttl = 63时间= 0.945 ms来自box1的64字节(192.168.56.100):icmp_seq = 4 ttl = 63时间= 0.905 ms ^ C --- box1 ping统计---发送了4个数据包,接收到了4个数据,分组丢失,时间3003ms rtt min / avg / max / mdev = 0.905 / 0.951 / 0.985 / 0.048ms 

你的tomcat监听本地主机: 127.0.0.1:8780 : 127.0.0.1:8780 ,而你尝试连接到box1 ,它具有不同的IP地址: 192.168.56.100

 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 127.0.0.1:8780 echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet 

eth0是你的外部接口。