Loading...

Lab: Dựng IPsec VPN Dialup (Dynamic IP) trên FortiGate

1. Liên hệ thực tế

Anh Nam dựng lại đúng 2 tình huống chị Lan đã nói: một chi nhánh dùng ADSL IP động kết nối về Hub theo kiểu Site-to-Site, và một user dùng FortiClient kết nối dialup từ bên ngoài. Chị Lan nhắc: "Lab này khác Lab Site-to-Site tĩnh ở chỗ — em không gõ remote-gw ở phía Hub, và phải kiểm tra kỹ net-device/mode-cfg cho đúng từng kịch bản, gõ nhầm là tunnel lên nhưng traffic không đi được."

Lab dựng lại đúng 2 kịch bản đã học ở bài lý thuyết: Hub (trụ sở chính, IP tĩnh) nhận kết nối từ Chi nhánh B (IP động, đóng vai trò Site-to-Site) và từ FortiClient (user di động, dùng mode-cfg + EAP).


2. Kiến thức cốt lõi — Các bước thực hành

2.1 Sơ đồ Lab

Thiết bịWAN IPLAN/PoolVai trò
FGT-Hub 198.51.100.5/24 (tĩnh) 10.1.0.0/16 (internal) Hub — type dynamic, chờ kết nối
FGT-ChiNhanhB IP động (DHCP từ ADSL, giả lập trong Lab) 10.3.0.0/16 (internal) Peer Site-to-Site IP động
FortiClient PC IP động (bất kỳ mạng nào) Nhận IP ảo từ pool 10.9.9.1–10.9.9.100 Peer Dialup cá nhân

Yêu cầu môi trường: 2 FortiGate (FGT-Hub, FGT-ChiNhanhB) + 1 máy cài FortiClient VPN (hoặc FortiClient trong VM), FGT-ChiNhanhB nên đặt wan1 ở chế độ DHCP client để giả lập IP động thực sự thay đổi.

Sơ đồ Lab: IPsec VPN Dialup (Dynamic IP) LAN - HQ 10.1.0.0/16 PC test: 10.1.1.10 FGT-Hub internal (LAN) wan1: 198.51.100.5 (tĩnh) vpn-chinhanh-b (type dynamic) net-device enable vpn-forticlient-dialup mode-cfg + eap, pool 10.9.9.0/24 peertype any INTERNET IPsec Dialup FGT-ChiNhanhB internal (LAN) wan1: IP động (DHCP) vpn-hub (type static) remote-gw 198.51.100.5 LAN - Chi nhánh B 10.3.0.0/16 PC test: 10.3.1.10 FortiClient PC IP động (bất kỳ mạng nào) user: nam.nguyen (EAP) nhận IP ảo 10.9.9.x Policy 210/211: HQ - ChiNhanhB Policy 212: FortiClient - HQ

2.2 Bước 1 — Cấu hình phía Hub (FGT-Hub): Site-to-Site cho Chi nhánh B

config vpn ipsec phase1-interface
    edit "vpn-chinhanh-b"
        set type dynamic
        set interface "wan1"
        set peertype any
        set authmethod psk
        set psksecret "MatKhauManhCanKy2024!"
        set proposal aes256gcm-prfsha384
        set dhgrp 21
        set net-device enable
        set add-route disable
        set dpd on-idle
        set dpd-retrycount 3
        set dpd-retryinterval 20
    next
end

config vpn ipsec phase2-interface
    edit "vpn-chinhanh-b-p2"
        set phase1name "vpn-chinhanh-b"
        set proposal aes256gcm
        set pfs enable
        set dhgrp 21
        set src-subnet 10.1.0.0 255.255.0.0
        set dst-subnet 10.3.0.0 255.255.0.0
    next
end

⚠️ Điểm dễ sai #1: Gõ nhầm thêm set remote-gw vào Phase 1 dynamic — tham số này không hợp lệ với type dynamic và sẽ bị FortiGate từ chối hoặc gây lỗi cấu hình.

2.3 Bước 2 — Cấu hình phía Chi nhánh B (FGT-ChiNhanhB): peer chủ động kết nối

config vpn ipsec phase1-interface
    edit "vpn-hub"
        set type static
        set interface "wan1"
        set remote-gw 198.51.100.5
        set authmethod psk
        set psksecret "MatKhauManhCanKy2024!"
        set proposal aes256gcm-prfsha384
        set dhgrp 21
        set dpd on-idle
    next
end

config vpn ipsec phase2-interface
    edit "vpn-hub-p2"
        set phase1name "vpn-hub"
        set proposal aes256gcm
        set pfs enable
        set dhgrp 21
        set src-subnet 10.3.0.0 255.255.0.0
        set dst-subnet 10.1.0.0 255.255.0.0
    next
end

Lưu ý: phía Chi nhánh B vẫn dùng type static vì chi nhánh biết chính xác IP của Hub (Hub mới là bên IP không cố định theo góc nhìn kết nối — thực ra ở đây Hub có IP tĩnh, Chi nhánh B mới là bên IP động; Chi nhánh B luôn là bên chủ động gọi đi nên vẫn khai remote-gw trỏ về Hub).

2.4 Bước 3 — Routing cho Site-to-Site IP động

Vì Phase 1 phía Hub đã bật net-device enable, Hub không cần khai static route thủ công — IPsec peer route sẽ tự động được tạo khi tunnel lên. Kiểm tra route tự động này:

get router info routing-table all

Tìm dòng route tới 10.3.0.0/16 xuất hiện tự động qua interface vpn-chinhanh-b sau khi tunnel established — nếu route không tự xuất hiện, kiểm tra lại net-device có đang enable không.

Phía Chi nhánh B thì cần khai static route như Lab Site-to-Site trước:

config router static
    edit 1
        set dst 10.1.0.0 255.255.0.0
        set device "vpn-hub"
    next
end

2.5 Bước 4 — Kiểm tra Phase 1/Phase 2 của Site-to-Site IP động

diagnose vpn ike gateway list
diagnose vpn tunnel list

Trên FGT-Hub, chú ý trường IP peer hiển thị trong diagnose vpn ike gateway list — đây chính là IP động hiện tại của Chi nhánh B mà Hub học được từ gói IKE đến, không phải giá trị cấu hình sẵn (vì Hub không hề khai remote-gw).

Thử nghiệm đổi IP động: Nếu môi trường cho phép, release/renew DHCP trên wan1 của FGT-ChiNhanhB để đổi IP, sau đó chờ tunnel tự tái thương lượng và kiểm tra lại diagnose vpn ike gateway list trên Hub — IP peer hiển thị phải cập nhật theo IP mới.

2.6 Bước 5 — Cấu hình Dialup cho FortiClient trên FGT-Hub

config user local
    edit "nam.nguyen"
        set type password
        set passwd "MatKhauUser2024!"
    next
end

config user group
    edit "VPN-Users"
        set member "nam.nguyen"
    next
end

config vpn ipsec phase1-interface
    edit "vpn-forticlient-dialup"
        set type dynamic
        set interface "wan1"
        set ike-version 2
        set peertype any
        set net-device disable
        set mode-cfg enable
        set eap enable
        set eap-identity send-request
        set authusrgrp "VPN-Users"
        set proposal aes256gcm-prfsha384
        set dhgrp 21
        set ipv4-start-ip 10.9.9.1
        set ipv4-end-ip 10.9.9.100
        set ipv4-netmask 255.255.255.0
        set dns-mode auto
        set dpd on-idle
        set dpd-retrycount 3
        set dpd-retryinterval 20
    next
end

config vpn ipsec phase2-interface
    edit "vpn-forticlient-dialup-p2"
        set phase1name "vpn-forticlient-dialup"
        set proposal aes256gcm
        set pfs enable
        set dhgrp 21
    next
end

⚠️ Điểm dễ sai #2: Quên tạo user local + user group trước khi gán vào authusrgrp — Phase 1 sẽ báo lỗi hoặc không cho phép enable eap vì thiếu nhóm user tham chiếu.

2.7 Bước 6 — Firewall Policy cho cả hai kịch bản

config firewall address
    edit "LAN-HQ"
        set subnet 10.1.0.0 255.255.0.0
    next
    edit "LAN-ChiNhanh-B"
        set subnet 10.3.0.0 255.255.0.0
    next
    edit "VPN-Client-Pool"
        set type iprange
        set start-ip 10.9.9.1
        set end-ip 10.9.9.100
    next
end

config firewall policy
    edit 210
        set name "hq-to-chinhanhb"
        set srcintf "internal"
        set dstintf "vpn-chinhanh-b"
        set srcaddr "LAN-HQ"
        set dstaddr "LAN-ChiNhanh-B"
        set action accept
        set schedule "always"
        set service "ALL"
    next
    edit 211
        set name "chinhanhb-to-hq"
        set srcintf "vpn-chinhanh-b"
        set dstintf "internal"
        set srcaddr "LAN-ChiNhanh-B"
        set dstaddr "LAN-HQ"
        set action accept
        set schedule "always"
        set service "ALL"
    next
    edit 212
        set name "forticlient-to-hq"
        set srcintf "vpn-forticlient-dialup"
        set dstintf "internal"
        set srcaddr "VPN-Client-Pool"
        set dstaddr "LAN-HQ"
        set action accept
        set schedule "always"
        set service "ALL"
    next
end

⚠️ Điểm dễ sai #3: Chỉ tạo 1 Policy chiều FortiClient → HQ mà quên rằng đa số ứng dụng cần phản hồi hai chiều trong cùng session — FortiGate xử lý stateful nên Policy 212 (một chiều) là đủ cho traffic do client khởi tạo, KHÔNG cần Policy ngược lại trừ khi HQ cần chủ động kết nối tới client (hiếm khi cần).

2.8 Bước 7 — Cấu hình và test FortiClient

Trên FortiClient (Windows/macOS):

  1. Tạo VPN connection mới, chọn IPsec VPN, Remote Gateway = IP public của FGT-Hub (198.51.100.5)
  2. Authentication Method: chọn theo đúng cấu hình Hub (ở đây EAP/username-password vì đã bật eap enable)
  3. Nhập username nam.nguyen / password đã tạo ở Bước 5
  4. Connect và quan sát log FortiClient

Trên FGT-Hub, kiểm tra kết nối dialup đã lên:

diagnose vpn tunnel list name vpn-forticlient-dialup
get vpn ipsec tunnel summary

Xác nhận client đã được cấp IP ảo trong dải 10.9.9.1–10.9.9.100 (get vpn ipsec tunnel summary hiển thị IP ảo được gán cho từng peer đang kết nối).

Từ FortiClient, ping thử vào LAN-HQ (ví dụ 10.1.1.10):

ping 10.1.1.10

2.9 Bước 8 — Test DPD khi peer "biến mất" đột ngột

Ngắt kết nối FortiClient bằng cách rút cáp mạng/tắt wifi đột ngột (không disconnect qua UI) để giả lập peer mất kết nối không thông báo. Trên FGT-Hub, theo dõi:

diagnose vpn tunnel list name vpn-forticlient-dialup

Trong vài chu kỳ dpd-retryinterval (20 giây) x dpd-retrycount (3 lần), tunnel phải chuyển sang trạng thái down và IP ảo trong pool được giải phóng — nếu tunnel treo mãi ở trạng thái "up" dù client đã ngắt hẳn, kiểm tra lại cấu hình DPD đã bật đúng on-idle chưa.


3. Hỏi & Đáp

Trong Lab, tại sao Hub không hiện remote-gw nhưng vẫn biết traffic trả lời phải gửi về đúng peer nào?

FortiGate ghi nhận địa chỉ IP nguồn thực tế của gói IKE đến trong quá trình thiết lập Phase 1, gắn vào phiên tunnel động đó — mọi traffic trả lời trong phiên đó được gửi ngược lại đúng địa chỉ đã ghi nhận, không cần cấu hình tĩnh trước.

Nếu diagnose vpn tunnel list cho thấy dialup tunnel established nhưng FortiClient không nhận được IP ảo, nên kiểm tra gì?

Kiểm tra mode-cfg enable đã bật đúng chưa, dải ipv4-start-ip/ipv4-end-ip có bị trùng với dải IP khác đang dùng trong mạng nội bộ không, và xác nhận authusrgrp tham chiếu đúng group chứa user đang thử kết nối — sai group khiến EAP xác thực thất bại trước khi kịp cấp IP ảo.

Vì sao Lab dùng dpd on-idle thay vì tắt hẳn DPD để tiết kiệm tài nguyên Hub khi có nhiều dialup tunnel?

Tắt hẳn DPD khiến Hub giữ nguyên tunnel "sống" trong bảng dù peer đã mất kết nối từ lâu (không có gói FIN như TCP để báo đóng phiên), gây lãng phí tài nguyên và địa chỉ IP ảo trong pool bị giữ chỗ vô thời hạn. dpd on-idle là điểm cân bằng: chỉ kiểm tra khi tunnel không có traffic, không tốn tài nguyên kiểm tra liên tục nhưng vẫn phát hiện được peer chết.


4. Quiz

Câu 1: Khi cấu hình Phase 1 phía Hub với type dynamic, IP của peer được Hub biết đến từ đâu?

  • A. Từ tham số remote-gw khai sẵn
  • B. Từ địa chỉ IP nguồn thực tế của gói IKE đến khi peer chủ động kết nối
  • C. Từ DNS lookup tự động
  • D. Hub không bao giờ biết IP của peer

Câu 2: Trong Lab, vì sao phía Chi nhánh B (dù có IP động) vẫn khai type staticremote-gw trỏ về Hub?

  • A. Vì FortiOS bắt buộc luôn dùng type static
  • B. Vì Chi nhánh B là bên chủ động gọi đi và biết chính xác IP tĩnh của Hub, dù bản thân Chi nhánh B có IP không cố định
  • C. Vì type dynamic chỉ dùng được cho FortiClient
  • D. Không có sự khác biệt, chọn loại nào cũng được

Câu 3: Nếu quên tạo user local/user group trước khi cấu hình authusrgrp cho Phase 1 dialup FortiClient, hậu quả gì?

  • A. Không ảnh hưởng, FortiGate tự tạo user mặc định
  • B. Phase 1 báo lỗi hoặc không cho phép enable eap vì thiếu nhóm user tham chiếu
  • C. Tunnel vẫn lên bình thường nhưng không mã hóa
  • D. Chỉ ảnh hưởng tới Phase 2, không ảnh hưởng Phase 1

Câu 4: Mục đích của bước test ở 2.9 (ngắt FortiClient đột ngột, không disconnect qua UI) là gì?

  • A. Kiểm tra tốc độ mã hóa của tunnel
  • B. Kiểm tra cơ chế DPD có phát hiện đúng peer đã mất kết nối và giải phóng IP ảo hay không
  • C. Kiểm tra Phase 2 proposal có đúng không
  • D. Không có mục đích cụ thể, chỉ là bước phụ

👉 Đáp án

Câu 1: B Với type dynamic, Hub không có remote-gw khai sẵn — IP của peer được Hub ghi nhận từ địa chỉ nguồn thực tế của gói IKE gửi đến khi peer chủ động kết nối.

Câu 2: B Chi nhánh B luôn là bên chủ động gọi đi tới Hub và biết chính xác IP tĩnh của Hub, nên phía Chi nhánh B vẫn dùng type static/remote-gw bình thường — bản chất "IP động" chỉ ảnh hưởng tới cấu hình phía Hub (bên nhận kết nối), không ảnh hưởng phía chủ động gọi đi.

Câu 3: B Thiếu user local/user group khiến authusrgrp tham chiếu tới một nhóm không tồn tại hoặc rỗng, khiến Phase 1 báo lỗi cấu hình hoặc không thể enable eap đúng cách.

Câu 4: B Bước này mô phỏng peer mất kết nối đột ngột không qua quy trình đóng phiên chuẩn, dùng để xác nhận DPD (dpd-retrycount x dpd-retryinterval) phát hiện đúng tunnel chết và giải phóng IP ảo trong pool, tránh tài nguyên bị giữ chỗ vô thời hạn.


📚 Bài Lab thuộc khóa học FortiGate của VNExperts

🧭 Điều hướng

⬅️ Bài lý thuyết🏠 Mục lục khóa họcBài kế tiếp ➡️
IPSec VPN qua Dynamic IP (Dialup) trên FortiGate Mục lục khóa học FortiGate IPsec Hardware Offload: tăng tốc bằng NP