![iptables 端口转发](https://linux22.com/image/524697/iptables%20%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91.png)
我正在尝试做一些简单的 TCP 端口转发
[root@wcmisdlin02 ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@wcmisdlin02 ~]# /bin/echo 1 > /proc/sys/net/ipv4/ip_forward [root@wcmisdlin02 ~]# cat /proc/sys/net/ipv4/ip_forward 1 [root@wcmisdlin02 ~]# iptables --list 链输入(策略接受) 目标 保护 优化 源 目标 RH-Firewall-1-INPUT 全部 -- 任何地方 任何地方 链转发(策略接受) 目标 保护 优化 源 目标 RH-Firewall-1-INPUT 全部 -- 任何地方 任何地方 链输出(策略接受) 目标 保护 优化 源 目标 链 RH-Firewall-1-INPUT(2 个引用) 目标 保护 优化 源 目标 接受所有 -- 任何地方 任何地方 接受 icmp -- 任何地方 任何地方 icmp 任何 接受 esp -- 任何地方 接受啊--任何地方任何地方 接受 udp -- 任何地方 224.0.0.251 udp dpt:mdns 接受 udp -- 任何地方 udp dpt:ipp 接受 tcp -- 任何地方 任何地方 tcp dpt:ipp 接受所有 -- 任何地方任何地方状态 关联企业,已建立 接受 tcp -- 任何地方任何地方状态新 tcp dpt:mysql 接受 tcp -- 任何地方任何地方状态新 tcp dpt:ssh 接受 tcp -- 任何地方任何地方状态新 tcp dpt:http 接受 tcp -- 任何地方任何地方状态新 tcp dpt:ftp 接受 tcp -- 任何地方任何地方状态新 tcp dpt:https 拒绝所有--任何地方 拒绝与 icmp 主机禁止 [root@wcmisdlin02 ~]# iptables --table nat --append PREROUTING --proto tcp --dport 80 --jump DNAT --to 10.52.208.223:80 [root@wcmisdlin02 ~]# iptables --table nat --list PREROUTING 链 PREROUTING(策略接受) 目标 保护 优化 源 目标 DNAT tcp——任意位置任意位置的 tcp dpt:http 至:10.52.208.223:80 [root@wcmisdlin02 ~]# curl --verbose http://10.52.208.221:80 * 即将连接()10.52.208.221 端口 80 * 尝试 10.52.208.221... 连接被拒绝 * 无法连接到主机 * 关闭连接#0 curl:(7)无法连接到主机 [root@wcmisdlin02 ~]#
答案1
您正在将流量发送到 10.52.208.221。根据您发布的配置,您的问题在于 Web 服务器,而不是防火墙。您的规则看起来是正确的。FORWARD 和 INPUT 被重定向到 RH-Firewall-1-INPUT,其中您的第一条规则是允许所有流量。正如其他人指出的那样,您可能允许 eth1 上的所有流量,而实际上世界流量来自 eth0。其次,您必须在流量返回世界时对其进行 NAT
iptables --table nat --append POSTROUTING --proto tcp --dport 80 --jump MASQUERADE -o OUT_INTERFACE
来自路由器的流量永远不会到达输入或转发链,而是通过输出链到达 Web 服务器。该子网中的其他系统同样会直接到达 Web 服务器。但是,世界上的其他系统将通过 INPUT / FORWARD 链,并且需要 SNAT 和 DNAT,这样在世界上看起来就是一台机器。您仍然无法从网络内部进行测试。您必须从 Web 服务器的对面接口进行测试。请告诉我您的 IP 地址,我会告诉您正确的配置。
答案2
连接被拒绝意味着至少有一台主机正在接受 TCP 数据包,但没有服务正在侦听该端口。当您从不同的 IP 连接到 10.52.208.221:80 和 10.52.208.223 时会发生什么?
我现在无法测试,但我已经看到过一些情况,从 IP 表设置为 NAT 的 IP 的主机进行连接不起作用。我不确定这里是否是这种情况,因为您没有明确定义应用规则的接口,但我见过一些情况,Linux 将您要连接的 IP 视为“本地”,并使用环回接口并跳过 iptables。
无论如何,你能从盒子外面尝试一下吗?