tcp - 端口重定向不适用于 IPtables

标签 tcp iptables istio

我们正在努力将 istio 入口网关与 NLB 结合使用,默认情况下入口网关在节点端口(范围 30000-32767)上运行,这意味着更高的端口。

但是我们现有的安全组规则配置为端口 80-443,并且我们有很多具有许多源 IP 的规则,我们几乎达到了安全组规则限制。所以我们不能对 31380 和 31390 端口有更多的规则。我们还需要一种方法来将相同的安全组与入口网关和 NLB 结合使用。

作为一种解决方案,我们计划使用 Linux iptables 进行端口重定向,它将通过 minion NLB 重定向到达端口 80 和 443 的内容,并将路由到 31380 和 31390(入口网关节点端口)

但我正在努力做到这一点,并且端口重定向未正确发生,并且我看不到任何数据包通过 NLB 命中入口网关。

我在我的工作节点中配置了以下 iptables 规则,

iptables -A INPUT -p tcp -m tcp --dport 31380 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 31380 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:31380

但是当我尝试从另一个实例到达此 Minion 的端口 80(入口网关也在同一节点中)时,我收到以下错误,

$ curl -v 10.1.29.77

* Rebuilt URL to: 10.1.29.77/
*   Trying 10.1.29.77...
* TCP_NODELAY set
* connect to 10.1.29.77 port 80 failed: Connection refused
* Failed to connect to 10.1.29.77 port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 10.1.29.77 port 80: Connection refused

但是我可以从同一个实例访问节点端口,

$ curl -v 10.1.29.77:31380
* Rebuilt URL to: 10.1.29.77:31380/
*   Trying 10.1.29.77...
* TCP_NODELAY set
* Connected to 10.1.29.77 (10.1.29.77) port 31380 (#0)
> GET / HTTP/1.1
> Host: 10.1.29.77:31380
> User-Agent: curl/7.61.1
> Accept: */*
> 
< HTTP/1.1 404 Not Found
< date: Tue, 30 Jun 2020 12:52:17 GMT
< server: istio-envoy
< content-length: 0

你们对此有什么想法吗?

最佳答案

您正在使用OUTPUT链。这是从服务器内部到网络的包链,而不是传入包的链。

要从端口 80 重定向到端口 31380,您需要使用 PREROUTING 链。该链主要用于DNAT。试试这个:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:31380

要了解有关 iptables 中表和链的更多信息,请查看此 link

关于tcp - 端口重定向不适用于 IPtables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62658312/

相关文章:

spring-boot - Java Spring Boot Rest API 400错误请求

android - 使用 Wireshark 从手机抓包

java - Spring XD 使用自定义 TCP 序列化器

java - 当我尝试将 BufferedReader 中的字符串放入字符串数组时出现 NullPointer 异常

kubernetes - 如何使用命名空间级别的权限(没有集群管理权限)设置 Istio 或 Linkerd?

kubernetes - 启用Istio的GKE群集无法与Google Service Infrastructure API可靠地通信

tcp - 为什么TCP在快速重传之前要等待三个重复的ACK?

amazon-ec2 - 在 Amazon Linux 服务器上使用 IPTABLES 的最佳实践是什么?

linux - iptables 删除不在列表中的主机域

security - 在 Istio 中使用 JWT 进行最终用户身份验证给出 'upstream connect error'