Istio - TCP Traffic(TCP路由)

本文探讨了Istio 1.1.0版本后增强的TCP路由功能,包括权重和端口支持,通过示例详细讲解了如何配置TCP服务的流量分配,以及在不同环境中(如测试和云环境)如何定义TCP服务的域名和端口,适用于希望深入理解Istio TCP路由机制的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Istio1.1.0以后,增强了对TCP路由的支持(Weight、Port),因为有项目使用TCP连接,故对TCP路由进行了探索;

官网示例

官方参考:TCP Traffic Shifting

官网的示例配置:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tcp-echo-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: tcp-echo
        version: v1
    spec:
      containers:
      - name: tcp-echo
        image: istio/tcp-echo-server:1.1
        imagePullPolicy: IfNotPresent
        args: [ "9000", "one" ]
        ports:
        - containerPort: 9000
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tcp-echo-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: tcp-echo
        version: v2
    spec:
      containers:
      - name: tcp-echo
        image: istio/tcp-echo-server:1.1
        imagePullPolicy: IfNotPresent
        args: [ "9000", "two" ]
        ports:
        - containerPort: 9000
---
apiVersion: v1
kind: Service
metadata:
  name: tcp-echo
  labels:
    app: tcp-echo
spec:
  ports:
  - name: tcp
    port: 9000
  selector:
    app: tcp-echo
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: tcp-echo-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 31400

      name: tcp
      protocol: TCP
    hosts:
    - "*"

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: tcp-echo
spec:
  hosts:
  - "*"
  gateways:
  - tcp-echo-gateway
  tcp:
  - match:
    - port: 31400

    route:
    - destination:
        host: tcp-echo
        port:
          number: 9000

        subset: v1
      weight: 80
    - destination:
        host: tcp-echo
        port:
          number: 9000
        subset: v2
      weight: 20
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tcp-echo-destination
spec:
  host: tcp-echo
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
 


以上有几点需要注意:

(1)Gateway中31340端口为istio-ingressgateway默认绑定的tcp端口,可通过istio-system.service.istio-ingressgateway进行查看;

(2)Gateway中host定义为*,表示接受所有域名,同时VirtualService中host同为*,与Gateway中host相对应;

(3)VirtualService中match.port为Gateway中监听的port 31340,并且将Gateway port 31340映射到目标应用destination port 9000端口(应用service实际端口),即将外部端口31340映射到具体tcp服务的9000端口;

使用其他(非31340)端口

官网示例中默认使用了31340端口,若想在Gateway中使用31340以外的端口(例如28674等),在Istio官网中没有提到,参考了阿里云栖社区的Istio流量管理实践之(1): 通过Istio规则来实现TCP入口流量路由的统一管理,并经过摸索,总结出若想使用31340以外的端口,则需要在istio-system.service.istio-ingressgateway中添加端口定义,例如我想在gateway中使用28674端口,则在istio-system.service.istio-ingressgateway中添加28674端口的定义,name有意义不重复即可,修改如下图:

之后便可在Gateway中使用该28674端口,否则除31340以外没有被定义的端口都是不好用的

补充:关于Istio-ingressgateway中端口定义, 可以动态添加端口定义,其中port为Gateway中监听的port,而nodePort为外部服务进入的端口,例如port=80,nodePort=31380,则通过domainName访问进入nodePort 31380端口,但是在Gateway中配置监听的port为80;

TCP域名配置

K8s + NodePort

最开始tcp服务使用的K8s NodePort Service进行服务路由,

在测试环境定义如下:

(1)在Dns中定义tcp域名指向K8s 集群任一节点;

(2)访问tcp域名+tcp服务NodePort即可;

在云环境定义如下:

(1)在Dns中定义tcp域名指向云环境LB外网IP;

(2)在LB中监听tcp服务对外暴露端口,并将该端口收到的请求转发到K8s 集群任一节点的tcp服务NodePort对应的端口即可;

(2)访问tcp域名+tcp服务对外暴露端口即可;

Istio

之后从K8s切换到Istio,转为使用Istio Gateway进行tcp服务(tcp服务改为普通ClusterIP)路由,

在测试环境定义如下:

(1)在Dns定义tcp域名指向路由器;

(2)在路由器中监听tcp服务对外暴露端口,并将该端口收到的请求转发到Istio Gateway所在节点IP、Gateway Tcp服务监听端口;

(3)定义Isito中tcp服务的相关配置(参考前文,包括基本路由配置Gateway, VIrtualService, DestinationRule等,同时需要修改isito-ingressgateway服务的端口映射);

(4)访问tcp域名+tcp服务对外暴露端口即可;

在云环境定义如下:

(1)在Dns中定义tcp域名指向云环境LB外网IP;

(2)在LB中监听tcp服务对外暴露端口,并将该端口收到的请求转发到Istio Gateway所在节点IP、Gateway Tcp服务监听端口;

(3)定义Isito中tcp服务的相关配置(参考前文,包括基本路由配置Gateway, VIrtualService, DestinationRule等,同时需要修改isito-ingressgateway服务的端口映射);

(4)访问tcp域名+tcp服务对外暴露端口即可;

 

 

<think>好的,我现在需要帮助用户了解如何使用traffic filter过滤TCP报文。首先,我得回忆一下相关的网络知识。用户提到的“traffic filter”可能是指网络设备中的流量过滤功能,比如路由器或交换机上的访问控制列表(ACL)。根据引用[3],Filter由Classifier和Policer组成,Classifier可能用于识别流量类型,比如TCP报文。 接下来,我需要确定如何具体配置过滤TCP报文。通常,ACL可以根据协议类型、源/目的端口等来过滤。例如,在Cisco设备中,可以创建ACL规则,指定协议为TCP,并设置允许或拒绝的动作。用户可能需要知道如何编写这样的规则,以及如何应用到接口上。 另外,引用[2]提到在策略路由中使用deny和permit规则,这可能与流量过滤类似。虽然主要是路由策略,但配置逻辑可能有相似之处,比如定义匹配条件后执行动作。例如,匹配TCP端口后拒绝或允许。 用户的问题还可能涉及具体配置步骤,比如使用命令行界面或图形化工具。需要分步骤说明,比如创建ACL、定义规则、应用策略到接口。同时,要提醒用户注意顺序,因为ACL规则是按顺序匹配的。 此外,引用[1]中的Wireshark过滤TCP报文的方法虽然不同,但过滤条件的逻辑可能类似,比如使用“tcp”作为过滤表达式。但traffic filter是在网络设备上实时过滤,而Wireshark是抓包分析,两者应用场景不同,但原理相通。 需要确保回答准确,引用相关的资料,比如引用[3]中的Filter结构,说明Classifier如何识别TCP流量,以及Policer如何执行动作。同时,可能涉及不同厂商的配置差异,但给出通用步骤,再建议参考具体设备文档。 最后,生成相关问题,帮助用户深入理解,比如不同协议的过滤方法或高级策略配置。</think>以下是关于使用traffic filter过滤TCP报文的详细说明: ### 一、流量过滤原理 1. **Classifier分类器** Traffic filter通过Classifier识别TCP报文特征,包括: - 协议类型字段:IPv4报文头部中`Protocol=6`表示TCP[^3] - 端口号:可匹配源端口/目的端口(如80、443等) - 标志位:SYN、ACK等控制位 2. **Policer策略执行器** 根据流量匹配结果执行动作: - `permit`:允许通过 - `deny`:丢弃报文 - `remark`:修改优先级标记 ### 二、配置步骤(以通用网络设备为例) ```bash # 1.创建访问控制列表 ip access-list extended TCP_FILTER # 2.定义TCP过滤规则(示例拒绝所有HTTP流量) deny tcp any any eq 80 permit tcp any any # 放行其他TCP流量[^2] # 3.应用过滤器到接口 interface GigabitEthernet0/1 ip access-group TCP_FILTER in ``` ### 三、高级过滤方法 1. **状态检测** 通过跟踪TCP连接状态过滤异常报文: ```bash deny tcp any any eq 80 established # 仅允许已建立连接的HTTP响应 ``` 2. **时间段控制** 结合时间策略限制访问时段: ```bash time-range WORK_TIME 08:00 to 17:00 deny tcp any any eq 22 time-range WORK_TIME ``` ### 四、验证与调试 1. 查看ACL计数器: ```bash show ip access-list TCP_FILTER ``` 2. 使用抓包工具(如Wireshark)验证过滤效果,过滤表达式为`tcp && (tcp.port == 80)`[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗小爬EX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值