IPsec IKEv2 server on Fedora (RHEL, CentOS)

這回我改用Fedora 23來做測試,但RHEL和CentOS因為同樣使用EPEL上的strongSwan,所以操作起來是一樣的

目前已在Win7、OSX 10.11、Android 6.0上做過測試,前兩者可透過原生用戶端連線,設定的部分會在最後面說明

伺服器的設定

首先把strongSwan裝起來

# dnf就是yum,只是新版的名字不同,語法都一樣
dnf install strongswan

接著調整sysctl和防火牆的設定檔,我這邊的設定是讓使用者連上VPN之後直接往外網送,當作一個跳板使用

# 先將/etc/sysctl.conf裡加上這兩行
# net.ipv4.conf.all.forwarding = 1
# net.ipv6.conf.all.forwarding = 1
# 然後套用設定
sysctl -p

iptables版本

# IPv4
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p ah -j ACCEPT

iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.10.3.0/24 -m policy --dir in --pol ipsec -j ACCEPT
iptables -A FORWARD -d 10.10.3.0/24 -m policy --dir out --pol ipsec -j ACCEPT

iptables -t nat -A POSTROUTING -s 10.10.3.0/24 -o enp4s0 -j MASQUERADE

# IPv6
ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -p esp -j ACCEPT
ip6tables -A INPUT -p ah -j ACCEPT

ip6tables -A INPUT -p udp --dport 500 -j ACCEPT
ip6tables -A INPUT -p udp --dport 4500 -j ACCEPT

ip6tables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -s fd12:3456:789a:1::/64 -m policy --dir in --pol ipsec -j ACCEPT
ip6tables -A FORWARD -d fd12:3456:789a:1::/64 -m policy --dir out --pol ipsec -j ACCEPT

ip6tables -t nat -A POSTROUTING -s fd12:3456:789a:1::/64 -o enp4s0 -j MASQUERADE

firewalld版本

firewall-cmd --permanent --add-service=ipsec

firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -s 10.10.3.0/24 -m policy --dir in --pol ipsec -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -d 10.10.3.0/24 -m policy --dir out --pol ipsec -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.10.3.0/24 -o ens3 -j MASQUERADE

firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -s fd12:3456:789a:1::/64 -m policy --dir in --pol ipsec -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -d fd12:3456:789a:1::/64 -m policy --dir out --pol ipsec -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv6 nat POSTROUTING 0 -s fd12:3456:789a:1::/64 -o ens3 -j MASQUERADE

firewall-cmd --reload

然後就開始設定strongswan

/etc/strongswan/ipsec.conf

config setup

conn %default 
    keyexchange=ikev2
    # 可自行更換加密套件,但要注意用戶端是否支援
    # Windows預設只支援modp1024,但那個已不安全,要開啟modp2048支援需修改登錄檔
    # [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\RasMan\Parameters]
    # "NegotiateDH2048_AES256"=dword:00000001
    ike=aes256-sha256-ecp384,aes256-sha256-ecp256,aes256-sha256-modp2048,aes256-sha1-modp2048!
    esp=aes256-sha256,aes256-sha1!
    dpdaction=clear
    dpddelay=300s
    # win7 setting
    rekey=no

conn vpn
    left=%any
    leftsubnet=0.0.0.0/0,::/0
    leftauth=pubkey
    leftcert=server.crt.pem
    leftsendcert=always
    leftid=@vpn.example.com
    right=%any
    rightsourceip=10.10.3.0/24,fd12:3456:789a:1::/64
    rightauth=eap-mschapv2
    eap_identity=%any
    auto=add

/etc/strongswan/strongswan.conf

charon {
        load_modular = yes
        plugins {
                attr {
                        # 在這邊加DNS
                        dns = 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844
                }
                include strongswan.d/charon/*.conf
        }
}

include strongswan.d/*.conf

/etc/strongswan/ipsec.secrets

# /etc/ipsec.secrets - strongSwan IPsec secrets file

# 這個跟ipsec.conf裏頭的server.crt.pem是成對的keypair
: RSA  server.key.pem

# 這是用來登入的密碼
alice : EAP "a12345678"

接著來產生憑證,這邊會用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/ipsec.d/cacerts/
cp vpn.example.com.crt.pem /etc/strongswan/ipsec.d/certs/server.crt.pem
cp vpn.example.com.key.pem /etc/strongswan/ipsec.d/private/server.key.pem

# 保護private key
chmod 600 /etc/strongswan/ipsec.d/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憑證下載到手機裡

2.安裝strongSwan VPN Client

3.打開設定->安全性->從儲存裝置安裝憑證。如果你的檔案選單全部都是灰色的,參照3-1步

3-1.安裝Astro文件管理器,從Astro裡面點選憑證,選取「透過憑證安裝程式開啟」

4.打開strongSwan,點選Add VPN Profile,依照圖中設定

5.從strongSwan點選已設定好的VPN進行連線

6.完成

留言

  1. 這篇很有幫助,
    感謝大大的文章.

  2. 目前Android沒問題,
    但是Win10一直卡在 IKE 驗證認證不可接受(代碼13801),
    這個問題大大有遇過嗎?

    • @脆笛酥
      另外,我的設定範例裡面使用DH2048作為金鑰交換,這在全系列Windows上預設是不開啟支援的,需要調整登錄檔後重開機

      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\RasMan\Parameters]
      "NegotiateDH2048_AES256"=dword:00000001

粗體斜體刪除線連結引用圖片程式碼

注意:您的電子信箱將不會被公開,且網站連結不會被搜尋引擎採計

{124} {123} {122} {121} {120} {119} {118} {117} {116} {115} {114} {113} {112} {111} {100} {025} {024} {023} {022} {021} {020} {019} {018} {017} {016} {015} {014} {013} {012} {011} {010} {009} {008} {007} {006} {005} {004} {003} {002} {001}