我有 2 台服务器,我需要转发到内部端口。
为了解释,我使用具有 2 个接口(内部/外部)的服务器作为服务器 A,将内部服务器用作服务器 B。
在服务器 A 中我使用
iptables -A PREROUTING -t nat -i $extif -p tcp --dport $extif_port -j DNAT --to-destination $dst_ip:$dst_port"
iptables -A FORWARD -t filter -d $dst_ip -j ACCEPT"
iptables -A POSTROUTING -t nat -p tcp -s $dst_ip --sport $dst_port -j SNAT --to-source $extif_ip"
在服务器 BI 中使用 fwmark 并使用 fwmark 和 iproute2 路由到服务器 A:
ip rule $command fwmark 1 lookup 1
ip route $command default via $rt_ip table 1
--
iptables -A PREROUTING -t mangle -p tcp -i $intif ! -s $intif_net --dport $port -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -p tcp -i $intif -s $intif_ip --sport $port -j MARK --set-mark 1
iptables -A POSTROUTING -t mangle -p tcp -o $intif -s $intif_ip --sport $port -j MARK --set-mark 1
在服务器 B 中使用上面的三个规则,连接只停留在 SYN_RECV 状态,并且在日志中没有在连接中发送 ACK,在某些部分内部数据包丢失,但我不知道为什么。
欢迎任何帮助,祝你有美好的一天。
我在 B 服务器中使用 CONNMARK 解决了这个问题。
使用伪装它工作得很快,但因为是一个网络服务器,我需要原始 IP 地址和伪装将源 IP 更改为我的 A 服务器的 $intif_ip,所以我不能使用伪装。
因为我没有使用 iptables 做防火墙,所以我放弃了 FOWRARD 链规则,所以我在 A 服务器中只有 DNAT 和 SNAT 规则。
然后在 B 服务器中我遇到了问题,因为它没有路由数据包,我尝试了 1001 种方法来强制使用服务器 A 的 $intif_ip 作为网关,但最终我找到了!
理论是将 MARK 应用于数据包,并且他的流进入被 fwmark 统治的网关的 ip,但是它在路由决策中失去了 mar,所以我开始使用 CONNMARK 来保存这个 fwmark。
当使用 CONNMARK 时它无论如何都不起作用,直到 y 记录所有链。自从我读到 CONNMARK 后,这些示例恢复了 mangle 的 POSTROUTING 链中的规则,但遍历的第一个链是 mangle 的输出。因此,我将 CONNMARK 更改为 mangle 的 OUTPUT 链,并且效果很好。
这是服务器 B 的规则集。
和 iproute2 命令(服务器 B)
希望这可以帮助您解决这个奇怪的问题。祝你今天过得愉快。
我看到了一些错误使用 CONNMARK 目标的答案。在 mangle 链中使用 MARK 目标,它应该可以工作。