iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Arm Platforms

OpenWRT開源路由兩三事系列 第 22

Day_22 OpenVPN

前幾天所述讓我們能夠連線回所架設的openwrt方法,雖然方便快速但比較粗糙,可以看到我連https部分也沒有提到,因為免費的ddns幾乎不提供ssl憑證,後續有機會再來補完。另外,開了port之後,建議連回的設備要備有防護功能阻止有駭客或爬蟲破解。
介紹另一個相對安全的連線方式"VPN"。使用加密穿隧協定建立安全的虛擬私人網路,阻止截聽與嗅探也避免資訊被竄改。依照不同協定可區分許多項,如:PPTP/L2TP/IPsec/WireGuard/OpenVPN等數樣,今天來嘗試安裝及建立"OpenVPN"。

虛擬私人網路(英語:virtual private network,縮寫:VPN)是常用於連接中、大型企業或團體間私人網路的通訊方法。它利用隧道協定(Tunneling Protocol)來達到傳送端認證、訊息保密與準確性等功能。

OpenVPN是一個用於建立虛擬私人網路加密通道的軟體套件,最早由James Yonan編寫。OpenVPN允許建立的VPN使用公開金鑰、電子憑證、或者使用者名稱/密碼來進行身分驗證。它大量使用了OpenSSL加密庫中的SSL/TLS協定函式庫。

在OpenWRT doc中其實已經將openVPN步驟介紹得十分詳細,透過CLI命令介面去設定與建立公/私鑰、憑證等,按步驟就能取得client端的設定檔。

  • 以命令介面登入openwrt,先安裝這次會用上的套件

    opkg update
    opkg install openvpn-easy-rsa openvpn-mbedtls luci-app-openvpn 
    
  • OpenVPN參數配置設定

    OVPN_DIR="/etc/openvpn"
    OVPN_PKI="/etc/easy-rsa/pki"
    OVPN_PORT="1194"
    OVPN_PROTO="udp"
    OVPN_POOL="192.168.8.0 255.255.255.0"
    OVPN_DNS="${OVPN_POOL%.* *}.1"
    OVPN_DOMAIN="$(uci get dhcp.@dnsmasq[0].domain)"
    
  • 設定連線目標IP,因為我們已經在使用ddns服務,所以填上DDNS的網址

    OVPN_SERV="IP or Hostname"
    
  • 金鑰製作。使用EasyRSA管理PKI,先進行設置

    export EASYRSA_PKI="${OVPN_PKI}"
    export EASYRSA_REQ_CN="ovpnca"
    export EASYRSA_BATCH="1"
    
  • 重新初始化pki設置
    easyrsa init-pki

  • 產生DH,這步驟會花點時間,等它跑完再往下
    easyrsa gen-dh

  • 建立新ca
    easyrsa build-ca nopass

  • 生成密鑰
    easyrsa build-server-full server nopass

  • 建立client端密鑰,要讓幾個帳戶連入這邊就重複輸入不同的client名稱,如下圖
    easyrsa build-client-full client nopass

  • 生成 TLS PSK
    openvpn --genkey secret ${OVPN_PKI}/tc.pem

  • 防火牆與埠口設置,最後需要重啟

    uci rename firewall.@zone[0]="lan"
    uci rename firewall.@zone[1]="wan"
    uci del_list firewall.lan.device="tun+"
    uci add_list firewall.lan.device="tun+"
    uci -q delete firewall.ovpn
    uci set firewall.ovpn="rule"
    uci set firewall.ovpn.name="Allow-OpenVPN"
    uci set firewall.ovpn.src="wan"
    uci set firewall.ovpn.dest_port="${OVPN_PORT}"
    uci set firewall.ovpn.proto="${OVPN_PROTO}"
    uci set firewall.ovpn.target="ACCEPT"
    
    uci commit firewall
    /etc/init.d/firewall restart
    
  • 配置 VPN服務並產生client端配置文件,最後列出所生成的key

umask go=
OVPN_DH="$(cat ${OVPN_PKI}/dh.pem)"
OVPN_TC="$(sed -e "/^#/d;/^\w/N;s/\n//" ${OVPN_PKI}/tc.pem)"
OVPN_CA="$(openssl x509 -in ${OVPN_PKI}/ca.crt)"
ls ${OVPN_PKI}/issued \
| sed -e "s/\.\w*$//" \
| while read -r OVPN_ID
do
OVPN_KEY="$(cat ${OVPN_PKI}/private/${OVPN_ID}.key)"
OVPN_CERT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt)"
OVPN_EKU="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt -purpose)"
case ${OVPN_EKU} in
(*"SSL server : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.conf"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
port ${OVPN_PORT}
proto ${OVPN_PROTO}
server ${OVPN_POOL}
topology subnet
client-to-client
keepalive 10 60
persist-tun
persist-key
push "dhcp-option DNS ${OVPN_DNS}"
push "dhcp-option DOMAIN ${OVPN_DOMAIN}"
push "redirect-gateway def1"
push "persist-tun"
push "persist-key"
<dh>
${OVPN_DH}
</dh>
EOF
(*"SSL client : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.ovpn"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
nobind
client
remote ${OVPN_SERV} ${OVPN_PORT} ${OVPN_PROTO}
auth-nocache
remote-cert-tls server
EOF
esac
cat << EOF >> ${OVPN_CONF}
<tls-crypt>
${OVPN_TC}
</tls-crypt>
<key>
${OVPN_KEY}
</key>
<cert>
${OVPN_CERT}
</cert>
<ca>
${OVPN_CA}
</ca>
EOF
done
/etc/init.d/openvpn restart
ls ${OVPN_DIR}/*.ovpn

  • 可用FTP或其他軟體下載key。或用cat指令秀出配置檔內容,複製全部內容並用文字檔存下修改副檔名(有點多,要全部複製到)

client 端設定與使用

到OpenVPN的client software下載對應作業系統的軟體並安裝。開啟後會在隱藏的工作列裡,匯入*.ovpn

點選連線,測試看是不是已經連入opevpn server

Troubleshooting

目前還在翻車查修中。安裝luci-app-openvpnluci-i18n-openvpn-zh-tw可以在luci介面看到設定配置。
許多配置(如網卡介面/防火牆)確實有新增,但openvpn按理設定完應該會出現一個新的項目且啟動,但目前只有原先幾個樣板。

另win系統中用"tracert"(linux使用"traceroute"),可以追蹤封包傳遞到目的地所經的路徑和時間。

# win
tracert openwrt.org
# linux
traceroute openwrt.org

Ref


上一篇
Day_21 DNS/DDNS/Port Forwards (二)
下一篇
Day_23 WireGuard
系列文
OpenWRT開源路由兩三事30

尚未有邦友留言

立即登入留言