Назад | Перейти на главную страницу

Настройте брандмауэр Google Cloud Firewall для фильтрации по тегам и подсетям

Я запускаю PostgreSQL на экземпляре Google Cloud Compute Engine, и PostgreSQL в настоящее время настроен на прием соединений из любого места, идея заключается в том, что я использую брандмауэр для управления доступом вместо того, чтобы каждый раз входить на сервер.

В настоящее время у меня есть правило брандмауэра под названием development-allow-psql, чтобы убедиться, что все остальное не настроено неправильно, я настроил его так, чтобы он разрешал отовсюду:

Targets: All instances on network
Source Filter: IP Ranges
Source IP Ranges: 0.0.0.0/0
Second Source Filter: None
Specified protocols and ports: tcp:5432

Бег

psql "dbname=mydb host=__.___.__.__ user=myuser password=mypassword port=5432"

Подключает меня мгновенно, но из любого места, а не только из экземпляров, которым я хочу разрешить доступ.

Эти экземпляры создаются автоматически через Instance Group из Instance Template Шаблон настроен на создание экземпляров со следующими настройками:

Network tags: myapp-api, http-server, https-server
Network: development
Subnetwork: development (with address range 10.154.0.0/20)

Я хочу ограничить доступ к этому экземпляру БД экземплярами, у которых есть myapp-api как тег или имеет подсеть 10.154.0.0/20 или оба. Поэтому я меняю настройки брандмауэра на следующие:

Targets: Specified target tags
Target tags: myapp-api
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: None
Specified protocols and ports: tcp:5432

Это блокирует доступ к psql команда, которую я запускал ранее (команда psql запускается из экземпляров докера, к которым я получаю доступ через docker exec -ti -u0 my-instance-api-dev-small bash)

Если я сейчас перейду на

Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432

Он по-прежнему блокирует любой доступ. Если я сейчас удалю фильтр второго источника и буду фильтровать только подсеть, доступа все равно не будет.

Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: None
Specified protocols and ports: tcp:5432

Если я заменю фильтр источника подсети на фильтр тегов:

Targets: All instances on the network
Source Filter: Source tags
Source tags: myapp-api
Second Source Filter: None
Specified protocols and ports: tcp:5432

... все еще нет доступа.

То же самое при выборе фильтра источника подсетей и просто выбора всех подсетей.

Переход на:

Targets: All instances on the network
Source Filter: IP ranges
Source IP ranges: 0.0.0.0/0
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432

он снова позволяет всем (даже за пределами Google Cloud) подключаться, даже если я указал исходный тег

Изменение диапазона IP-адресов на 10.154.0.0/20 снова блокирует всех

Targets: All instances on the network
Source Filter: IP ranges
Source IP ranges: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432

Замена диапазона IP-адресов внешними IP-адресами экземпляров, например 35.189.124.141/32 работает, но поскольку эти IP-адреса являются эфемерными, это не решение, так как для этого потребуется обновлять правила брандмауэра каждый раз, когда автоматическое масштабирование добавляет больше экземпляров с новыми IP-адресами.

Как настроить брандмауэр, чтобы разрешить экземпляры только из определенной подсети и / или с определенными тегами? То, что я делаю, похоже, не работает.

При переключении с внешнего IP-адреса экземпляра базы данных на его внутренний IP-адрес внезапно все вышеуказанные комбинации работают.

psql "dbname=mydb host=internal-ip-address-here user=myuser password=mypassword port=5432"

Оказывается, когда вы используете теги, брандмауэр смотрит на внутренний IP-адрес, а не на внешний IP-адрес.

Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432