raspberryPI + strongswan 建立自己的VPN伺服器



紅色字 - 重要訊息,須多加注意
綠色字 - 指令
(裡面的指令無須在意工作目錄)
(須使用root角色執行命令或再前面加上 sudo)

環境介紹
raspberry 3 B+,使用內建的WIFI連線,沒有使用實體網路線
raspberry的IP為 192.168.10.100
作業系統用raspbian,2018 12月

使用小米AP
WAN的部分使用PPPOE
LAN的部分設定為192.168.10.1
設定 UDP 500和UDP 4500兩個對應到raspberry
(連接阜轉發,外對內NAT,DMZ,依照AP品牌名字不一樣)

使用的手機是小米note5



前置作業
建議先更新到最新,並且確定WIFI每次重開機IP都依樣且會自動連線



安裝相關軟體
apt-get install strongswan libcharon-extra-plugins libstrongswan-extra-plugins strongswan-ike strongswan-pki



建立VPN伺服器憑證
有兩種建立方法,兩種則ㄧ
1. 用 ipsec pki 工具

建立VPN伺服器憑證私鑰
ipsec pki --gen --type rsa --size 2048 --outform pem > /etc/ipsec.d/private/vpnHostKey.pem

建立VPN伺服器憑證公鑰
這邊一次建立10年
第五行的部分可以依照個人狀況修改
C=代表國家縮寫, O=組織名稱, OU=組織內的單位, CN=伺服器的FQDN名稱
下一行的san同CN
ipsec pki --pub --in /etc/ipsec.d/private/vpnHostKey.pem --type rsa | \
 ipsec pki --issue --lifetime 3650 \
   --cacert /etc/ipsec.d/certs/strongswanCert.pem \
   --cakey /etc/ipsec.d/private/strongswanKey.pem \
   --dn "C=TW, O=YourCompanyName, OU=IT, CN=vpn.MyCompany.com" \
   --san vpn.MyCompany.com \
   --flag serverAuth --flag ikeIntermediate \
   --outform pem > /etc/ipsec.d/certs/vpnHostCert.pem










2. 用openssl工具建立

複製一份公鑰範本,等等要拿來修改
cat /etc/ssl/openssl.cnf > openssl.cnf

修改要建立公鑰的範本
vi openssl.cnf
在 [v3_ca]下面1行加上
subjectAltName = @alternate_names
在最後1行加上
(DNS.1後面的是伺服器的FQDN名稱)
[ alternate_names ]

DNS.1       = vpn.MyCompany.com
儲存離開


建立公鑰和私鑰
openssl req -config openssl.cnf -new -x509 -sha256 -newkey rsa:2048 -nodes \
    -keyout /etc/ipsec.d/private/vpnHostKey.pem -days 3650 -out /etc/ipsec.d/certs/vpnHostCert.pem

接著會跳出詢問,分別是:
國家縮寫 (TW)
州名 (因台灣沒有州名,用Taiwan)
城市名稱 (Taipei或自己的城市名)
組織名稱 (隨便打,MyHome)
單位名稱 (隨便打,MyHand)
Common Name 很重要不能亂輸入,輸入這台VPN的網域名稱或外部IP,如 vpn.MyCompany.com
Email (隨便打,可以直接按Enter跳過)





設定VPN主機的伺服器憑證
這個憑證個功能是用在,當client要連到這台主機時,client驗證主機用

vi /etc/ipsec.secrets
在最下面加上
: RSA vpnHostKey.pem
: PSK 連到這台主機的密碼
儲存離開

以後要新增使用者就進來這邊在最下面加上
使用者名稱 : XAUTH 密碼
如:
jack : XAUTH password
(中間一定要空格)

刷新ipsec.secrets設定
ipsec rereadsecrets



設定IPSEC.conf
(記得要把裡面的中文註解刪除,不然strongswan會啟動失敗,但他不會告訴你)
(注意裡面的紅字,需要依照環境修改)

vi /etc/ipsec.conf
把裡面的東西刪掉貼上以下文字

config setup

  uniqueids = no  #這個功能可以讓同一個帳號或憑證同時多人登入
   #對某些功能提高Log的內容,預設全部都是1
  charondebug="cfg 2, dmn 2, ike 2, net 2"

#%default代表預設的連線,全部的連線都會套用這邊的設定
conn %default
  #預設使用ikev2,這邊住解掉因為經測試我的手機只支援ikev1
  #keyexchange=ikev2
  #設定允許的ike和esp, 當初沒有加這行, esp封包無法解密
  ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
  esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!

  #IKEv1在用的功能,IKEv2會自動協商
  authby =xauthpsk

  #用戶不動作幾秒鐘會斷線
  inactivity = 300
  rekeymargin=3m         #connection expiry or keying-channel expiry的時間
  dpdaction=clear        # Dead Peer Discovery
  dpddelay=300s          # Dead Peer Discovery

  #left代表伺服器接收來源的相關設定
  # Server side
  leftid=@vpn.MyCompany.com #伺服器的名稱,要跟憑證的CN一樣,給macOS看的
  left=192.168.10.100        #VPN伺服器用來接收訊息的IP,raspberry的IP
  leftsubnet=0.0.0.0/0     #設定那些網段流量會送到這個伺服器,0/0代表全部流量都送到這邊
  leftcert=vpnHostCert.pem   #伺服器的公鑰憑證

  #right代表Client端的相關設定和驗證後擁有的資源
  # Client side
  right=%any               #來源IP(Source IP)
  rightdns=168.95.1.1     #指定Client所用的DNS
  rightsourceip=10.10.10.0/24   #client連入VPN後會取得的IP,使用一個環境內沒有的網段,或用這邊的設定

#XAUTH+PSK驗正
conn android_xauth_psk
  leftauth=psk
  rightauth=psk
  rightauth2=xauth
  auto=add
儲存離開



設定紀錄LOG
vi /etc/strongswan.d/charon-logging.conf
在 filelog { 下面新增
        /var/log/charon.log {
            time_format = %b %e %T
            ike_name = yes
            default = 1
            append = no
            flush_line = yes
        }
儲存離開



設定允許轉送封包
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

刷新設定
sysctl -p


讓服務可以開機自動執行
systemctl enable strongswan
重啟服務
service strongswan restart




修改防火牆設定,建立NAT規則
介面名稱wlan0視現場環境修改,可以用 ifconfig 觀看介面名稱
這邊是給從VPN進來的流量會被改成raspberry的IP,再傳到AP
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o wlan0 -j MASQUERADE



設定每次開機都會執行的指令
vi /etc/rc.local
在最下面的exit 0 的上面一行貼上
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o wlan0 -j MASQUERADE

for vpn in /proc/sys/net/ipv4/conf/*
do
  echo 0 > $vpn/accept_redirects
  echo 0 > $vpn/send_redirects
done

儲存離開


到這邊完成設定,可以嘗試重開raspberry,然後用手機連VPN,看能不能正常上網

留言

此網誌的熱門文章

WPA_supplicant的設定方式

DOS指令 -- SET和變數

Nginx server 和 location 優先順序