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,看能不能正常上網
留言
發佈留言