Linux에서 포트 노킹을 사용하는 방법(및 사용하지 말아야 하는 이유)

게시 됨: 2022-01-29
닫힌 문을 두드리는 손.
포토그래피.eu/Shutterstock

포트 노킹은 방화벽 포트를 닫아 서버를 보호하는 방법입니다. 알고 있는 포트라도 사용할 것입니다. 이러한 포트는 연결 요청이 비밀 노크를 제공하는 경우에만 요청 시 열립니다.

포트 노킹은 "비밀 노크"입니다.

금주법이 한창이던 1920년대에, 주류 판매점에 들어가려면 비밀 노크를 알고 올바르게 두드려야 안으로 들어갔습니다.

포트 노킹은 현대적인 것과 같습니다. 사람들이 컴퓨터의 서비스에 액세스할 수 있기를 원하지만 인터넷에 대한 방화벽을 열지 않으려면 포트 노킹을 사용할 수 있습니다. 이를 통해 들어오는 연결을 허용하는 방화벽의 포트를 닫고 연결 시도의 미리 정렬된 패턴이 만들어지면 자동으로 열 수 있습니다. 연결 시도의 순서는 비밀 노크 역할을 합니다. 또 다른 비밀 노크는 항구를 닫습니다.

포트 노킹은 참신한 기능이지만 이것이 모호함을 통한 보안의 한 예이며 그 개념에는 근본적으로 결함이 있다는 것을 아는 것이 중요합니다. 시스템에 접근하는 방법의 비밀은 특정 그룹의 사람들만 알고 있기 때문에 안전합니다. 그러나 일단 그 비밀이 공개되면—그것이 드러났거나, 관찰되었거나, 추측되었거나, 해결되었기 때문에—당신의 보안은 무효입니다. SSH 서버에 키 기반 로그인을 요구하는 것과 같이 더 강력한 다른 방법으로 서버를 보호하는 것이 좋습니다.

광고

사이버 보안에 대한 가장 강력한 접근 방식은 다중 계층이므로 포트 노킹이 이러한 계층 중 하나여야 합니다. 층이 많을수록 좋겠죠? 그러나 포트 노킹이 적절하게 강화되고 안전한 시스템에 많은 것을 추가하지 않는다고 주장할 수 있습니다.

사이버 보안은 방대하고 복잡한 주제이지만 포트 노킹을 유일한 방어 수단으로 사용해서는 안 됩니다.

관련: Linux 셸에서 SSH 키를 만들고 설치하는 방법

노크 설치

포트 노킹을 보여주기 위해 SSH 포트인 포트 22를 제어하는 ​​데 사용할 것입니다. 우리는 knockd라는 도구를 사용할 것입니다. Ubuntu 또는 다른 Debian 기반 배포를 사용하는 경우 apt-get 을 사용하여 시스템에 이 패키지를 설치합니다. 다른 Linux 배포판에서는 대신 Linux 배포판의 패키지 관리 도구를 사용하십시오.

다음을 입력합니다.

 sudo apt-get 설치 노크 

시스템에 이미 iptables 방화벽이 설치되어 있을 수 있지만 iptables-persistent 패키지를 설치해야 할 수도 있습니다. 저장된 iptable 규칙의 자동 로드를 처리합니다.

다음을 입력하여 설치합니다.

 sudo apt-get 설치 iptables-persistent 

IPV4 구성 화면이 나타나면 스페이스바를 눌러 "예" 옵션을 수락합니다.

iptables-persistent IPV4 화면에서 "예" 옵션을 수락하려면 스페이스바를 누르십시오.

IPv6 구성 화면에서 스페이스바를 다시 눌러 "예" 옵션을 수락하고 계속 진행합니다.

IPv6 구성 화면에서 "예" 옵션을 수락하려면 스페이스바를 누르십시오.

광고

다음 명령은 iptables 에 설정 및 진행 중인 연결을 계속하도록 지시합니다. 이제 SSH 포트를 닫는 또 다른 명령을 실행합니다.

이 명령을 실행할 때 누군가가 SSH로 연결되어 있는 경우, 우리는 그들이 차단되는 것을 원하지 않습니다.

 sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT 

이 명령은 방화벽에 다음과 같은 규칙을 추가합니다.

  • -A : 방화벽 규칙 테이블에 규칙을 추가합니다. 즉, 맨 아래에 추가합니다.
  • INPUT : 들어오는 연결에 대한 규칙입니다.
  • -m conntrack : 방화벽 규칙은 규칙의 기준과 일치하는 네트워크 트래픽(패킷)에 대해 작동합니다. -m 매개변수는 iptables 가 추가 패킷 일치 모듈을 사용하도록 합니다. 이 경우 conntrack 이라는 모듈은 커널의 네트워크 연결 추적 기능과 함께 작동합니다.
  • –cstate ESTABLISHED,RELATED : 규칙이 적용될 연결 유형, 즉 ESTABLISHED 및 RELATED 연결을 지정합니다. 설정된 연결은 이미 진행 중인 연결입니다. 관련 연결은 설정된 연결의 작업으로 인해 만들어진 연결입니다. 연결된 누군가가 파일을 다운로드하기를 원할 수 있습니다. 호스트가 시작한 새 연결을 통해 발생할 수 있습니다.
  • -j ACCEPT : 트래픽이 규칙과 일치하면 방화벽의 ACCEPT 대상으로 이동합니다. 즉, 트래픽이 허용되고 방화벽을 통과하도록 허용됩니다.

이제 포트를 닫는 명령을 실행할 수 있습니다.

 sudo iptables -A INPUT -p tcp --dport 22 -j 거부 

이 명령은 방화벽에 다음과 같은 규칙을 추가합니다.

  • -A : 방화벽 규칙 테이블에 규칙을 추가합니다. 즉, 맨 아래에 추가합니다.
  • INPUT : 이 규칙은 들어오는 연결에 관한 것입니다.
  • -p tcp : 이 규칙은 전송 제어 프로토콜을 사용하는 트래픽에 적용됩니다.
  • –dport 22 : 이 규칙은 특히 포트 22(SSH 포트)를 대상으로 하는 TCP 트래픽에 적용됩니다.
  • -j REJECT : 트래픽이 규칙과 일치하면 방화벽의 REJECT 대상으로 점프합니다. 따라서 트래픽이 거부되면 방화벽을 통해 허용되지 않습니다.

netfilter-persistent 데몬을 시작해야 합니다. 다음 명령으로 할 수 있습니다.

 sudo systemctl netfilter-persistent 시작 

netfilter-persistent 가 저장 및 다시 로드 주기를 거치도록 하여 iptable 규칙을 로드하고 제어합니다.

다음 명령을 입력합니다.

 sudo netfilter 영구 저장 

 sudo netfilter-persistent reload 

광고

이제 유틸리티를 설치했고 SSH 포트가 닫혔습니다(누구의 연결도 끊지 않고). 이제 비밀 노크를 구성할 시간입니다.

노크 구성

knockd 를 구성하기 위해 편집하는 두 개의 파일이 있습니다. 첫 번째는 다음 knockd 구성 파일입니다.

 sudo gedit /etc/knockd.conf 

knockd 구성 파일이 로드된 상태로 gedit 편집기가 열립니다.

gedit 편집기의 knockd 구성 파일.

우리는 우리의 필요에 맞게 이 파일을 편집할 것입니다. 관심 있는 섹션은 "openSSH" 및 "closeSSH"입니다. 각 섹션에는 다음 4개의 항목이 있습니다.

  • sequence : 누군가가 포트 22를 열거나 닫기 위해 액세스해야 하는 포트의 순서. 기본 포트는 7000, 8000, 9000으로 열리며, 9000, 8000, 7000으로 닫힙니다. 이를 변경하거나 목록에 더 많은 포트를 추가할 수 있습니다. 우리의 목적을 위해 우리는 기본값을 사용할 것입니다.
  • seq_timeout : 포트를 열거나 닫도록 트리거하기 위해 누군가가 포트에 액세스해야 하는 시간입니다.
  • command : 열기 또는 닫기 작업이 트리거될 때 iptables 방화벽으로 전송되는 명령입니다. 이러한 명령은 방화벽에 규칙을 추가(포트 열기)하거나 제거(포트 닫기)합니다.
  • tcpflags : 각 포트가 비밀 시퀀스에서 수신해야 하는 패킷 유형. SYN(동기화) 패킷은 3방향 핸드셰이크라고 하는 TCP 연결 요청의 첫 번째 패킷입니다.

"openSSH" 섹션은 "포트 22를 여는 명령을 방화벽으로 보내려면 5초 이내에 포트 7000, 8000, 9000에 TCP 연결 요청을 해야 합니다."라고 읽을 수 있습니다.

광고

"closeSSH" 섹션은 "포트 22를 닫으라는 명령이 방화벽으로 전송되려면 5초 이내에 포트 9000, 8000, 7000에 TCP 연결 요청을 해야 합니다."라고 읽을 수 있습니다.

방화벽 규칙

openSSH 및 closeSSH 섹션의 "명령" 항목은 하나의 매개변수를 제외하고 동일하게 유지됩니다. 다음과 같이 구성되어 있습니다.

  • -A : 방화벽 규칙 목록의 맨 아래에 규칙을 추가합니다(openSSH 명령의 경우).
  • -D : 방화벽 규칙 목록에서 명령을 삭제합니다(closeSSH 명령의 경우).
  • INPUT : 이 규칙은 들어오는 네트워크 트래픽과 관련이 있습니다.
  • -s %IP% : 연결을 요청하는 장치의 IP 주소입니다.
  • -p : 네트워크 프로토콜; 이 경우 TCP입니다.
  • -dport : 목적지 포트 이 예에서는 포트 22입니다.
  • -j ACCEPT : 방화벽 내의 수락 대상으로 이동합니다. 즉, 패킷이 조치를 취하지 않고 나머지 규칙을 통과하도록 합니다.

노크 구성 파일 편집

파일에 대한 수정 사항은 아래에서 빨간색으로 강조 표시됩니다.

편집이 강조 표시된 gedit 편집기의 knockd 구성 파일.

"seq_timeout"을 15초로 확장합니다. 이것은 관대하지만 누군가가 연결 요청에서 수동으로 실행하는 경우 이만큼의 시간이 필요할 수 있습니다.

"openSSH" 섹션에서 명령의 -A (추가) 옵션을 -I (삽입)로 변경합니다. 이 명령은 방화벽 규칙 목록의 맨 위에 새 방화벽 규칙을 삽입합니다. -A 옵션을 그대로 두면 방화벽 규칙 목록을 추가 하고 맨 아래 에 넣습니다.

들어오는 트래픽은 목록의 각 방화벽 규칙에 대해 위에서 아래로 테스트됩니다. 이미 포트 22를 닫는 규칙이 있습니다. 따라서 들어오는 트래픽이 트래픽을 허용하는 규칙을 보기 전에 해당 규칙에 대해 테스트되면 연결이 거부됩니다. 이 새 규칙이 먼저 보이면 연결이 허용됩니다.

close 명령은 방화벽 규칙에서 openSSH에 의해 추가된 규칙을 제거합니다. SSH 트래픽은 기존의 "포트 22가 닫힘" 규칙에 의해 다시 한 번 처리됩니다.

이러한 편집을 수행한 후 구성 파일을 저장하십시오.

관련: gedit를 사용하여 Linux에서 그래픽으로 텍스트 파일을 편집하는 방법

노크 제어 파일 편집

knockd 제어 파일은 완전히 간단합니다. 그러나 우리가 그것을 편집하기 전에 네트워크 연결의 내부 이름을 알아야 합니다. 그것을 찾으려면 다음 명령을 입력하십시오.

 IP 주소 

광고

이 기계가 이 기사를 조사하기 위해 사용하는 연결을 enp0s3 이라고 합니다. 연결 이름을 기록해 두십시오.

다음 명령은 knockd 제어 파일을 편집합니다.

 sudo gedit /etc/default/knockd 

다음은 gedit 에 있는 knockd 파일입니다.

gedit의 knockd 제어 파일.

수정해야 할 몇 가지 사항은 빨간색으로 강조 표시되어 있습니다.

편집이 강조 표시된 gedit의 knockd 제어 파일.

"START_KNOCKD=" 항목을 0에서 1로 변경했습니다.

또한 "KNOCKD_OPTS=" 항목의 시작 부분에서 해시 # 을 제거하고 "eth1"을 네트워크 연결 이름인 enp0s3 으로 대체했습니다. 물론 네트워크 연결이 eth1 이면 변경하지 않습니다.

그 증거는 푸딩에 있다

이것이 작동하는지 확인할 때입니다. 다음 명령으로 knockd 데몬을 시작할 것입니다.

 sudo systemctrl 노크 시작 

광고

이제 다른 머신으로 이동하여 연결을 시도합니다. 우리는 포트 노킹을 설정하기 위해서가 아니라, knockd 패키지가 knock 이라는 또 다른 도구를 제공하기 때문에 그 컴퓨터에 knockd 도구를 설치했습니다. 우리는 이 기계를 사용하여 우리의 비밀 순서대로 발사하고 우리를 위해 노크를 할 것입니다.

다음 명령을 사용하여 IP 주소가 192.168.4.24인 호스트 컴퓨터를 노크하는 포트의 포트에 연결 요청의 비밀 시퀀스를 보냅니다.

 노크 192.168.4.24 7000 8000 9000 -d 500

이것은 knock 가 IP 주소 192.168.4.24에 있는 컴퓨터를 대상으로 하고 포트 7000, 8000 및 9000에 대한 연결 요청을 차례로 실행하도록 지시합니다. 이때 포트 사이에는 500밀리초의 -d (지연)가 있습니다.

그런 다음 "dave"라는 사용자가 192.168.4.24에 SSH 요청을 합니다.

 SSH 데이브@192.168.4.24

연결이 수락되고 암호를 입력하면 원격 세션이 시작됩니다. 그의 명령 프롬프트는 dave@nostromo dave@howtogeek 변경됩니다. 원격 컴퓨터에서 로그아웃하려면 다음을 입력합니다.

 출구

그의 명령 프롬프트는 로컬 컴퓨터로 돌아갑니다. knock 를 한 번 더 사용하고 이번에는 역순으로 포트를 대상으로 하여 원격 컴퓨터의 SSH 포트를 닫습니다.

 노크 192.168.4.24 9000 8000 7000 -d 500 

광고

분명히 이것은 특히 유익한 원격 세션은 아니었지만 포트 노킹을 통해 포트를 열고 닫는 것을 보여주고 단일 스크린샷에 맞습니다.

그래서, 이것은 다른 쪽에서 어떻게 생겼습니까? 포트 노킹 호스트의 시스템 관리자는 다음 명령을 사용하여 시스템 로그에 도착한 새 항목을 봅니다.

 꼬리 -f /var/log/syslog 

  • 세 개의 openSSH 항목이 표시됩니다. 이는 각 포트가 원격 노크 유틸리티의 대상이 될 때 발생합니다.
  • 트리거 시퀀스의 세 단계가 모두 충족되면 "OPEN SESAME"이라는 항목이 기록됩니다.
  • iptables 규칙 목록에 규칙을 삽입하는 명령이 전송됩니다. 정확한 비밀 노크(192.168.4.23)를 제공한 PC의 특정 IP 주소에서 포트 22의 SSH를 통한 액세스를 허용합니다.
  • 사용자 "dave"는 몇 초 동안만 연결한 다음 연결을 끊습니다.
  • 세 개의 closeSSH 항목이 표시됩니다. 이는 각 포트가 원격 노크 유틸리티의 대상이 될 때 발생합니다. 이는 포트 노킹 호스트에게 포트 22를 닫도록 지시합니다.
  • 세 단계가 모두 트리거된 후 "OPEN SESAME" 메시지가 다시 표시됩니다. 규칙을 제거하기 위해 명령이 방화벽으로 전송됩니다. (왜 항구를 닫을 때 "CLOSE SESAME"을 하지 않습니까? 누가 압니까?)

이제 포트 22에 관한 iptables 규칙 목록의 유일한 규칙은 해당 포트를 닫기 위해 처음에 입력한 규칙입니다. 따라서 포트 22는 이제 다시 닫힙니다.

머리에 노크

그것이 포트 노킹의 응접실 트릭입니다. 기분 전환으로 취급하고 현실 세계에서 하지 마십시오. 또는 꼭 필요한 경우 보안의 유일한 형태로 의존하지 마십시오.