Я запускаю 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