본문 바로가기
웹 서버, WAS, 미들웨어/OpenVPN

OpenVPN-AS 인터넷 차단 정책 설정

by 연구자 공학코드 2026. 6. 30.

공지사항

  1. 제가 운영하는 IT·SI·SM 전문가 커뮤니티 아이티프로(https://cafe.naver.com/itpro)에 가입하시면 IT 개발 노하우와 SI 구축 및 사업관리 노하우, 솔루션 정보를 제공받으실 수 있습니다.

  2. 제가 운영하는 개발자 커뮤니티 코어큐브(https://cafe.naver.com/ewsncube)에 가입하시면 컴퓨터 관련 학습 자료와 질의응답을 제공받으실 수 있습니다.

728x90
반응형

VPN 환경

  • OpenVPN-AS 3.2.1
  • OS: Rocky Linux 9.7
  • 방화벽 엔진: nftables
  • VPN 클라이언트 대역: 172.27.224.0/20

정책 설정 목표

  • VPN 클라이언트 → 허용된 내부망만 허용, 그 외 인터넷 차단

OpenVPN-AS는 관리자 대시보드에 인터넷 차단 설정이 아직은 가능하지 않다. VPN 클라이언트의 인터넷 접속을 차단해야 한다면 VPN 서버의 운영체제 수준의 설정을 통해 VPN 클라이언트가 인터넷에 접속하지 못 하도록 차단할 수 있다.

기존 설정 백업

아래의 명령어를 입력하여 기존 OpenVPN-AS 설정과 라우팅 정보, 방화벽 정보를 백업한다.

BACKUP_DIR="/root/openvpn-before-egress-block-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "$BACKUP_DIR"

nft list ruleset > "$BACKUP_DIR/nft-ruleset.before"
iptables-save > "$BACKUP_DIR/iptables-save.before" 2>/dev/null || true
ip6tables-save > "$BACKUP_DIR/ip6tables-save.before" 2>/dev/null || true
ls -lh "$BACKUP_DIR"

/usr/local/openvpn_as/scripts/sacli Version > "$BACKUP_DIR/openvpn-as-version.before"
/usr/local/openvpn_as/scripts/sacli ConfigQuery > "$BACKUP_DIR/openvpn-as-config.before"
cat /usr/local/openvpn_as/etc/VERSION > "$BACKUP_DIR/openvpn-as-version-file.before"
systemctl status openvpnas --no-pager > "$BACKUP_DIR/openvpnas-status.before" || true

ip addr > "$BACKUP_DIR/ip-addr.before"
ip route > "$BACKUP_DIR/ip-route.before"
ss -tulpen > "$BACKUP_DIR/ss-tulpen.before"

tar czf "${BACKUP_DIR}.tar.gz" -C /root "$(basename "$BACKUP_DIR")"
ls -lh "${BACKUP_DIR}.tar.gz"

tar tzf "${BACKUP_DIR}.tar.gz" | head -n 30

백업된 화면

 

정책 설정

아래의 명령어를 입력하여 인터넷 차단 정책을 적용하는 스크립트를 작성한다.

cat > /usr/local/sbin/apply-openvpn-egress-guard.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

VPN_CLIENT_NET="172.27.224.0/20"

TABLE="vpn_egress_guard"
CHAIN="forward_guard"
SET="allowed_v4"

ALLOWED_NETS=(
  "10.0.0.0/24"
)

# 기존 커스텀 정책 제거
nft delete table inet "${TABLE}" 2>/dev/null || true

# 커스텀 테이블 생성
nft add table inet "${TABLE}"

# 허용 대상 set 생성
nft "add set inet ${TABLE} ${SET} {
  type ipv4_addr;
  flags interval;
}"

# 허용 내부망 등록
for NET in "${ALLOWED_NETS[@]}"; do
  nft add element inet "${TABLE}" "${SET}" "{ ${NET} }"
done

# FORWARD hook 체인 생성
nft "add chain inet ${TABLE} ${CHAIN} {
  type filter hook forward priority -50;
  policy accept;
}"

# 이미 수립된 연결 허용
nft add rule inet "${TABLE}" "${CHAIN}" ct state established,related accept

# VPN 클라이언트 → 허용된 내부망 허용
nft add rule inet "${TABLE}" "${CHAIN}" ip saddr "${VPN_CLIENT_NET}" ip daddr @"${SET}" accept

# VPN 클라이언트 → 그 외 전체 차단
nft add rule inet "${TABLE}" "${CHAIN}" ip saddr "${VPN_CLIENT_NET}" counter drop

nft list table inet "${TABLE}"
EOF

chmod +x /usr/local/sbin/apply-openvpn-egress-guard.sh

VPN 클라이언트의 인터넷 접속 차단 정책을 적용하는 스크립트가 작성된 화면

아래의 명령어를 입력하여 VPN 차단 정책 적용 스크립트를 실행하는 시스템 서비스를 작성한다.

cat > /etc/systemd/system/openvpn-egress-guard.service <<'EOF'
[Unit]
Description=Apply OpenVPN AS VPN client egress guard nftables rules
After=openvpnas.service network-online.target
Wants=network-online.target
Requires=openvpnas.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/apply-openvpn-egress-guard.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

시스템 서비스가 작성된 화면

 

아래의 명령어를 입력하여 시스템 서비스 데몬을 재적재하고 앞서 작성한 서비스가 자동 실행되도록 설정한 후 서비스를 실행한다.

systemctl daemon-reload
systemctl enable openvpn-egress-guard.service
systemctl start openvpn-egress-guard.service

서비스가 실행된 화면

아래의 명령어를 입력하여 작성한 서비스가 정상적으로 실행되는지 확인한다.

systemctl status openvpn-egress-guard.service --no-pager
nft list table inet vpn_egress_guard

시스템 서비스 상태를 확인한 화면

이후 OpenVPN 클라이언트로 접속한 다음 인터넷 접속과 VPN 내부망 접속 테스트를 한다.

728x90
반응형

댓글