Profile picture

[PNETLAB] Fortinet으로 Site-to-Site VPN, Remote Access VPN 구축하기!

JaehyoJJAng2025년 01월 15일

개요

안녕하세요 !~

오늘은 Fortinet의 FortiGate 방화벽을 사용해서 VPN을 구축하는 방법에 대해 기록해보려고 합니다!

특히 Site-to-Site VPNRemote Access VPN 두 가지 시나리오를 통해

실무에서 자주 쓰이는 설정을 UI(웹 인터페이스)와 CLI로 나눠서 자세히 알아보려고 해요.

제가 pnetlab에서 직접 실습해보며 기록한 것이기에 참고가 되었으면 좋겠습니다!



구성도

실습 토폴로지는 다음과 같이 구성하려고 합니다!
Image


Site-to-Site VPN 구축하기

시나리오

상황:

저는 서울에 있는 본사와 경기도에 있는 지사를 연결해야 했어요!

본사에는 ERP 서버(10.10.10.10/24)가 있고,

경기도 지사 직원들이 이 서버에 안전하게 접근해야 했죠.

공인 IP가 없는 실습 환경이라, NAT 뒤에서 설정한다고 가정했어요.


네트워크:

  • 본사 (HQ):
    • 외부 IP: 192.168.1.2/24 (Port1)
    • 내부 IP: 10.10.10.0/24 (Port2)
  • 지사 (Branch)
    • 외부 IP: 192.168.2.2/24 (Port1)
    • 내부 IP: 10.10.20.0/24 (Port2)

목표:

두 LAN간 안전한 통신을 위한 IPsec VPN 구축하기


UI에서 VPN 설정 방법

본사 (HQ) 설정

  • VPN 터널 생성
    • 웹 브라우저에서 HQ FortiGate의 IP(예: https://192.168.1.2)에 접속.
    • 메뉴: VPN > IPsec Wizard.
    • "Site to Site" 템플릿 선택 후 "Next".
    • Name: "HQ-to-Branch" 입력.
    • Remote Gateway: Static IP Address 선택, IP에 지사(Branch) 외부 IP(192.168.2.2) 입력.
    • Interface: Port1 선택.
    • "Next" 클릭.

Image
NAT configuration은 No NAT betwwen sites로 선택하였습니다.

  • No NAT Between Sites
    • 본사(HQ)와 지사(Branch) 양쪽 모두 공인 IP를 사용하고, 서로 간에 NAT(Network Address Translation)이 없는 경우에 적합.
    • 즉, 두 사이트의 외부 인터페이스 IP가 직접 통신 가능해야 함.

  • This Site is Behind NAT
    • 본사(HQ)가 NAT 뒤에 있는 경우(예: 사설 IP를 쓰고 라우터나 다른 방화벽에서 NAT 처리).
    • 지사는 공인 IP를 사용한다고 가정.

  • The Remote Site is Behind NAT
    • 지사(Branch)가 NAT 뒤에 있는 경우.
    • 본사는 공인 IP를 사용한다고 가정.


  • 인증 설정
    • Authentication Method: Pre-shared Key 선택.
    • Pre-shared Key: 예: securepassword123 입력하기. (지사와 동일해야 해요!)
    • "Next" 클릭.


  • 정책 및 라우팅 설정
    • Local Interface: 내부 인터페이스 (예: Port2).
    • Local Subnets: 10.10.10.0/24 입력.
    • Remote Subnets: 172.16.10.0/24 입력.
    • "Create" 클릭.


  • 방화벽 정책 추가
    • 메뉴: Policy & Objects > Firewall Policy.
    • "Create New" 클릭.
    • Name: "HQ-to-Branch".
    • Incoming Interface: 내부 인터페이스 (Port2).
    • Outgoing Interface: VPN 터널 (HQ-to-Branch).
    • Source: 10.10.10.0/24.
    • Destination: 172.16.10.0/24.
    • Action: Accept.
    • "OK" 클릭.
    • 반대 방향 정책도 생성 (VPN -> Port2, Source: 172.16.10.0/24, Destination: 10.10.10.0/24).

참고로 방화벽 정책의 경우 IPSec Wizard에서 VPN Tunnel을 생성할 때 자동으로 생성되기는 합니다만,

방화벽 버전에 따라서 자동으로 생성되지 않는 경우가 있을 수 있으니 위 정책 설정을 참고하시면 될 것 같아요.



  • 터널 상태 확인
    • 메뉴: Monitor > IPsec Monitor.
    • "HQ-to-Branch" 터널이 "Up" 상태인지 확인.


지사 (Branch) 설정

  • VPN 터널 생성
    • 웹 브라우저에서 지사 FortiGate의 IP(예: https://192.168.2.2)에 접속.
    • 메뉴: VPN > IPsec Wizard.
    • "Site to Site" 템플릿 선택 후 "Next".
    • Name: "HQ-to-Branch" 입력.
    • Remote Gateway: Static IP Address 선택, IP에 본사(HQ) 외부 IP(192.168.1.2) 입력.
    • Interface: Port1 선택.
    • "Next" 클릭.


  • 인증 설정
    • Authentication Method: Pre-shared Key 선택.
    • Pre-shared Key: 예: securepassword123 입력하기. (본사와 동일해야 해요!)
    • "Next" 클릭.


  • 정책 및 라우팅 설정
    • Local Interface: 내부 인터페이스 (예: Port2).
    • Local Subnets: 172.16.10.0/24 입력.
    • Remote Subnets: 10.10.10.0/24 입력.
    • "Create" 클릭.


  • 방화벽 정책 추가
    • 메뉴: Policy & Objects > Firewall Policy.
    • "Create New" 클릭.
    • Name: "Branch-to-HQ".
    • Incoming Interface: 내부 인터페이스 (Port2).
    • Outgoing Interface: VPN 터널 (Branch-to-HQ).
    • Source: 172.16.10.0/24.
    • Destination: 10.10.10.0/24.
    • Action: Accept.
    • "OK" 클릭.
    • 반대 방향 정책도 생성 (VPN -> Port2)


  • 터널 상태 확인
    • 메뉴: Monitor > IPsec Monitor.
    • "HQ-to-Branch" 터널이 "Up" 상태인지 확인.


CLI에서 VPN 설정 방법

본사 (HQ) 설정

HQ Fortigate에 콘솔로 접속 후 다음 명령어를 입력해주면 됩니다 !~

config vpn ipsec phase1-interface
    edit "HQ-to-Branch"
        set interface "port1"
        set peertype any
        set remote-gw 192.168.2.2
        set psksecret "securepassword123"
        set proposal aes256-sha256
    next
end

config vpn ipsec phase2-interface
    edit "HQ-to-Branch"
        set phase1name "HQ-to-Branch"
        set src-subnet 10.10.10.0 255.255.255.0
        set dst-subnet 172.16.10.0 255.255.255.0
        set proposal aes256-sha256
    next
end

config router static
    edit 1
        set dst 172.16.10.0 255.255.255.0
        set gateway 192.168.2.2
        set device "HQ-to-Branch"
    next
end

config firewall policy
    edit 1
        set name "HQ-to-Branch"
        set srcintf "port2"
        set dstintf "HQ-to-Branch"
        set srcaddr "10.10.10.0/24"
        set dstaddr "172.16.10.0/24"
        set action accept
        set schedule "always"
        set service "ALL"
    next
    edit 2
        set name "Branch-to-HQ"
        set srcintf "HQ-to-Branch"
        set dstintf "port2"
        set srcaddr "172.16.10.0/24"
        set dstaddr "10.10.10.0/24"
        set action accept
        set schedule "always"
        set service "ALL"
    next
end

위 명령 실행 후, 터널 상태 확인하기!

get vpn ipsec tunnel details

지사 (Branch) 설정

Branch fortigate에 접속한 후 다음 명령어 실행하기!

config vpn ipsec phase1-interface
    edit "Branch-to-HQ"
        set interface "port1"
        set peertype any
        set remote-gw 192.168.1.2
        set psksecret "securepassword123"
        set proposal aes256-sha256
    next
end

config vpn ipsec phase2-interface
    edit "Branch-to-HQ"
        set phase1name "Branch-to-HQ"
        set src-subnet 172.16.10.0 255.255.255.0
        set dst-subnet 10.10.10.0 255.255.255.0
        set proposal aes256-sha256
    next
end

config router static
    edit 1
        set dst 10.10.10.0 255.255.255.0
        set gateway 192.168.1.2
        set device "Branch-to-HQ"
    next
end

config firewall policy
    edit 1
        set name "Branch-to-HQ"
        set srcintf "port2"
        set dstintf "Branch-to-HQ"
        set srcaddr "172.16.10.0/24"
        set dstaddr "10.10.10.0/24"
        set action accept
        set schedule "always"
        set service "ALL"
    next
    edit 2
        set name "HQ-to-Branch"
        set srcintf "Branch-to-HQ"
        set dstintf "port2"
        set srcaddr "10.10.10.0/24"
        set dstaddr "172.16.10.0/24"
        set action accept
        set schedule "always"
        set service "ALL"
    next
end

마찬가지로 지사도 터널 상태 확인 !~

get vpn ipsec tunnel details

Remote Access VPN 구축하기

그럼 이번에는 Remote Access VPN을 구축하는 방법에 대해서 알아봅시다!~


시나리오

상황:

경기도 지사에서 일하던 제가 갑작스럽게 대구로 출장을 가게 됐어요.

대구에서 본사 ERP 서버에 접근해야 하는데,

기존 Site-to-Site VPN은 지사에만 연결돼 있어서 새로 설정이 필요했죠.

그래서 본사 FortiGate에 Remote Access VPN을 추가하기로 했어요.


네트워크:

  • 본사 (HQ)
    • 외부 인터페이스: Port1 (IP: 192.168.1.2/24)
    • 내부 LAN: 10.10.10.0/24
    • 기존: Site-to-Site VPN 이미 운영 중.

  • 출장자 (Remote User)
    • 외부에서 FortiClient로 접속
    • 할당받을 IP 대역 (10.10.30.0/24 - VPN 사용자용 별도 서브넷)

목표:

출장 중에도 본사 내부망(10.10.10.0/24)에 접근 가능하도록 SSL VPN 설정.


UI에서 VPN 설정 방법

1. SSL VPN 설정

  • 1-1. SSL VPN 포털 생성
    • 본사 FortiGate 웹 UI 접속 (https://192.168.1.2).
    • 메뉴: VPN > SSL-VPN Portals.
    • "Create New" 클릭.
    • Name: "Remote-Access-Portal".
    • Enable Split Tunneling: 체크 해제 (모든 트래픽이 VPN으로 가도록 설정).
    • Source IP Pools: "Create New"로 VPN 사용자용 IP 풀 생성 (예: "SSL-VPN-Pool", 10.10.20.10-10.10.20.50).
    • Portal Settings: "Web Mode"나 "Tunnel Mode" 선택 (Tunnel Mode 추천).
    • "OK" 클릭.

  • 1-2. SSL VPN 설정
    • 메뉴: VPN > SSL-VPN Settings.
    • Listen on Interface: Port1 선택.
    • Listen on Port: 기본 443 (필요 시 변경).
    • Server Certificate: 기본 인증서 사용 또는 자체 인증서 선택.
    • IP Pools: "SSL-VPN-Pool" 선택.
    • Authentication/Portal Mapping:
      • "Create New" 클릭.
      • Users/Groups: "All" 또는 특정 사용자 그룹 선택.
      • Portal: "Remote-Access-Portal" 선택.
    • "Apply" 클릭.

  • 1-3. 사용자 및 그룹 생성
    • 메뉴: User & Authentication > User Definition.
    • "Create New" > "Local User".
    • Username: "remoteuser", Password: "remotepass123".
    • "OK" 클릭.
    • User & Authentication > User Groups:
      • "Create New", Name: "VPN-Users".
      • Members: "remoteuser" 추가.

2. 방화벽 정책 추가

  • 2-1. 정책 생성
    • 메뉴: Policy & Objects > Firewall Policy.
    • "Create New" 클릭.
    • Name: "SSL-VPN-to-LAN".
    • Incoming Interface: "ssl.root" (SSL VPN 터널 인터페이스).
    • Outgoing Interface: 내부 인터페이스 (예: Port2).
    • Source: "SSL-VPN-Pool" (10.10.20.0/24).
    • Destination: "10.10.10.0/24".
    • Service: "ALL".
    • Action: Accept.
    • "OK" 클릭.

  • 2-2. 반대 방향 정책 (필요 시)
    • Incoming Interface: Port2.
    • Outgoing Interface: "ssl.root".
    • Source: "10.10.10.0/24".
    • Destination: "SSL-VPN-Pool".
    • Action: Accept.

3. 테스트

  • 출장자가 FortiClient를 설치하고, 본사 외부 IP(192.168.1.2)와 포트(443)로 접속.
  • 사용자 이름("remoteuser")과 비밀번호 입력 후 연결.
  • 내부망(10.10.10.x) 핑 테스트로 접근 확인.

CLI에서 VPN 설정 방법

본사 Fortigate 콘솔에 접속 후 아래 명령어 실행하기 !~


1. SSL VPN 설정

config vpn ssl settings
    set servercert "Fortinet_Factory"  # 또는 자체 인증서 이름
    set tunnel-ip-pools "SSL-VPN-Pool"
    set source-interface "port1"
    set source-address "all"
    set default-portal "Remote-Access-Portal"
    config authentication-rule
        edit 1
            set groups "VPN-Users"
            set portal "Remote-Access-Portal"
        next
    end
end

config vpn ssl web portal
    edit "Remote-Access-Portal"
        set tunnel-mode enable
        set ip-pools "SSL-VPN-Pool"
        set split-tunneling disable
    next
end

config firewall address
    edit "SSL-VPN-Pool"
        set type iprange
        set start-ip 10.10.20.10
        set end-ip 10.10.20.50
    next
end

2. 사용자 및 그룹 설정

config user local
    edit "remoteuser"
        set type password
        set passwd "remotepass123"
    next
end

config user group
    edit "VPN-Users"
        set member "remoteuser"
    next
end

3. 방화벽 정책 설정

config firewall policy
    edit 1
        set name "SSL-VPN-to-LAN"
        set srcintf "ssl.root"
        set dstintf "port2"
        set srcaddr "SSL-VPN-Pool"
        set dstaddr "10.10.10.0/24"
        set action accept
        set schedule "always"
        set service "ALL"
    next
    edit 2
        set name "LAN-to-SSL-VPN"
        set srcintf "port2"
        set dstintf "ssl.root"
        set srcaddr "10.10.10.0/24"
        set dstaddr "SSL-VPN-Pool"
        set action accept
        set schedule "always"
        set service "ALL"
    next
end

4. 마지막으로 ssl vpn 상태 확인 !~

get vpn ssl monitor

연결된 사용자와 IP 할당 상태 보면 됩니다 !


추가 팁!

  • FortiClient: 출장자는 FortiClient를 다운로드해 SSL VPN 모드로 설정. 본사 IP(192.168.1.2)와 포트(443)를 입력하고 로그인.
  • NAT: 외부 IP가 공인 IP가 아닌 경우, Port1에 NAT 설정이 필요할 수 있어요~
  • 보안 강화: MFA(이중 인증)를 추가하거나, 특정 IP에서만 접속 가능하도록 제한 가능합니다!


테스트

  • 본사 LAN(10.10.10.x)에서 지사 LAN(172.16.10.x)으로 ping 테스트해보기!
  • 터널이 정상적으로 작동하면 통신이 가능해야 해요~

아래 테스트 사진은 Site-to-Site VPN 구축했을 때 지사(172.16.10.0/24)에서 본사(10.10.10.0/24)의 ERP 서버로 Ping을 보내본 것입니다!
Image


그리고 Forti UI로 들어가서 터널 상태 확인해보면?
Image
이렇게 정상적으로 data가 넘어가고 있쥬?



트러블슈팅

Tunnel Status가 Innactive에서 변하질 않아요

Tunnel status가 Innactive에서 변하지 않는다면 tunnel 설정이 잘못 되었을 가능성이 높아요!


실제 네트워크 환경과 설정 불일치

No NAT Between Sites는 본사와 지사 모두 공인 IP를 사용하고 NAT가 없어야 한다는 뜻이에요.

하지만 PnetLAB와 같은 시뮬레이션 환경에선

두 FortiGate의 외부 인터페이스(예: 192.168.1.2, 192.168.2.2)가 사설 IP일 가능성이 높아요.

이 경우 실제로 NAT가 필요하거나, PNETLAB 내부 라우팅 구성이 맞지 않을 수 있으니 확인이 필요해요!



NAT 설정 미반영

만약 본사나 지사 중 하나라도 NAT 뒤에 있다면(예: EVE-NG에서 외부 네트워크로 나가는 경로에 NAT가 적용됨),

"No NAT" 설정은 터널이 올라오지 않게 만들 수 있어요.

IPsec은 NAT 환경에서 추가 설정(NAT-T, NAT Traversal)이 필요하기 때문이에요!



기타 구성 문제

NAT 설정 외에도 IPsec 터널이 Inactive가 되는 이유는 다양합니다.

인터페이스 연결성, PSK 불일치, Phase 1/2 설정 오류 등.

NAT 설정이 원인이 아닐 수도 있으니 점검이 필요해요!


해결 방법

네트워크 환경 확인

본사 외부 IP(192.168.1.2)와 지사 외부 IP(192.168.2.2)가 실제로 서로 직접 통신 가능한지 확인해봐요.

먼저 ping 명령을 사용해서 192.168.2.2 (본사 -> 지사), ping 192.168.1.2 (지사 -> 본사)를 해보면 좋을 것 같아요.


핑이 안 되면 EVE-NG의 네트워크 토폴로지나 라우팅 설정을 점검 해야겠죠?


NAT 여부 확인

두 IP가 사설 IP라면 PnetLab 환경에서 외부로 나가는 경로에 NAT가 적용됐을 가능성이 있어요.

이 경우 "No NAT Between Sites"는 틀린 선택이 될 수 있어요.


터널 상태 디버깅

CLI에서 다음 명령어를 실행해서 문제 원인이 뭔지 확인해봅시다.

diagnose debug enable
diagnose debug application ike -1

IKE(Internet Key Exchange) 로그를 보고 에러 메시지 확인(예: "No proposal chosen"은 Phase 1 불일치, "NAT detection failed"는 NAT 문제).


터널 상태 확인

get vpn ipsec tunnel details

Inactive 이유가 NAT 관련인지, 다른 설정 문제인지 힌트를 얻을 수 있어요.


제 경우에는 IPSec tunnel페이지에서

Status 창에 들어가서 Innactive된 VPN tunnel을 클릭한 후에 Bring Up을 눌러 Phase를 모두 활성화했더니 정상적으로 터널링이 되었습니다!
Image



VPN 삭제가 안될 때

  • 방화벽 정책/라우팅에서 참조 제거 후 삭제.
  • CLI: diagnose sys checkused로 의존성 점검.

마무리

위 설정을 적절하게 사용해서 본사와 지사를 연결하고,

출장 중에도 내부망에 쉽게 접근이 가능했습니다!

fortinet에서는 위처럼 강력한 VPN 기능을 제공하고 있으니 관심 있다면 실습해보세요!

    Tag -

Loading script...