2022年更新至Fedora 35適用
伺服器的設定
首先把strongSwan裝起來
dnf install strongswan
接著調整sysctl和防火牆的設定檔,我這邊的設定是讓使用者連上VPN之後直接往外網送,當作跳板使用
# 先將/etc/sysctl.conf裡加上這兩行 # net.ipv4.conf.all.forwarding = 1 # net.ipv6.conf.all.forwarding = 1 # 然後套用設定 sysctl -p
ipsec要建一個xfrm interface讓防火牆知道來源,但因為每次開機都要做一次,所以直接寫在crontab裡面
# /etc/crontab # ens3 是網路卡的名字 # if_id 是自己取的 file descriptor id,只要跟 strongswan 裡面設定的一樣就好 @reboot root ip link add ipsec0 type xfrm dev ens3 if_id 123 && ip link set ipsec0 up && ip route add 10.10.3.0/24 dev ipsec0 && ip route add fd12:3456:789a:1::/64 dev ipsec0
Fedora 35開始用Firewalld 1.0,已不提供direct interface修改底層防火牆操作,需另外透過rich rules調整
# 假設預設的外網zone叫做FedoraServer firewall-cmd --permanent --zone=FedoraServer --add-service=ipsec firewall-cmd --permanent --zone=FedoraServer --add-masquerade # rich rule只需要加ipv6,firewalld原生的masquerade會處理ipv4的部分 firewall-cmd --permanent --zone=FedoraServer --add-rich-rule='rule family="ipv6" source address="fd12:3456:789a:1::/64" masquerade' # 新增VPN的zone,把tunnel interface綁上去 firewall-cmd --permanent --new-zone=VpnClient firewall-cmd --permanent --zone=VpnClient --set-target=ACCEPT firewall-cmd --permanent --zone=VpnClient --add-interface=ipsec0 firewall-cmd --reload
然後就開始設定strongswan
新版strongswan已經不使用ipsec.conf,一律改用swanctl來做設定
/etc/strongswan/swanctl/conf.d/vpn.conf
connections {
ikev2-eap {
version = 2
# 可自行更換加密套件,但要注意用戶端是否支援
# Windows預設只支援modp1024,但那個已不安全,要開啟modp2048支援需修改登錄檔
# [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\RasMan\Parameters]
# "NegotiateDH2048_AES256"=dword:00000001
proposals = aes256-sha256-x25519,aes256-sha256-ecp384,aes256-sha256-ecp256,aes256-sha256-modp2048,aes256-sha1-modp2048
# rekey要設0,windows才不會壞掉
# 這邊理論上有其他折衷解法,但直接關掉比較穩
rekey_time = 0s
pools = primary-pool-ipv4, primary-pool-ipv6
fragmentation = yes
dpd_delay = 30s
# dpd_timeout doesn't do anything for IKEv2. The general IKEv2 packet timeouts are used.
send_cert = always
# xfrm interface id
# 這邊要跟 crontab 裡面設定的一樣
if_id_in = 123
if_id_out = 123
local-1 {
auth = pubkey
certs = server.crt.pem
id = @vpn.example.com
}
remote-1 {
auth = eap-mschapv2
# go ask the client for its eap identity.
eap_id = %any
}
children {
ikev2-eap {
local_ts = 0.0.0.0/0,::/0
# rekey要設0,windows才不會壞掉
rekey_time = 0s
dpd_action = clear
esp_proposals = aes256-sha256,aes256-sha1
}
}
}
}
pools {
primary-pool-ipv4 {
addrs = 10.10.3.0/24
dns = 8.8.8.8
}
primary-pool-ipv6 {
addrs = fd12:3456:789a:1::/64
dns = 2001:4860:4860::8888, 2001:4860:4860::8844
}
}
secrets {
private-server-key {
file = server.key.pem
}
eap-user1 {
id = user1
secret = "password"
}
eap-user2 {
id = user2
secret = "password"
}
}
authorities {
vpn-ca {
cacert = vpnca.crt.der
}
}
接著來產生憑證,這邊會用strongswan內建的pki來處理,這邊要注意的是產生server憑證時,一定要有ikeIntermediate的EKU,並且將主機的CN name加進SAN名單裏頭,這樣跨平台才不容易有問題
# 產生CA strongswan pki --gen --type rsa --size 2048 --outform pem > vpnca.key.pem strongswan pki --self --flag serverAuth --in vpnca.key.pem --type rsa --digest sha256 --dn "C=TW, O=Organization, CN=VPN CA" --ca > vpnca.crt.der # 產生server憑證 strongswan pki --gen --type rsa --size 2048 --outform pem > vpn.example.com.key.pem strongswan pki --pub --in vpn.example.com.key.pem --type rsa > vpn.example.com.csr strongswan pki --issue --cacert vpnca.crt.der --cakey vpnca.key.pem --digest sha256 --dn "C=TW, O=Organization, CN=vpn.example.com" --san "vpn.example.com" --flag serverAuth --flag ikeIntermediate --outform pem < vpn.example.com.csr > vpn.example.com.crt.pem # 複製過去 cp vpnca.crt.der /etc/strongswan/swanctl/x509ca/vpnca.crt.der cp vpn.example.com.crt.pem /etc/strongswan/swanctl/x509/server.crt.pem cp vpn.example.com.key.pem /etc/strongswan/swanctl/private/server.key.pem # 保護private key chown root:root /etc/strongswan/swanctl/private/server.key.pem chmod 600 /etc/strongswan/swanctl/private/server.key.pem
到這邊就完成了,可以先將服務打開
systemctl enable strongswan # 開機啟動 systemctl start strongswan # 現在啟動
用戶端的設定
Windows
1.將CA憑證下載到電腦裡
2.打開MMC,嵌入憑證管理,記得要選電腦帳戶(重要)

3.依照指示將CA憑證匯入到「信任的根憑證」

4.建立VPN連線,主機記得要填與憑證符合的名字,並選擇「單純建立不要立即連線」
5.打開VPN連線的設定,把安全性改成下面的樣子

6.完成
OSX
1.將CA憑證下載到電腦裡
2.點兩下匯入到系統裡
3.打開keychain,點選System,對著剛剛加進來的CA憑證按右鍵看內容,然後選取永遠信任

4.新增VPN連線,記得選IKEv2

5.Server Address跟Remote ID都填主機的名字,認證設定裡面給帳號密碼

6.完成
Android
1.將CA憑證下載到手機裡
3.打開設定->安全性->從儲存裝置安裝憑證。如果你的檔案選單全部都是灰色的,參照3-1步
3-1.安裝Astro文件管理器,從Astro裡面點選憑證,選取「透過憑證安裝程式開啟」
4.打開strongSwan,點選Add VPN Profile,依照圖中設定

5.從strongSwan點選已設定好的VPN進行連線
6.完成
這篇很有幫助,
感謝大大的文章.
目前Android沒問題,
但是Win10一直卡在 IKE 驗證認證不可接受(代碼13801),
這個問題大大有遇過嗎?
@脆笛酥
可能的原因
1. server上的憑證缺'Server Authentication'的EKU (Enhanced Key Usage)
2. server上的憑證過期
3. server的憑證沒成功裝在client上(注意前面的步驟要裝在"電腦帳戶"下面)
4. 憑證的subjectName和連線的對象不符(例:憑證寫xyz.com,但是VPN連線的主機名寫abc.com)
https://blogs.technet.microsoft.com/rrasblog/2009/08/12/troubleshooting-common-vpn-related-errors/
@脆笛酥
另外,我的設定範例裡面使用DH2048作為金鑰交換,這在全系列Windows上預設是不開啟支援的,需要調整登錄檔後重開機
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\RasMan\Parameters]
"NegotiateDH2048_AES256"=dword:00000001