포트 노킹 알아보기
포트 노킹은 누군가가 비밀을 안다는 것을 증명하기 전까지 서비스를 보이지 않게 합니다. 이 가이드에서는 작동 방식, 널리 쓰이는 두 구현인 knockd와 fwknop, 그리고 실제 환경에서 노크가 실패하는 이유를 설명합니다.
포트 노킹의 작동 방식
방화벽은 보호된 포트로의 모든 연결을 차단하므로 스캐너에는 아무것도 보이지 않습니다. 작은 데몬이 방화벽에 도달하는 트래픽을 감시합니다. 하나의 출발지 주소가 예상된 패턴을 만들면 데몬은 해당 주소를 허용하는 방화벽 규칙을 추가하며, 일반적으로는 짧은 시간 동안만 허용합니다.
이 패턴이 노크입니다. knockd에서는 특정 포트에 특정 순서와 시간 제한 안에 보내는 연결 시도 시퀀스입니다. fwknop에서는 암호화된 패킷 하나입니다.
knockd: 노크 시퀀스
knockd는 인터페이스에서 수신 대기하며 /etc/knockd.conf의 시퀀스와 연결 시도를 대조합니다. 시퀀스에는 TCP 및 UDP 포트를 함께 사용할 수 있습니다. 일치하면 knockd가 명령을 실행합니다. 일반적으로 노크를 보낸 주소(%IP%)를 위한 iptables 또는 nftables 규칙입니다.
이 예시는 노크를 보낸 주소에 SSH를 열고 10초 후 다시 닫습니다. 방화벽이 이미 설정된 연결을 허용한다면 기존 SSH 세션은 계속 작동합니다.
[options]
UseSyslog
[openSSH]
sequence = 7311:tcp,8822:tcp,9133:udp
seq_timeout = 10
tcpflags = syn
start_command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT 직접 포트를 선택하고 공개된 예시의 포트를 절대 재사용하지 마세요. tcpflags = syn은 knockd가 SYN 플래그가 있는 패킷, 즉 연결 시도의 첫 번째 패킷만 계산하도록 합니다.
fwknop: Single Packet Authorization
fwknop은 시퀀스를 AES로 암호화되고 HMAC으로 인증되는 UDP 패킷 하나로 바꿉니다. 서버의 fwknopd는 이를 수동적으로 캡처하고 검증하며, 재생 여부를 확인한 후 패킷 안의 주소에 요청된 포트를 엽니다.
fwknop --key-gen으로 키를 생성하고 서버의 access.conf에 넣으세요. Secret Knock은 .fwknoprc에서 클라이언트 측 설정을 가져옵니다.
SOURCE ANY
OPEN_PORTS tcp/22
KEY_BASE64 <output of fwknop --key-gen>
HMAC_KEY_BASE64 <output of fwknop --key-gen>
FW_ACCESS_TIMEOUT 30 허용할 주소가 암호화된 패킷 안에 포함되므로 SPA는 패킷을 보내는 주소가 아닌 다른 주소에 포트를 열 수 있습니다. 예를 들어 모바일 데이터의 휴대폰에서 다른 장소의 노트북을 위해 노크할 때 유용합니다.
노크가 실패하는 이유
- IPv4와 IPv6: 노크는 한 주소 체계로 전송되었지만 SSH는 다른 주소 체계로 연결됩니다. 방화벽이 현재 사용하지 않는 주소에 문을 열었습니다.
- 다른 공인 주소: 모바일 데이터, 통신사 NAT 또는 VPN 뒤에서는 서버가 예상과 다른 IP를 볼 수 있습니다. 노크를 보내는 주소를 확인하세요.
- 재전송된 SYN: TCP 노크에 응답이 없으면 클라이언트 운영체제는 동일한 SYN을 다시 보냅니다. 테스트에서 knockd 0.8은 이렇게 반복된 SYN에서 시퀀스를 재설정했으므로, 클라이언트는 각 노크를 한 번만 보내고 시도를 빠르게 중단해야 합니다.
- 타이밍: seq_timeout 밖에 도착하거나 순서가 틀린 노크는 시퀀스를 처음부터 다시 시작합니다.
- 중간 장비: 일부 네트워크는 비정상적인 포트의 트래픽을 차단하거나 변경하므로, 집에서 작동하는 노크가 호텔이나 사무실 네트워크에서는 실패할 수 있습니다.
안전한가요?
knockd 시퀀스는 암호화되지 않은 채 전송되므로 트래픽을 볼 수 있는 사람은 누구나 이를 재생할 수 있습니다. SSH 키 대신이 아니라 그 앞에서, 스캐너로부터 서비스를 숨기는 용도로 사용하세요. fwknop SPA는 암호화, HMAC 및 재생 방지로 이 문제를 해결하며, 트래픽이 관찰될 수 있다면 더 나은 선택입니다.
iPhone, Mac 및 Apple Watch에서 노크하기
Secret Knock은 iPhone, iPad 및 Mac에서 knockd 시퀀스와 fwknop SPA 패킷을 보내고, 포트 응답을 확인한 뒤 SSH 앱을 엽니다. watchOS는 앱이 원시 TCP 또는 UDP 패킷을 보내는 것을 허용하지 않으므로 Apple Watch는 페어링된 iPhone을 통해 노크합니다. iPhone에서 멀리 떨어져 있을 때는 이를 지원하는 서버에 HTTP를 통해 SPA를 보낼 수 있습니다.
사용 중인 설정을 위한 가이드
문은 닫아 두고. 노크는 가지고 다니세요.
Secret Knock은 iPhone, iPad, Mac 및 Apple Watch용으로 App Store에 출시될 예정입니다.
Secret Knock →