기술 가이드

Ubuntu에서 Port Knocking 설치 및 설정

7 min read 보안 업데이트됨 20 Oct 2025
Ubuntu에서 Port Knocking 설치 및 설정
Ubuntu에서 Port Knocking 설치 및 설정

개요

Port Knocking은 외부에서 포트 스캐너에 의한 노출을 줄이기 위한 방법입니다. 기본 아이디어는 특정 포트(예: 22번 SSH)를 기본적으로 차단해 두고, 클라이언트가 미리 합의된 포트들의 일련의 접속 시퀀스를 올바른 순서와 시간 내에 수행하면 방화벽 규칙이 동적으로 변경되어 해당 클라이언트 IP에 대해 포트를 열어 주는 것입니다.

간단 정의: Port Knocking — 보호된 포트를 닫아 두고, 올바른 포트 “노크” 시퀀스를 받아서 그 클라이언트에게만 임시로 포트를 허용하는 기법.

중요: Port Knocking은 단독으로 완전한 보안 대책은 아닙니다. SSH 키 인증, 강력한 암호화 및 로그 모니터링 등 다른 방어층과 함께 사용해야 효과적입니다.

H2: 주요 용어(한 줄 정의)

  • knockd: Port Knocking을 구현하는 리눅스 데몬(백그라운드 서비스).
  • seq_timeout: 순서에 맞춰 포트들을 노크할 수 있는 시간(초).
  • %IP%: knockd 구성에서 실제 노크를 보낸 클라이언트 IP로 대체되는 변수.
  • tcpflags: knock 패킷에서 검사할 TCP 플래그 (예: syn).

H2: 사용 시나리오와 장단점

장점:

  • 포트 스캐닝 시 포트가 닫혀 보이기 때문에 공격 표면 감소.
  • SSH 접속 IP를 동적으로 허용하여 접근 제어 강화.
  • 구성과 운영이 비교적 단순하고 기존 iptables와 함께 동작.

단점 및 한계:

  • 동작을 노출시키는 기본 시퀀스를 그대로 쓰면 보안에 취약. (항상 시퀀스와 포트 번호를 변경)
  • 중간자 공격(MITM)이나 패킷 캡처에 의해 시퀀스가 유출될 수 있음.
  • 시간 제약(seq_timeout) 때문에 자동화가 없으면 불편.
  • 방화벽/네트워크 장비에서 SYN 패킷 필터링이나 패킷 재순서화가 발생하면 실패 가능.
  • IPv6 환경에서는 별도 ip6tables 설정 필요.

H2: 적용 가능한 대안(빠른 비교)

  • Single Packet Authorization(SPA, 예: fwknop): 단일 패킷에 암호화된 토큰을 담아 더 안전함.
  • VPN: 내부망에 연결된 클라이언트만 SSH 접근 가능하게 해 근본적으로 노출을 줄임.
  • 포트 변경 + 키 기반 인증 + fail2ban: 간단하지만 자동 스캐닝 방어 효과는 제한적.
  • nftables: 최신 시스템에서는 iptables 대신 nftables로 방화벽을 구성.

1단계: 필수 패키지 확인 및 설치

모든 명령은 루트 사용자로 실행해야 합니다. 편의를 위해 로컬에서 루트로 전환합니다:

sudo su

패키지 목록 업데이트:

apt-get update

OpenSSH 서버 설치(이미 설치된 경우 건너뛰기):

apt-get install openssh-server

knockd(포트 노킹 데몬) 설치:

apt-get install knockd

(설치 중 출력 예시는 Debian/Ubuntu 저장소에서 패키지를 가져오는 표준 메시지입니다.)

knockd 설치 스크린샷

iptables 설치:

apt-get install iptables

참고: 시스템에 따라 iptables가 이미 설치되어 있을 수 있습니다. 최신 Ubuntu 릴리스에서는 nftables 기반 구성도 고려하세요.

2단계: iptables 규칙 추가(기본 예제)

기존 규칙을 초기화하고 출력(아웃바운드)을 허용합니다:

iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables --policy OUTPUT ACCEPT

현재 연결과 관련된 트래픽을 허용(중요 — 그렇지 않으면 현재 SSH 세션이 끊길 수 있음):

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

주의: 위 규칙에서 “ESTABLISHED,RELATED”의 쉼표 좌우에 공백이 없더라도 정상 동작합니다.

SSH 포트(예: 22)를 차단하는 규칙 예제:

iptables -A INPUT -p tcp --destination-port 22 -j DROP

규칙을 저장하고 재부팅 시 복원하려면 iptables-persistent 패키지를 사용합니다:

apt-get install iptables-persistent

설치 과정에서 IPv4와 IPv6 규칙을 저장할지를 물어보면 Yes를 선택합니다.

설치 스크린샷 예시:

iptables-persistent 설치 1

iptables-persistent 설치 2

빈 ALT 이미지도 번역하여 설명을 추가합니다:

현재 규칙을 파일로 저장하려면:

iptables-save

예시 출력(설명 포함):

# Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016
*filter
:INPUT ACCEPT [1:40]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1976]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Tue Feb 23 04:59:28 2016

이제 외부에서 SSH 포트는 기본적으로 차단되어 있으되, 기존 연결은 유지됩니다.

3단계: knockd 구성

knockd의 설정 파일을 편집합니다:

nano /etc/knockd.conf

기본적인 섹션 예시는 다음과 같습니다:

[options]
 UseSyslog
 
[openSSH]
 sequence = 7000,8000,9000
 seq_timeout = 5
 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
 tcpflags = syn
 
[closeSSH]
 sequence = 9000,8000,7000
 seq_timeout = 5
 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
 tcpflags = syn

설명:

  • [options] 섹션에서 UseSyslog는 로그를 syslog로 보냅니다. logfile 옵션으로 파일 경로를 지정할 수도 있습니다.
  • openSSH / closeSSH는 예시 명칭입니다. openSSH는 올바른 시퀀스가 들어왔을 때 SSH 포트를 허용하는 규칙을 추가합니다. closeSSH는 해당 규칙을 삭제합니다.
  • knockd는 %IP%를 자동으로 노크를 보낸 클라이언트의 IP로 대체합니다.
  • sequence의 포트와 순서는 반드시 변경하세요(기본 7000,8000,9000은 잘 알려져 있습니다).
  • seq_timeout은 모든 포트를 순서대로 노크해야 하는 최대 시간(초)입니다.
  • tcpflags = syn은 SYN 패킷만 검사하겠다는 의미입니다. 다른 플래그를 쓸 경우 네트워크 특성에 따라 실패 가능성이 있으니 신중히 선택하세요.

이미지: knockd 설정 파일 편집 화면

knockd.conf 편집 화면

knockd 자동 시작 설정

다음 파일을 편집하여 knockd를 부팅 시 자동 시작하도록 설정합니다:

nano /etc/default/knockd

파일에서:

START_KNOCKD=0

START_KNOCKD=1

로 변경합니다. 네트워크 인터페이스를 지정해야 하는 경우 KNOCKD_OPTS 변수에 옵션을 추가할 수 있습니다.

서비스 시작:

service knockd start

이제 정의한 시퀀스로 노크하면 iptables 규칙이 변경되어 SSH 접속이 허용됩니다.

H2: 접속 테스트

Port Knocking이 활성화된 상태에서는 SSH에 직접 접속할 수 없습니다(타임아웃 혹은 연결 무응답).

컨트롤-C로 시도 중인 SSH를 강제 종료하세요.

테스트: telnet 클라이언트 사용

Linux에서 telnet이 없으면 설치:

apt-get install telnet

Windows: “Turn Windows features on or off”에서 Telnet Client 활성화.

다음 명령으로 포트를 순서대로 노크합니다(사용자 정의 시퀀스로 교체):

telnet youripaddress 7000
telnet youripaddress 8000
telnet youripaddress 9000

seq_timeout 값(위 예제에서는 5초) 안에 모든 노크를 완료해야 합니다. 완료 후 SSH로 접속하면 정상적으로 연결됩니다.

닫을 때는 역순으로 노크합니다:

telnet youripaddress 9000
telnet youripaddress 8000
telnet youripaddress 7000

권장: telnet 대신 더 간단한 클라이언트(예: knock 유틸리티)를 사용하는 것이 편리합니다. knockd 패키지에는 클라이언트 프로그램이 포함된 경우가 많습니다. 예시:

knock -v youripaddress 7000 8000 9000

(knock 클라이언트가 설치되어 있지 않다면 apt으로 설치하거나 간단한 스크립트로 대체 가능)

H2: 운영 중 고려사항 및 트러블슈팅

  • 방화벽 중첩: 클라우드 제공업체(예: AWS Security Group, GCP 방화벽)의 규칙이 OS 레벨 iptables와 충돌하지 않는지 확인하세요.
  • NAT/프록시: 클라이언트가 NAT 뒤에 있거나 프록시를 통과하면 노크를 보낸 IP와 서버가 인식하는 IP가 다를 수 있습니다.
  • 패킷 재전송 및 순서 변경: 네트워크 환경에 따라 포트 노크 순서가 꼬일 수 있습니다. seq_timeout을 늘려보거나 다른 tcpflags 사용을 고려하세요.
  • 시스템 재시작 및 서비스 관리: Systemd 기반 시스템에서는 /etc/default/knockd 대신 systemd 유닛 파일을 통해 옵션을 넘겨줄 수 있습니다. 자동 시작이 안 될 경우 systemctl status knockd로 상태를 확인하세요.
  • IPv6: IPv6을 사용하는 환경에서는 ip6tables와 별도 규칙이 필요합니다. knockd가 ip6을 지원하는지 확인하고 ip6tables 규칙을 추가하세요.

H2: 보안 하드닝 권장사항

  • SSH는 키 인증만 허용하고, 비밀번호 인증은 비활성화하세요.
  • Port Knocking 시퀀스를 주기적으로 변경하거나 고유한 시퀀스를 사용하세요.
  • knockd 로그를 중앙 로그 서버로 전송하여 이상 접근을 모니터링하세요.
  • 가능하면 SPA(Single Packet Authorization, 예: fwknop)를 검토하세요. SPA는 노출/재전송 위험을 줄이기 위해 암호화된 페이로드를 사용합니다.
  • 관리자 접속 IP가 고정되어 있다면, iptables 정책에서 사전에 허용하는 것이 더 안전할 수 있습니다.
  • rate limit(속도 제한) 규칙으로 brute-force 노크 시도를 억제하세요.

H2: 역할별 체크리스트

운영자(관리자):

  • knockd와 iptables 규칙 백업 및 복구 절차 수립
  • 로그 및 경보 정책 구성
  • 시퀀스, 포트, seq_timeout을 문서화하되 안전하게 보관

네트워크 엔지니어:

  • 방화벽/라우터에서 포트 필터링이 노크를 방해하지 않는지 확인
  • 클라우드 보안 그룹과 OS 방화벽 충돌 점검

보안 담당자:

  • Port Knocking 적용 시 보안 정책과의 정합성 검토
  • SPA 도입 가능성 평가

H2: 회수(롤백) 및 복구 절차

문제 발생 시 신속 복구를 위한 절차 예시:

  1. 물리적 콘솔 또는 클라우드 제공업체의 직접 콘솔 접속 시도.
  2. 부팅 시 복구 모드로 들어가서 /etc/iptables/rules.v4 백업 파일을 복원 또는 불필요한 DROP 규칙 제거.
  3. /etc/default/knockd에서 START_KNOCKD=0으로 변경 후 서비스 재시작.
  4. SSH 접근이 복구되면 변경사항을 단계별로 다시 적용하며 원인 분석.

H2: 테스트 케이스 및 수락 기준

테스트 케이스 예시:

  • TC1: 정의된 시퀀스 시간 내에 노크를 수행하면 SSH 접속이 성공해야 한다.
  • TC2: 잘못된 순서로 노크하면 SSH 접속이 차단되어야 한다.
  • TC3: 노크 시퀀스 외부의 IP에서 요청이 들어오면 포트는 여전히 차단되어야 한다.
  • TC4: 재부팅 후 iptables 규칙이 자동으로 복원되어야 한다.

수락 기준:

  • 위 테스트 케이스 모두 통과.
  • knockd 로그에서 올바른 오픈/클로즈 이벤트가 남아야 함.

H2: 간단 명령 치트시트

  • 루트 쉘로 전환: sudo su
  • 패키지 업데이트: apt-get update
  • knockd 설치: apt-get install knockd
  • iptables 규칙 플러시: iptables –flush
  • 현재 규칙 저장: iptables-save > /root/iptables-backup.v4
  • knockd 시작: service knockd start
  • 시스템 상태 확인(systemd): systemctl status knockd

H2: 대안과 언제 Port Knocking이 적절치 않은가

적절치 않은 경우:

  • 클라우드 환경에서 이미 강력한 네트워크 레벨 방화벽(VPC 보안 그룹 등)을 운영 중일 때.
  • 다양한 클라이언트 환경(NAT, 모바일 네트워크)에서 노크의 신뢰도가 떨어질 때.
  • 고가용성(HA) 환경에서 상태 동기화 없이 단일 노드의 iptables 규칙만 변경될 때.

대안:

  • VPN으로 내부망에 접속 후 SSH 사용(가장 안전)
  • SPA(예: fwknop)를 사용하여 암호화된 단일 패킷 인증 적용
  • Zero Trust 네트워크 모델 도입

H2: 결론 요약

Port Knocking은 추가 보안층을 제공하는 간단한 방법이지만 단독으로 완전한 솔루션은 아닙니다. SSH 키 인증, 중앙 로그 수집, 패치 관리, 그리고 필요 시 SPA나 VPN과 결합하면 보안성이 크게 향상됩니다. 운영 중에는 네트워크, NAT, IPv6와 같은 환경적 제약을 항상 점검하고 자동화된 복구 절차를 마련하세요.

중요: Port Knocking을 적용할 때는 테스트 환경에서 충분히 확인한 후 운영 환경에 배포하세요.


요약: 아래의 “핵심 요약”과 “핵심 체크포인트”를 참고하여 설치 및 운영을 진행하세요.

핵심 요약:

  • knockd + iptables로 포트 노킹을 구성한다.
  • iptables에서 SSH 포트를 기본 차단하고, 노크 시퀀스에 따라 클라이언트 IP를 허용한다.
  • seq_timeout, tcpflags, 시퀀스 포트는 환경에 맞게 조정 및 보안적으로 변경해야 한다.

핵심 체크포인트:

  • SSH는 키 인증으로 강제화
  • knockd 로그 확인 및 중앙화
  • 클라우드 레벨 방화벽 규칙과 충돌 점검
  • IPv6 규칙과 동기화
공유하기: X/Twitter Facebook LinkedIn Telegram
저자
편집

유사한 자료

Excel 셀 내부 이미지 삽입 및 관리 가이드
생산성

Excel 셀 내부 이미지 삽입 및 관리 가이드

터미널에서 완전한 작업 공간 만들기
생산성

터미널에서 완전한 작업 공간 만들기

프롬프트 기반 2단계 인증(2FA) 공격과 방어
보안

프롬프트 기반 2단계 인증(2FA) 공격과 방어

브라우저 기록 숨기기 실전 가이드
프라이버시

브라우저 기록 숨기기 실전 가이드

Roku에서 YouTube TV 작동 안함 문제 완전 해결
How To

Roku에서 YouTube TV 작동 안함 문제 완전 해결

Windows에서 웹 이미지 단축키로 빠르게 저장하기
튜토리얼

Windows에서 웹 이미지 단축키로 빠르게 저장하기