Kubernetes pod və ya konteynerdə tcpserver və netcat ilə tunel necə açılır

Qeyd. tərc.: Bu praktiki nota LayerCI yaradıcısından Kubernetes (və təkcə deyil) üçün tips & tricks dediyimiz şeylərin əla bir nümunəsidir. Burada təklif olunan həll yalnız az sayda olanlardan biridir və bəlkə də, ən göz qabağında olmaya bilər (bəzi hallarda xəbərdə qeyd olunan K8s üçün 'yerli' variant daha münasib ola bilər. kubectl port-forward). Ancaq bu, ən azından problemi klassik utilitələrin tətbiqi və onların gələcək birləşmələri mövqeyindən görmək imkanı təqdim edir — eyni zamanda sadə, çevik və güclü (ilham üçün sonundakı 'digər fikirlər' bölümünə baxın).

Kubernetes pod və ya konteynerdə tcpserver və netcat ilə tunel necə açılır

Təsəvvür edin ki, tipik bir vəziyyətlə qarşı-qarşıyasınız: yerli kompüterdəki bir portu sehrli şəkildə bir pod/konteynerə (və ya tərsinə) trafik köçürmək istəyirsiniz.

Tətbiq senariləri

  1. HTTP uçotturucusunun nə döndüyünü yoxlayın /healthz istehsal klasterindəki pod'un.
  2. Yerli maşınınıza TCP debugguerini pod'a bağlayın.
  3. BD ilə işləmək üçün yerli vasitələrdən istehsal bazasına girin, autentifikasiya ilə baş ağrısını çəkmədən (adətən localhost-da root hüquqları olur).
  4. Yerli mühitdə konteyner yaratmadan staging klasterindəki məlumatlar üçün bir dəfəlik miqrasiya skriptini işə salın.
  5. VNC sessiyasını virtual masaüstündə işləyən pod'a bağlayın (bax: XVFB).

Lazım olan utilitələr barədə bəzi sözlər

Tcpserver — əksər Linux paket repositoriyalarında mövcud olan Açıq Mənbə vasitəsidir. Bu, yerli bir port açmağa və hər hansı bir göstərilən komandanın stdin/stdout-dan gələn trafiği ona köçürməyə imkan verir:

colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>salam!</body>'&amp;
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>salam!</body>colin@colin-work:~$

(asciinema.org)

Netcat bunu tərsinə edir. Bu, açıq bir porta bağlanmağa və ondan alınan giriş/çıxışı stdin/stdout'a ötürməyə imkan tanıyır:

colin@colin-work:~$ nc -C httpstat.us 80
GET /200 HTTP/1.0
Host: httpstat.us
HTTP/1.1 200 OK
Cache-Control: private
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.1
Access-Control-Allow-Origin: *
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=93fdbab9d364704de8ef77182b4d13811344b7dd1ec45d3a9682bbd6fa154ead;Path=/;HttpOnly;Domain=httpstat.us
Date: Fri, 01 Nov 2019 17:53:04 GMT
Connection: close
Content-Length: 0

^C
colin@colin-work:~$

(asciinema.org)

Yuxarıda göstərilən nümunədə netcat HTTP vasitəsilə səhifəni soruşur. Flags -C sonra xətlərin sonuna CRLF əlavə etməsini təmin edir.

kubectl ilə birləşdirmək: ev sahibi də dinləyin və pod'a qoşulun

Yuxarıda təqdim olunmuş vasitələri kubectl ilə birləşdirərək, aşağıdakı kimi bir komanda əldə edirik:

tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080

Eynilə, pod'dakı port 80-ə daxil olmaq üçün yalnız belə etməlisiniz: curl "127.0.0.1:80":

colin@colin-work:~$ sanic kubectl exec -it web-54dfb667b6-28n85 bash
root@web-54dfb667b6-28n85:/web# apt-get -y install netcat-openbsd
Reading package lists... Done
Building dependency tree
Reading state information... Done
netcat-openbsd is already the newest version (1.195-2).
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
root@web-54dfb667b6-28n85:/web# exit
colin@colin-work:~$ tcpserver 127.0.0.1 8000 sanic kubectl exec -i web-54dfb667b6-28n85 nc 127.0.0.1 8080&
[1] 3232
colin@colin-work:~$ curl localhost:8000/healthz
{"status":"ok"}colin@colin-work:~$ exit

(asciinema.org)

Kubernetes pod və ya konteynerdə tcpserver və netcat ilə tunel necə açılır
Alətlərin qarşılıqlı təsir sxemi

Tərsinə: pod'da dinləyin və ev sahibinə qoşulun

nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat

Bu komanda pod-un yerel makinedeki 8000 portuna erişmesini sağlar.

Bash için bir script

Üretim kümesi Kubernetes'i yönetmek için bir Bash scripti yazdım. LayerCI, yukarıda açıklanan yöntemi kullanarak:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Kullanım: kubetunnel [pod adı] [hedef port]"
        return 1
    fi
    pkill -f 'tcpserver 127.0.0.1 6666'
    tcpserver 127.0.0.1 6666 kubectl exec -i "$POD" nc 127.0.0.1 "$DESTPORT"&
    echo "Erişim için 127.0.0.1:6666'ya bağlanın $POD:$DESTPORT"
}

Bu fonksiyonu ekleyerek ~/.bashrc, pod'da tünel açmak için kolayca şu komutu kullanabilirsiniz: kubetunnel web-pod 8080 ve curl localhost:6666.

  • Tünel için Docker ana satırı şöyle değiştirebilirsiniz:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • tünel için K3s — bunu şöyle değiştirin:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • və s.

Diğer fikirler

  • UDP trafiğini şu komutlarla yönlendirebilirsiniz: netcat -l -u -c yerinə tcpservernetcat -u yerinə netcat Covered information is sent using the official client
  • pipe viewer üzerinden giriş/çıkışı görüntüleyin:

    nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat

  • Her iki uçta trafiği sıkıştırabilir ve açabilirsiniz. gzip.
  • İlgili dosya ile başka bir bilgisayara SSH ile bağlanın: kubeconfig:

    tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"

  • Farklı kümelerdeki iki pod'u şu şekilde bağlayabilirsiniz: mkfifo ve iki ayrı komut çalıştırabilirsiniz. kubectl.

İmkanlar sınırsız!

Kubernetes-də təhlükəsizlik: identifikasiya, icazə, audit

Blogumuzda oxuyun:

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster