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 차단 정책 적용 스크립트를 실행하는 시스템 서비스를 작성한다.
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 내부망 접속 테스트를 한다.
'웹 서버, WAS, 미들웨어 > OpenVPN' 카테고리의 다른 글
| OpenVPN Access Server 에 DCO를 설정하자 (0) | 2026.06.29 |
|---|---|
| OpenVPN-AS 3.1.0 에서 3.2.1 로 업데이트 하기 (0) | 2026.06.24 |
| OpenVPN Access Server 3.2 출시 및 변경점 정리 (0) | 2026.06.08 |
| OpenVPN Access Server 디버그 및 로그 확인하는 방법 (0) | 2026.03.25 |
| OpenVPN Access Server가 사용하는 포트를 명령어로 변경하는 방법 (0) | 2026.03.18 |
댓글