我的客户安装了多个 AWS 实例,全部位于同一区域/数据中心。
我的任务是在其中一台机器上安装 Redis 和 Postgresql 实例,并使数据存储/数据库可以从另一个机器访问。数据库服务器的 LAN IP 为 172.26.14.232,运行数据库客户端的服务器的 IP 为 172.26.0.215。
Postgres 已启动并在数据库服务器上运行,使用 netstat 检查这一点:
[ubuntu@ip-172-26-14-232 DATABA ~]$ sudo netstat -tulpn | grep postgre
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 4539/postgres
当我尝试连接客户端盒子时,我收到“连接被拒绝”,就好像有防火墙阻止访问一样,netcat 确认了这一点:
[ubuntu@ip-172-26-0-215 GATE01 ~]$ sudo psql "sslmode=require" --host 172.26.14.232 --user=postgres --password
Password for user postgres:
psql: could not connect to server: Connection refused
Is the server running on host "172.26.14.232" and accepting
TCP/IP connections on port 5432?
[ubuntu@ip-172-26-0-215 GATE01 ~]$ nc -vz 172.26.14.232 5432
nc: connect to 172.26.14.232 port 5432 (tcp) failed: Connection refused
据我所知,我只能使用 nc 连接一个端口:
[ubuntu@ip-172-26-0-215 GATE01 ~]$ nc -vz 172.26.14.232 22
Connection to 172.26.14.232 22 port [tcp/ssh] succeeded!
我的客户说他删除了所有防火墙规则,但我不明白上面给出的结果。
我在某处读到,AWS 会阻止此类网络中的出站流量,但我无法自己检查这一点,因为我无法访问管理控制台。
奖金问题;-)
发现以下内容这地点:
netcat -vzw 15 域名.com 21
如果成功,您将看到:
连接domain.com 21端口[tcp/ftp]成功!
如果端口连接被阻止或拒绝,您将看到:
nc:连接到域端口 21 (tcp) 失败:连接被拒绝
作者可能区分了“阻止”和“拒绝”,据此我认为,在后一种情况下,这意味着为此端口安装了固件规则“DENY”,但我不知道他的意思被“封锁”。是否存在第二种技术可能性,或者他只是将“阻止”和“拒绝”同义使用?
编辑:
令人惊讶的是,可以使用 nc 设置客户端-服务器连接(关闭数据库后):
[ubuntu@ip-172-26-14-232 DATABA ~]$ nc -l 5432
[ubuntu@ip-172-26-0-215 GATE01 ~]$ nc 172.26.14.232 5432
hello
在 172.26.14.232 上我们得到:
hello
答案1
根据您的netstat
输出,您的 postgres 服务器仅侦听 127.0.0.1(环回接口)上的连接。
它不会接受任何其他接口上的连接,包括地址为 172.26.14.232 的接口。
您有三个主要选择:
重新配置 postgres 以接受 172.26.14.232 地址上的连接。
为了安全起见,您还需要添加防火墙规则以确保只有某些主机(例如 172.26.0.215)能够连接到 postgres。
我可以看到您正在使用 172.16/12 RFC-1918 私有地址,但我不知道您的子网是否与其他 AWS 客户完全隔离。如果您的子网是完全隔离的,那么在没有防火墙规则的情况下运行应该是安全的(尽管无论如何我都倾向于设置防火墙规则 - 如果需要,您可以随时打开访问权限,但您无法撤消被黑客攻击的情况)
在两台服务器之间建立某种 VPN。配置 postgres 以接受 VPN 接口上的连接。
使用
ssh
端口转发。例如,如果您在 172.26.0.215 上运行以下命令:ssh -N -L 5432:127.0.0.1:5432 [email protected]
&
如果您使用 ssh 密钥进行身份验证,您可能希望在后台运行此命令(或者在使用密码进行身份验证后按Ctrl-Z然后运行bg
将其发送到后台),或者在一个单独的 ssh 会话中(来自您要运行 psql 或其他任何内容的会话),或者在一个tmux
或screen
会话中。这会将本地计算机上的 127.0.0.1:5432 连接转发到远程计算机上的 127.0.0.1:5432。您可以使用 psql (或任何其他 postgres 客户端,包括使用 perl 脚本)连接到它数据库接口和DBD::Pg或蟒蛇与心理PG3)。
例如(在 172.26.0.215 上):
psql "sslmode=require" --host localhost --user=postgres --password
psql
连接到本地计算机上的 localhost:5432,但 ssh 将其转发到远程计算机上的 localhost:5432。您将需要:
- 每当您需要连接到远程计算机上的 postgresql 时运行此命令,或者
- 设置一个 systemd 单元文件(或者其他文件,如果您不使用 systemd)来启动连接并在连接断开时重新启动它。为了使其自动化,您将需要使用 ssh 密钥而不是密码进行身份验证 - 无论如何您都应该这样做。
如果需要,您可以对 redis (通常侦听 localhost:6379)执行相同的操作。
顺便说一句,你不需要sudo
运行psql
.