내 클라이언트에는 동일한 지역/데이터 센터에 여러 개의 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인 인터페이스를 포함하여 다른 인터페이스에서는 연결을 허용하지 않습니다.
세 가지 주요 옵션이 있습니다.
172.26.14.232 주소에서 연결을 허용하도록 postgres를 재구성합니다.
보안을 위해 특정 호스트(예: 172.26.0.215)만 postgres에 연결할 수 있도록 방화벽 규칙을 추가해야 합니다.
172.16/12 RFC-1918 프라이빗 주소를 사용하고 계시다는 것을 알 수 있지만, 귀하의 서브넷이 다른 AWS 고객과 완전히 격리되어 있는지는 알 수 없습니다. 서브넷이 완전히 격리된 경우 방화벽 규칙 없이 실행하는 것이 안전합니다(어차피 방화벽 규칙을 설정하는 것을 선호하지만 필요한 경우 언제든지 액세스를 켤 수 있지만 해커 공격을 취소할 수는 없습니다).
두 서버 사이에 일종의 VPN을 설정하십시오. VPN 인터페이스에서 연결을 허용하도록 postgres를 구성합니다.
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(또는 perl 스크립트 사용을 포함한 다른 postgres 클라이언트)을 사용하여 연결할 수 있습니다.데이터베이스 인터페이스그리고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
.