有没有办法从外部连接到 Kubernetes pod 中未发布的套接字?



我在侦听端口25的容器中有一个不安全Postfix实例。此端口未使用Service公开。这个想法是,只有在同一 pod 内运行的PHP容器才能连接到 Postfix,并且不需要额外的Postfix配置 .

在同一网络或群集中运行的其他进程有什么方法可以连接到此隐藏端口Kubernetes

据我所知,只有同一 Pod 中的其他容器可以通过localhost连接到未公开的端口。

从安全的角度来看,我很感兴趣。

附言我现在应该确保它具有多个安全级别,但是如果有一些方法可以从pod外部连接到此端口,我只对理论上感兴趣。

我所知,只有同一 Pod 中的其他容器可以通过localhost连接到未公开的端口。

不完全是。 如何实现这一点是正在使用的特定容器运行时的详细信息。

。我只对理论上是否有某种方法可以从 pod 外部连接到此端口感兴趣。

所以我们来:)

例如,在 GKE 上,如果您知道 Target Pod 的 IP,则可以轻松地从其他 Pod 访问 Pod。

我在 GKE 上使用了以下设置:

apiVersion: v1
kind: Pod
metadata:
annotations:
run: fake-web
name: fake-default-knp
spec:
containers:
- image: mendhak/http-https-echo
imagePullPolicy: IfNotPresent
name: fake-web

可以在此处找到该映像的 Docker 文件。 它指定EXPOSE 80 443因此,容器侦听这两个端口。

$kubectl exec fake-default-knp -- netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::443                  :::*                    LISTEN      1/node
tcp        0      0 :::80                   :::*                    LISTEN      1/node

我没有服务:

$kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   40d

并且只有 2 个豆荚。

$kubectl get pods -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP
busybox-sleep-less               1/1     Running   3476       40d   10.52.1.6
fake-default-knp                 1/1     Running   0          13s   10.52.0.50  

我可以连接到

$kubectl exec busybox-sleep-less -- telnet 10.52.0.50 80
Connected to 10.52.0.50
$kubectl exec busybox-sleep-less -- telnet 10.52.0.50 443
Connected to 10.52.0.50

如您所见,容器可以从其他 pod(位于另一个节点上(POD_IP:container_port访问

附言>如果您真的想继续使用不安全的Postfix并且希望避免"来自Pod外部的未经授权的访问",则值得检查"进程间通信(IPC("。这里对此进行了描述。

希望对您有所帮助!


编辑 30-一月-2020

我决定玩一玩。从技术上讲,您可以在iptables的帮助下实现您想要的。您需要专门接受来自端口 25 上localhost的所有流量,并从其他任何地方丢弃。

像这样:

cat iptab.txt 
# Generated by xtables-save v1.8.2 on Thu Jan 30 16:37:27 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s 127.0.0.1/32 -p 6 -m tcp --dport 80 -j ACCEPT
-A INPUT -p 6 -m tcp --dport 80 -j DROP
COMMIT

我已经测试过它,除了那个 Pod 之外,我无法从任何地方在端口 80 上进行远程登录。请注意,我必须在特权模式下运行我的容器,以便能够直接从 Pod 编辑iptables规则。但这超出了最初的问题。:)

是的,您可以使用kubectl port-forward直接设置隧道以进行测试。

相关内容

  • 没有找到相关文章

最新更新