macOS SSH/VNC 원격 접속 보안 강화 가이드 - 포트 변경 및 ACL 설정
오랜만에 macOS를 새로 설치하면서 포트 변경과 ACL 설정에 대해 기록을 남깁니다.
기본 포트는 당연히 다른 포트번호로 바꿔야 하고,
보안을 더욱 강화하기 위해 특정 IP에서만 접속이 가능하도록 ACL(Access Control List)을 설정하는 내용입니다.
macOS도 보안이 점점 강해지다보니 운영체제 버전이 높아지면서 방법도 계속 바뀌네요.
2026년 1월, macOS Sequoia 15.7.3 환경에서 정상 동작을 확인했습니다.
이 글에서는 포트 변경이 왜 중요한지,
그리고 ACL 설정으로 어떻게 보안을 한층 더 강화할 수 있는지 차근차근 설명합니다.
기본 포트의 위험성
원격 접속은 편리하지만, 보안 위협에 노출되기 쉽습니다.
SSH 22번 포트, VNC 5900번 포트는 누구나 아는 기본 포트입니다.
공격자들은 이 포트를 대상으로 포트 스캔을 하고, 무작위 대입 공격을 시도합니다.
포트 번호를 변경하는 것만으로도 이런 공격 대부분을 회피할 수 있습니다.
실제로 많은 기업의 보안 정책에서 기본 포트 변경을 필수로 지정하고 있을 만큼 효과가 큽니다.
여기에 IP 기반 ACL(Access Control List)까지 설정하면 어떨까요?
포트 스캔으로 열린 포트를 찾더라도, 허용된 IP가 아니면 접속 자체가 불가능합니다.
조금 불편할 수 있지만, 이 설정까지 하면 원격 접속 보안이 매우 강력해집니다.
더욱이 상시 포트가 열려있는 서비스에 대해서는 스캔 공격이 엄청나게 들어오기 때문에
반드시 ACL을 설정하시라고 말씀드리고 싶습니다.
자, 이 포스팅에서는 아래의 예시로 설정 방법을 보여드리겠습니다.
| 서비스 | 기본 포트 | 변경 포트 | 허용 IP |
|---|---|---|---|
| SSH | 22 | 12428 | 192.168.100.0/24, 172.16.0.82, 172.16.0.83 |
| VNC | 5900 | 49917 | 192.168.100.0/24, 172.16.0.82, 172.16.0.83 |
포트 번호와 허용 IP는 임의로 작성한 예시입니다.
본인 환경에 맞게 변경하여 설정하세요.
참고로 이 포스팅은 macOS가 유선 네트워크에 고정 IP를 사용하는 것을 전제로 합니다.
macOS 원격 접속 설정의 한계
macOS 시스템 설정에서 원격 접속을 켜면 바로 사용할 수 있습니다.
하지만 보안 강화 측면에서는 한계가 있습니다.
| 항목 | 시스템 설정 | 한계 |
|---|---|---|
| SSH | 원격 로그인 | 포트 22 고정, 변경 불가 |
| 방화벽 | Application Firewall | 앱 단위 제어만 가능, IP 기반 ACL 불가 |
| 시스템 파일 | /System/Library/ | SIP(System Integrity Protection)로 수정 불가 |
또한 시스템 기본 SSH는 /System/Library/LaunchDaemons/ssh.plist를 사용합니다.
이 파일은 SIP 보호 영역에 있어서 포트를 변경할 수 없습니다.
macOS의 Application Firewall은 앱 단위로만 허용/차단이 가능합니다.
특정 IP에서만 접속을 허용하는 ACL 기능이 없습니다.
설정 방법이 단순하여 편리하기는 하지만
저처럼 세밀하게 설정하고 싶은 사람에게는 기능 제한이 아쉽기는 합니다.
이 한계를 극복하기 위해 다음 방법을 사용합니다.
- SSH: 시스템 원격 로그인 대신
커스텀 LaunchDaemon 사용 - 방화벽: Application Firewall 대신
PF(Packet Filter) 사용 - VNC: 시스템 화면 공유 사용 +
PF로 포트 포워딩 및 접근 제한
SSH 포트 변경
sshd_config 포트 변경
SSH 설정 파일에서 포트를 변경합니다.
sudo vi /etc/ssh/sshd_config
Port 항목을 찾아 주석을 제거하고 원하는 포트로 변경합니다.
Port 12428
시스템 원격 로그인 비활성화
시스템 설정 → 일반 → 공유 → 원격 로그인을 OFF로 설정합니다.
시스템 기본 SSH를 켜두면 변경할 수 없는 22번 포트로 기본 SSH가 실행됩니다.
우리는 커스텀 포트를 사용할 것이기 때문에 기본 원격 로그인은 비활성화하고
LaunchDaemon을 생성하여 실행합니다.
SSH LaunchDaemon 생성
시스템 기본 SSH 대신 사용할 커스텀 서비스를 만듭니다.
sudo vi /Library/LaunchDaemons/com.user.sshd.plist
다음 내용을 입력합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.sshd</string>
<key>Program</key>
<string>/usr/sbin/sshd</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/sshd</string>
<string>-D</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
생성한 plist 파일의 권한을 설정하고 서비스를 시작합니다.
sudo chown root:wheel /Library/LaunchDaemons/com.user.sshd.plist
sudo chmod 644 /Library/LaunchDaemons/com.user.sshd.plist
sudo launchctl load /Library/LaunchDaemons/com.user.sshd.plist
SSH 포트 리스닝 점검
SSH가 변경된 포트에서 리스닝하는지 확인합니다.
sudo lsof -i :12428
정상적으로 설정되었다면 아래와 비슷하게 포트 리스닝하는 것을 볼 수 있습니다.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 12345 root 3u IPv4 0x1234567890abcdef 0t0 TCP *:12428 (LISTEN)
sshd 12345 root 4u IPv6 0xfedcba0987654321 0t0 TCP *:12428 (LISTEN)
VNC 화면 공유 서비스 실행
VNC는 macOS 환경설정의 화면 공유 기능을 그대로 사용합니다.
추후 포트 변경과 IP 제한을 PF 방화벽에서 처리할 것입니다.
시스템 설정 → 일반 → 공유 → 화면 공유를 ON으로 설정합니다.
그리고 외부 IP에서 VNC 연결을 허용하도록 다음 명령을 실행합니다.
sudo defaults write /Library/Preferences/com.apple.RemoteManagement VNCOnlyLocalConnections -bool no
이 설정이 보안상 위험해 보일 수 있지만
우리는 VNC 서비스의 포트번호를 변경하고 특정 IP만 접속할 수 있도록 ACL 설정을 할 것입니다.
자, 이제 PF 방화벽을 확인하여 보안설정을 강화합시다!
PF 설정으로 서비스 포트 변경 및 ACL 설정
macOS에는 PF(Packet Filter)라는 강력한 방화벽이 내장되어 있습니다.
Application Firewall과 별개로 동작하며, IP 기반 ACL과 포트 포워딩이 가능합니다.
특정 IP만 접속 가능하게 하는 ACL 설정은 실제 사용에 불편할 수 있습니다.
미리 지정한 IP에서 연결하는게 아니라면 본인도 접속할 수 없으니까요.
하지만 이 불편함을 감수할 만큼 효과가 큽니다.
포트 스캔으로 열린 포트를 찾더라도 허용 IP가 아니면 접속이 차단됩니다.
원격 접속 보안을 확실하게 강화하고 싶다면 꼭 설정하시길 권장합니다.
정보보안에서 의외로 강력한 방법이 접근 자체를 못하도록 IP를 차단해 버리는 것입니다.
만약 다양한 IP에서 접속해야 한다면 VPN 사용을 고려하세요.
VPN 대역을 허용 IP에 추가하면 VPN 접속만으로 ACL을 통과하게 됩니다.
이렇게 하면 ACL의 보안성을 유지하면서도 편의성을 확보할 수 있습니다.
PF 규칙 파일 생성
sudo vi /etc/pf.anchors/vnc_ssh_security
다음 내용을 입력합니다.
table <allowed_ips> persist { 192.168.100.0/24, 172.16.0.82, 172.16.0.83 }
rdr pass on en0 inet proto tcp from <allowed_ips> to any port 49917 -> 172.16.1.104 port 5900
pass in quick on en0 inet proto tcp from <allowed_ips> to any port 12428 keep state
pass in quick on en0 inet proto tcp from <allowed_ips> to any port 49917 keep state
block drop in quick on en0 inet proto tcp from any to any port 5900
block drop in quick on en0 inet proto tcp from any to any port 12428
block drop in quick on en0 inet proto tcp from any to any port 49917
pass in quick on lo0 all
pass out quick on lo0 all
규칙 설명:
table <allowed_ips>: 접속을 허용할 IP 목록입니다.rdr pass: 49917 포트로 들어오는 트래픽을 5900(VNC)으로 포워딩합니다.pass in quick: 허용 IP에서 해당 포트 접속을 허용합니다.block drop in quick: 모든 IP에서 해당 포트를 차단합니다. 허용 규칙이 먼저 매칭되므로 허용 IP는 통과합니다.
en0은 유선 네트워크 인터페이스입니다. 본인 환경에 맞게 확인하세요.
172.16.1.104는 이 Mac의 IP 주소입니다. 본인 환경에 맞게 변경하세요.
pf.conf 수정
sudo vi /etc/pf.conf
com.apple anchor 앞에 다음 내용을 추가합니다.
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "vnc_ssh_security"
rdr-anchor "com.apple/*"
dummynet-anchor "com.apple/*"
anchor "vnc_ssh_security"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "vnc_ssh_security" from "/etc/pf.anchors/vnc_ssh_security"
rdr-anchor와 anchor를 com.apple/* 앞에 배치해야 규칙 우선순위가 올바르게 적용됩니다.
자동 시작 LaunchDaemon 등록
재부팅 후에도 PF가 자동으로 시작되도록 설정합니다.
sudo vi /Library/LaunchDaemons/com.user.pfctl.plist
다음 내용을 입력합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.pfctl</string>
<key>Program</key>
<string>/sbin/pfctl</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/pfctl</string>
<string>-e</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
plist 파일의 권한을 설정하고 서비스를 등록합니다.
sudo chown root:wheel /Library/LaunchDaemons/com.user.pfctl.plist
sudo chmod 644 /Library/LaunchDaemons/com.user.pfctl.plist
sudo launchctl load /Library/LaunchDaemons/com.user.pfctl.plist
PF 규칙 적용
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
정상적으로 설정되었다면 특별히 출력되는 내용이 없을 것이고,
만약 오류가 발생한다면 오류 메시지가 나타날 것입니다.
설정 검증
자, 이제 모든 설정이 끝났으면 정상 동작하는지 확인해 봅시다.
아래의 명령어로 서비스 리스닝 상태를 확인할 수 있습니다.
# SSH
sudo lsof -i :12428
# VNC
sudo lsof -i :5900
아래의 명령어로 PF 상태를 확인할 수 있습니다.
# PF 활성화 상태
sudo pfctl -s info | head -3
# 허용 IP 테이블 확인
sudo pfctl -a vnc_ssh_security -t allowed_ips -T show
# 규칙 확인
sudo pfctl -a vnc_ssh_security -s rules
# rdr 규칙 확인
sudo pfctl -a vnc_ssh_security -s nat
허용 IP의 컴퓨터에서 nmap을 이용하여 아래 명령어로 포트 서비스를 점검합니다.
# 포트 스캔
nmap -Pn -p 22,5900,12428,49917 172.16.1.104
# 예상 결과:
# 22/tcp closed
# 5900/tcp filtered
# 12428/tcp open
# 49917/tcp open
# SSH 연결
ssh -p 12428 [email protected]
# VNC 연결
open vnc://172.16.1.104:49917
더 정확하게 확인하기 위해 허용되지 않은 IP에서 nmap으로 점검해 봅시다.
# 포트 스캔
nmap -Pn -p 22,5900,12428,49917 172.16.1.104
# 예상 결과:
# 22/tcp closed
# 5900/tcp filtered
# 12428/tcp filtered
# 49917/tcp filtered
마무리
주요 설정 파일을 정리합니다.
| 파일 | 용도 |
|---|---|
/etc/ssh/sshd_config |
SSH 포트 설정 |
/Library/LaunchDaemons/com.user.sshd.plist |
SSH 커스텀 서비스 |
/etc/pf.anchors/vnc_ssh_security |
PF 규칙 (ACL, 포트 포워딩) |
/etc/pf.conf |
PF 메인 설정 |
/Library/LaunchDaemons/com.user.pfctl.plist |
PF 자동 시작 서비스 |
주의사항:
- 시스템 설정 → 원격 로그인을 켜면 22번 포트로 SSH가 추가로 실행됩니다. 반드시 OFF 상태를 유지하세요.
- 시스템 설정 → 방화벽(Application Firewall)은 PF와 별개입니다. 둘 다 켜면 충돌할 수 있으므로 Application Firewall은 OFF를 권장합니다.
- 허용 IP를 변경하려면
/etc/pf.anchors/vnc_ssh_security파일의table <allowed_ips>를 수정한 후sudo pfctl -f /etc/pf.conf를 실행하세요. - 재부팅 후에도 모든 설정이 자동 적용됩니다.
포트 변경만으로도 대부분의 무작위 공격을 막을 수 있습니다.
여기에 ACL까지 설정하면 원격 접속 보안이 한층 강력해집니다.
조금은 번거롭지만 정보보안 사고가 발생하지 않도록
반드시 상시 서비스하는 포트는 포트번호를 변경하고 ACL을 설정하여 IP 접속을 제한하시기 바랍니다.