我在侦听端口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
直接设置隧道以进行测试。