macOS에는 기본적으로 pf(Packet Filter)라는 방화벽 기능이 내장되어 있습니다. 이를 이용해 PostgreSQL(15432 포트)과 SSH(22 포트)의 접속을 특정 IP만 허용하도록 제어할 수 있습니다. 특히 IP 리스트를 데이터베이스에서 관리하면, 서버 관리 효율성과 보안성을 동시에 확보할 수 있습니다.
1. FastAPI를 통한 pf 규칙 적용
아래 코드는 FastAPI에서 /apply_ips API를 호출했을 때 DB에서 허용 IP를 조회하고, pf 규칙을 갱신하는 예제입니다.
@router.get("/apply_ips")
def apply_ips(user: str = Depends(get_current_user)):
print("Apply IPs Called")
# ✅ DB에서 허용할 IP 리스트 조회
df = tdm1.getAllrounder('allowed_ips_all', {})
# ✅ pf anchor 파일 지정
pf_conf = "/etc/pf.anchors/postgres"
with open(pf_conf, "w") as f:
# PostgreSQL 기본 차단
f.write("block in on en0 proto tcp from any to any port 5432\n")
# SSH 기본 차단
f.write("block in on en0 proto tcp from any to any port 22\n")
for row in df['list']:
ip = row['ip_address']
# PostgreSQL 허용
f.write(f"pass in on en0 proto tcp from {ip} to any port 5432\n")
# SSH 허용
f.write(f"pass in on en0 proto tcp from {ip} to any port 22\n")
# ✅ pf 규칙 다시 로드 및 활성화
subprocess.run(["sudo", "pfctl", "-f", "/etc/pf.conf"])
subprocess.run(["sudo", "pfctl", "-e"])
2. pf 설정 구조
2.1 Anchor 파일
위 코드는 /etc/pf.anchors/postgres 파일을 직접 갱신합니다.
예시는 다음과 같습니다.
block in on en0 proto tcp from any to any port 15432
block in on en0 proto tcp from any to any port 22
pass in on en0 proto tcp from 12.113.65.104 to any port 5432
pass in on en0 proto tcp from 12.113.65.104 to any port 22
...
2.2 /etc/pf.conf에 anchor 등록
anchor 파일을 불러오기 위해 /etc/pf.conf에 다음 내용을 추가해야 합니다.
anchor "postgres"
load anchor "postgres" from "/etc/pf.anchors/postgres"
2.3 pf 적용 및 확인
규칙 적용:
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
적용된 규칙 확인:
sudo pfctl -sr
sudo pfctl -a postgres -sr
3. pf가 꺼져 있는 이유
macOS는 기본적으로 pf가 비활성화된 상태로 부팅됩니다.
즉, pfctl -f로 규칙만 불러오면 적용되지 않고, 반드시 pfctl -e로 활성화해야 합니다.
재부팅 시 pf가 다시 꺼지므로, 항상 사용하려면 자동 실행 설정이 필요합니다.
4. pf 자동 실행 설정 (launchd 사용)
4.1 LaunchDaemon 생성
/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>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>
4.2 권한 설정 및 등록
sudo chown root:wheel /Library/LaunchDaemons/com.user.pfctl.plist
sudo chmod 644 /Library/LaunchDaemons/com.user.pfctl.plist
sudo launchctl load -w /Library/LaunchDaemons/com.user.pfctl.plist
5. 정리
- macOS pf는 기본적으로 꺼져 있으며, pfctl -e로 활성화해야 한다.
- anchor 파일을 이용해 DB 기반으로 PostgreSQL/SSH 접근 제어를 자동화할 수 있다.
- /etc/pf.conf에 load anchor 설정이 반드시 필요하다.
- 부팅 시 pf가 자동으로 켜지도록 launchd 설정을 추가하면 관리가 훨씬 편리해진다.
이렇게 구성하면 DB에서 허용할 IP를 관리하고, pf 규칙에 자동 반영하여 보안성과 관리 편의성을 동시에 확보할 수 있습니다.