美文网首页
屏蔽K8S中的POD访问特定网址

屏蔽K8S中的POD访问特定网址

作者: 佑岷 | 来源:发表于2020-02-03 17:36 被阅读0次

最近在看点评网站:


[http://www.dianping.com/shop/90495398]

感觉里面防爬做的蛮好:验证方面采用随机验证类型(滑块、极验、连连看等等还有其他);而且网页间的上下层级关联性做的特别好,如果绕过上一页直接访问下一页数据,就会跳转到验证页面,认为此操作不是一个正常人的访问行为;再者里面采用Ajax动态加载居多。

然而,我感觉最巧妙的一点应该上图红框框圈出来的那个防爬操作,点评返回的脚本中包含资源请求:http://114.80.165.63/broker-service/api/single?tu=midas-cpm&ts=1580718662601&hs=2002&d=807,页面渲染并请求这个网址时,服务器端会hold住请求不返回,一直到浏览器超时自动断开为止。

如果我们想通过http请求直接去获取点评数据的话,难度比较高,简单一点可以用动态引擎去渲染完毕后再返回。动态引擎特性是会等到页面的数据全部加装完毕再返回,再结合上面114.80.165.63资源会hold住请求不响应,这样就会导致动态渲染引擎直到超时才会返回数据。

说上面的请求防爬比较巧妙主要有两点:

  1. 用ip而不是域名:如果用域名的话,我们可以直接在hosts讲域名映射到127.0.0.1这样就能直接返回;
  2. hold住请求不返回:让请求方等到死为止,然而由于这个请求不返回任何有效资源,因此还不影响浏览器端用户的正常操作~

愁人、、、
我们的动态引擎部署在K8S中

Calico用法

我这边用的k8s用的网络组件是flannel还不方便操作规则,然后就换成了calico,配置了egress规则进去:

- apiVersion: projectcalico.org/v3
  kind: GlobalNetworkPolicy
  metadata:
    name: deny-egress-ips
  spec:
    selector: "all()"
    types:
    - Ingress
    - Egress
    ingress:
    - action: Allow
    egress:
    - action: Deny
      destination:
        nets:
        - 114.80.165.63/32
    - action: Allow

达到了deny的效果,但是没有明确拒绝导致不能实时返回。

Iptables规则

直接在node节点的iptables追加了一条:

iptables -A OUTPUT -p tcp -d 114.80.165.63 --dport 80 -j REJECT

在节点上面curl网址效果明显,但是仍然需要2s才能返回,因为默认情况--reject-with是icmp-port-unreachable,这个发起两次syn操作。对比了下换成了tcp-reset,只会发起一次syn,返回时间在几十ms。
配置完毕后发现对节点上面发出的请求有效,对pod发出的请求无效,分析了下原因:k8s流转的数据包都mark了特殊标识,会走特定的chains,因此将规则添加到了KUBE-SERVICES chains中即可。

iptables -A KUBE-SERVICES -p tcp -d 114.80.165.63 --dport 80 -j REJECT --reject-with tcp-reset

批量操作:

for l in `cat node_ips`; do ssh $l 'iptables -A KUBE-SERVICES -p tcp -d 114.80.165.63 --dport 80 -j REJECT --reject-with tcp-reset'; done

相关文章

  • 屏蔽K8S中的POD访问特定网址

    最近在看点评网站: 感觉里面防爬做的蛮好:验证方面采用随机验证类型(滑块、极验、连连看等等还有其他);而且网页间的...

  • k8s中service和endpoint

    K8s提供了service对象来访问pod。 为什么没有直接访问pod?一是k8s中pod不是持久性的,宕机重建将...

  • kubernetes service 介绍

    一、问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态...

  • Pod内进程访问k8s服务

    Pod内进程访问k8s服务 外部服务可以通过kubeconfig访问k8s服务,那k8s集群内部服务(Pos内服务...

  • K8S 网络详解 2 kubernetes 网络实现

    K8S 的网络特征: 每个POD 一个IP (IP peer POD) 所有POD 通过IP 直接访问其他POD...

  • k8s集群calico网络故障记录

    报错 访问k8s的dashboard界面无法访问网站,查看pod未知原因导致calico的Pod资源重新创建后无法...

  • 如何在集群外部通过ip直连Pod?

    通常情况下k8s集群中pod使用的是单独划分的一个虚拟子网,处于这个子网中的pod通过nat地址转换的方式访问集群...

  • k8s 问题解决

    core-dns 的 启动失败 重启k8s后 etcd 启动失败 k8s集群关机后重启pod访问不到外网 k8s证...

  • k8s之service account

    service account是k8s为pod内部的进程访问apiserver创建的一种用户。其实在pod外部也可...

  • GitLab 流水线常见问题集锦

    Job 无法访问特定域名 如果Gitlab Runner 通过Helm chart 部署到K8S 中,但出现无法访...

网友评论

      本文标题:屏蔽K8S中的POD访问特定网址

      本文链接:https://www.haomeiwen.com/subject/xknhxhtx.html