Как разрешить исходящий трафик на порт 443 (вызовы https) и заблокировать порт 80 (вызовы HTTP)

Я реализую сетевую политику kubernetes для своего приложения на K3s. Я хочу разрешить egress (внешний вызов в Интернет из модуля) для порта 443, т. е. https вызовов только, и запретить/заблокировать все исходящие вызовы на порту 80, т.е. http. Короче говоря, разрешить https исходящие вызовы и запретить http исходящие вызовы.
Я тестирую это с помощью custom-dns.yaml файла ниже:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: foo-deny-egress
spec:
  podSelector:
    matchLabels:
      app: foo
  policyTypes:
  - Egress
  egress:
  # allow DNS resolution
  - ports:
    - port: 443
      protocol: UDP
    - port: 443
      protocol: TCP

После kubectl apply -f custom-dns.yaml я создаю и вхожу в модуль :kubectl run --restart=Never pod-v1 --image=busybox -i -t -l app=foo и проверяю URL-адреса http и https с помощью команды:

  1. wget https://www.google.com
  2. wget http://drive.google.com/drive/u/0/my-drive

Обе команды wget выдают ошибку wget: bad address.

Но когда я не применяю эту сетевую политику, те же команды wget работают и дают следующий результат из того же модуля:
i.

        wget https://www.google.com
        Connecting to www.google.com (172.217.167.164:443)
        wget: note: TLS certificate validation not implemented
        saving to 'index.html'
        index.html           100% |******************************************************| 15264  0:00:00 ETA
       'index.html' saved

ii.

wget http://drive.google.com/drive/u/0/my-drive
Connecting to drive.google.com (142.250.192.46:80)
Connecting to drive.google.com (142.250.192.46:443)
wget: note: TLS certificate validation not implemented
Connecting to accounts.google.com (142.250.192.77:443)
saving to 'my-drive'
my-drive             100% |******************************************************| 92019  0:00:00 ETA
'my-drive' saved

iii. Telnet на google.com IP 172.217.167.164 с 80 и 443 портом

#telnet 172.217.166.164 80
Connected to 172.217.166.164
^]q
# telnet 172.217.166.164 443
Connected to 172.217.166.164
^]

iv. Аналогично Telnet для drive.com IP 142.250.192.46 с 80 и 443 портом

Что мне здесь не хватает?


person solveit    schedule 06.07.2021    source источник


Ответы (1)


  • networkPolicy, который вы упомянули в сообщении, просто разрешает https/трафик на 443, но вы ничего не упомянули в нем, чтобы запретить трафик http (порт 80).

  • Есть два способа добиться этого:

    • Setup a default deny policy for egress

    либо

    • создайте другую политику выхода, в которой вы запрещаете выход через порт 80
person confused genius    schedule 06.07.2021
comment
Привет @confusedGenius. Итак, запрещая все исходящие вызовы и создавая другую политику исходящих вызовов для отклонения вызовов через порт 80, где я могу принимать вызовы через порт 443? Можете ли вы привести пример конфигурации для этого? - person solveit; 07.07.2021
comment
Если я правильно понял, он имеет в виду, что в дополнение к вашей (правильно) созданной allow политике вы должны создать deny политику. И самый удобный способ — создать другую политику выхода, в которой вы запрещаете выход через порт 80. Вам не нужно реализовывать два решения. - person Vit; 07.07.2021
comment
Кстати, хороший онлайн-эмулятор networkpolicies, вы можете попробовать. editor.cilium.io - person Vit; 07.07.2021