5,077 瀏覽數

就是要上網 – OpenVPN (一) Server

OpenVPN 提供兩種版本,如果所需要的設定不太複雜建議使用 OpenVPN-AS 這版本,如果你的 VPN 還需要 Proxy 等的連線方式則建議使用 OpenVPN 的版本.雖然設定上會比 OpenVPN-AS 困難繁瑣多,但是可以依據你公司的環境做詳細的設定,所以請依據自己的需求做選擇.

OpenVPN-AS

OpenVPN

這邊採用的是 OpenVPN 為範例:

目前我的作業系統為 CentOS 5.5 32bit,OpenVPN 提供的檔案為 Source Tarball 以及 Source Zip 這2種.這是 OpenVPN 的下載點

設定的方式我主要參考了 OpenVPN 官方的 Quick start 說明文件.

Installing OpenVPN

安裝 OpenVPN 需要下列套件

  1. openssl
  2. lzo
  3. pam
  • CentOS 可以透過 yum 去下載 openssl 以及 pam ,不過我卻找不到 lzo 套件,我們需要找到 lzo 的 source RPM 並自行編輯.

    # yum install openssl
    # yum install pam
    

    http://openvpn.net/release 可以找到  lzo 但是 CentOS 5 要安裝 lzo 前還需要 zlib-devel , autoconf ,gcc 這 3 個套件.還要加上 rpm-build 這個套件才能使用 rpmbuild 指令並將 source RPM 編譯成 RPM.

    # yum install zlib-devel
    # yum install autoconf
    # yum install gcc
    #wget http://openvpn.net/release/lzo-1.08-4.rf.src.rpm
    # yum install rpm-build
    # rpmbuild –rebuild lzo-1.08-4.rf.src.rpm
    # rpm -ivh /usr/src/redhat/RPMS/i386/lzo-1.08-4.rf.i386.rpm
    # rpm -ivh /usr/src/redhat/RPMS/i386/lzo-devel-1.08-4.rf.i386.rpm
    

    除了剛剛那 3 個套件, 要安裝 OpenVPN 我們還需要下列套件

    1. openssl-devel
    2. pam-devel 
    3. automake
    4. pkcs11-helper
    5. pkcs11-helper-devel

    openssl-devel, pam-devel ,automake 套件可以透過 yum 下載,至於 pkcs11-helper-devel 需要去 http://rpmfind.net/ 下載 pkcs11-helper 以及 pkcs11-helper-devel RPM 檔

    # yum install openssl-devel
    # yum install pam-devel
    # yum install automake
    # wget ftp://rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/pkcs11-helper-1.08-1.el5.rf.i386.rpm
    # wget ftp://rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/pkcs11-helper-devel-1.08-1.el5.rf.i386.rpm
    
    # rpm -ivh pkcs11-helper-1.08-1.el5.rf.i386.rpm
    # rpm -ivh pkcs11-helper-devel-1.08-1.el5.rf.i386.rpm
    

    準備就緒可已開始編譯 OPENVPN ,下載點為 http://swupdate.openvpn.org/community/releases/

    # wget http://swupdate.openvpn.org/community/releases/openvpn-2.2.1.tar.gz
    # rpmbuild -tb openvpn-2.2.1.tar.gz
    # rpm -ivh /usr/src/redhat/RPMS/i386/openvpn-2.2.1-1.i386.rpm
    

    Certificate Authority (CA) 的設定

    這邊主要是設定 VPN Server 與 Client 之間的 SSL 加密鑰匙,還記得前面就有提到 VPN 主要就是透過加密的方式讓別人無法從 Internet 擷取我們傳送的資料.先來複習一下什麼是 SSL

    SSL(Secure Socket Layer) 是由 Netscape 所提出來的資料保密協定,採用了對稱式 ,One way hash 以及非對稱式加密演算法再加上 CA(Certification Authority) 來確定身份所組成的.

    • Symmetric Algorithms 對稱式加密,而所謂的對稱式加密就是加密以及解密都是使用同一支鑰匙.
    • One Way Hashes 主要會產生一組固定長度字串 (fingerprint or message digests),這組字串用來比對原資料是否遭到修改.
    • Asymmetric Algorithms 非對稱式或稱公鑰密碼演算法的一種.而所謂的非對偁式加密會使用兩把公與私鑰 (Public/Private Key), public key 會當成加密用, Private key 就會當解密用
    • CA(Certification Authority) 公正的第三者,主要用來驗證公鑰的真假.

    SSL 交易方式

    1. 所謂的 SSL 就是伺服器端和使用者端的資料都經過加密的方式來傳送,而這之鑰匙就是對稱式加密,而這隻鑰匙是無法透過網路來傳送.因為當別人擷取這把鑰匙時,他也可以用這把鑰匙對你們的資訊加解密.
    2. 所以此時就可以用公私鑰 ,非對稱式加解密方式來傳送這把鑰匙,所以一開始時伺服器會把他的公鑰給使用者.經過公鑰產生的鑰匙做加密,然後經由網路傳送,至伺服器端再用私鑰將資料解密還原成原本產生的鑰匙.
    3. 這樣看似安全其實不然,因為使用者無法確定伺服器端的真假,使用者有可能會經由假的 DNS Server導向到假的伺服器,所以使用 CA(Certification Authority) 來進行伺服器端的身份確認.因此伺服器端不只會單給 public key 還會加上數位簽名的憑證.
    4. 使用者端接到這 public key 加上數位簽名的憑證,會先去檢查資料是否遭到修改.
    5. 然後使用者會產生對稱式鑰匙,並將他得到伺服器端的 Public Key 來加密,等到伺服器端使用者端都有鑰匙後,就使用這鑰匙來進行接下來的交易.

    剛剛寫了一大段可光看就昏頭了能,其實面上講的是需要 4 個 Key,就可以進行 SSL 的加密.

    1. Root CA 的 Key

    2. Server key – 非對偁式加密

    3. Client key – 非對偁式加密

    4. D-H(Diffie Hellman parameters) 的對稱式加密.

    需要的只有第一個步驟就是把 openvpn 預設的工作目錄 /usr/share/doc/openvpn 搬移到系統設定檔 /etc/openvpn 的位置.並進入目錄 easy-rsa/2.0 開始,基本上我們用預設值即可.

    1. Root CA 的 Key

      [root@vps1 ~]# cp -rp /usr/share/doc/openvpn-2.2.1/* /etc/openvpn
      [root@vps1 ~]# cd /etc/openvpn
      [root@vps1 openvpn]# cd easy-rsa/
      [root@vps1 easy-rsa]# cd 2.0/
      [root@vps1 2.0]# source ./vars
      NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys
      [root@vps1 2.0]# ./clean-all
      [root@vps1 2.0]# ./build-ca
      Generating a 1024 bit RSA private key
      ….++++++
      ………….++++++
      writing new private key to 'ca.key'
      —–
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a Distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,
      If you enter '.', the field will be left blank.
      —–
      Country Name (2 letter code) [US]:
      State or Province Name (full name) [CA]:
      Locality Name (eg, city) [SanFrancisco]:
      Organization Name (eg, company) [Fort-Funston]:
      Organizational Unit Name (eg, section) [changeme]:
      Common Name (eg, your name or your server's hostname) [changeme]:
      Name [changeme]:
      Email Address [mail@host.domain]:
      
    2. Server key – 非對偁式加密

      [root@vps1 2.0]# ./build-key-server server
      Generating a 1024 bit RSA private key
      …….++++++
      …………++++++
      writing new private key to 'server.key'
      —–
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a Distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,
      If you enter '.', the field will be left blank.
      —–
      Country Name (2 letter code) [US]:
      State or Province Name (full name) [CA]:
      Locality Name (eg, city) [SanFrancisco]:
      Organization Name (eg, company) [Fort-Funston]:
      Organizational Unit Name (eg, section) [changeme]:
      Common Name (eg, your name or your server's hostname) [server]:
      Name [changeme]:
      Email Address [mail@host.domain]:
      Please enter the following 'extra' attributes
      to be sent with your certificate request
      A challenge password []:
      An optional company name []:
      Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf
      Check that the request matches the signature
      Signature ok
      The Subject's Distinguished Name is as follows
      countryName 😛 RINTABLE:'US'
      stateOrProvinceName 😛 RINTABLE:'CA'
      localityName 😛 RINTABLE:'SanFrancisco'
      organizationName 😛 RINTABLE:'Fort-Funston'
      organizationalUnitName:PRINTABLE:'changeme'
      commonName 😛 RINTABLE:'server'
      name 😛 RINTABLE:'changeme'
      emailAddress :IA5STRING:'mail@host.domain'
      Certificate is to be certified until Oct 17 08:38:47 2021 GMT (3650 days)
      Sign the certificate? [y/n]:y
      
      1 out of 1 certificate requests certified, commit? [y/n]y
      Write out database with 1 new entries
      Data Base Updated
      
    3. Client key – 非對偁式加密

      這邊會產生 3 個 clients (client1 , client 2 , client 3),下面範例為 client1 ,Client2 與 client3 步驟為一致,基本上也用預設值即可.

      [root@vps1 2.0]# build-key client1
      -bash: build-key: command not found
      [root@vps1 2.0]# ./build-key client1
      Generating a 1024 bit RSA private key
      ………………………………………………………………………………………………..++++++
      …………..++++++
      writing new private key to 'client1.key'
      —–
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a Distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,
      If you enter '.', the field will be left blank.
      —–
      Country Name (2 letter code) [US]:
      State or Province Name (full name) [CA]:
      Locality Name (eg, city) [SanFrancisco]:
      Organization Name (eg, company) [Fort-Funston]:
      Organizational Unit Name (eg, section) [changeme]:
      Common Name (eg, your name or your server's hostname) [client1]:
      Name [changeme]:
      Email Address [mail@host.domain]:
      Please enter the following 'extra' attributes
      to be sent with your certificate request
      A challenge password []:
      An optional company name []:
      Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf
      Check that the request matches the signature
      Signature ok
      The Subject's Distinguished Name is as follows
      countryName 😛 RINTABLE:'US'
      stateOrProvinceName 😛 RINTABLE:'CA'
      localityName 😛 RINTABLE:'SanFrancisco'
      organizationName 😛 RINTABLE:'Fort-Funston'
      organizationalUnitName:PRINTABLE:'changeme'
      commonName 😛 RINTABLE:'client1'
      name 😛 RINTABLE:'changeme'
      emailAddress :IA5STRING:'mail@host.domain'
      Certificate is to be certified until Oct 17 08:28:56 2021 GMT (3650 days)
      Sign the certificate? [y/n]:y
      
      1 out of 1 certificate requests certified, commit? [y/n]y
      Write out database with 1 new entries
      Data Base Updated
      
    4. D-H(Diffie Hellman parameters)的對稱式加密.

      [root@vps1 2.0]# ./build-dh
      Generating DH parameters, 1024 bit long safe prime, generator 2
      This is going to take a long time
      ……………………….+…………………………………………….+……………+……….+…….. …………………….+………………………………………………………………………………. …………………………………………+……………………………………………….+………… ………………………………..+…………+……………….+…………+………………………….. ………………….++*++*++*
      

      所有的 Key 將會存放在 /etc/openvpn/easy-rsa/2.0/keys 目錄中

    Server 設定檔

    OpenVPN 有提供 Server 的 sample-config-files 在目錄 /usr/share/doc/openvpn-2.2.1/sample-config-files/server.conf

    這預設定 the server 設定檔案只需要經過稍微的修改就可以使用了,他預設出來的環境如下所是.

    預設的 VPN 使用一個虛擬出來的網路裝置 TUN 當做網路介面 (for routing), 他將會傾聽 client 端所有關於 UDP port 1194 的連線 (OpenVPN's official port number), 並且會指派 10.8.0.0/24 區間的網路位址給 Client.

    除了 UDP port 1194 外不符合我的需求,其他只須修改一下這設定檔即可以使用了.

    需要修改的有 ca, cert, key, 以及 dh的實際位址,這些 Key 我們存放在 /etc/openvpn/easy-rsa/2.0/keys

    [root@vps1 openvpn]# cp /usr/share/doc/openvpn-2.2.1/sample-config-files/server.conf /etc/openvpn/
    [root@vps1 openvpn]# vi server.conf
    # Any X509 key management system can be used.
    # OpenVPN can also use a PKCS #12 formatted key file
    # (see "pkcs12" directive in man page).
    ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
    cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
    key /etc/openvpn/easy-rsa/2.0/keys/server.key # This file should be kept secret
    # Diffie hellman parameters.
    # Generate your own with:
    # openssl dhparam -out dh1024.pem 1024
    # Substitute 2048 for 1024 if you are using
    # 2048 bit keys.
    dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
    

    不過前面我們希望是透過 TCP / 443 這個方式進行連接,因為大部分的公司不會去阻擋 TCP / 443 這個網路埠,所以修改如下

    # Which TCP/UDP port should OpenVPN listen on?
    # If you want to run multiple OpenVPN instances
    # on the same machine, use a different port
    # number for each one. You will need to
    # open up this port on your firewall.
    port 443
    # TCP or UDP server?
    proto tcp
    

    VPN 有兩種模式可供選擇 routed 或是 bridged,通常我們使用預設的 routed mode (dev tun) 即可.

    # "dev tun" will create a routed IP tunnel,
    # "dev tap" will create an ethernet tunnel.
    # Use "dev tap0" if you are ethernet bridging
    # and have precreated a tap0 virtual interface
    # and bridged it with your ethernet interface.
    # If you want to control access policies
    # over the VPN, you must create firewall
    # rules for the the TUN/TAP interface.
    # On non-Windows systems, you can give
    # an explicit unit number, such as tun0.
    # On Windows, use "dev-node" for this.
    # On most systems, the VPN will not function
    # unless you partially or fully disable
    # the firewall for the TUN/TAP interface.
    dev tun
    

    這時就可以重新啟動 openvpn 的服務,你會發現多出一個 tun0 的網路裝置,這就是我們 VPN Server 所虛擬出的裝置.

    啟動 VPN 並且測試 VPN 連線

    如果你使用的是預設的 UDP / 1194 時,此時需要開啟防火牆的設定,這邊我所使用的是 TCP /443 通常 Server 不會組擋這一個網路埠..

    [root@vps1 openvpn]# iptables -L
    …. 
    ACCEPT     tcp  –  anywhere             anywhere            state NEW tcp dpt:https
    

    在正式開始時我們可以先測試一下我們的設定檔是否無誤

    [root@vps1 openvpn]# openvpn server.conf
    …. 
    Initialization Sequence Completed
    

    如果 server 設定檔沒有錯誤時會出現 Initialization Sequence Completed 的字串.OpenVPN Server 就大概沒有問題了!!後面就可以依據不同的 Client 來設定.

    OpenVPN-Client

    其他常見的問題

    VPN 模式 routed 或是 bridged

    根據 OpenVPN 的說法是建議使用 routing 模式,這也是大多數人所選擇使用的模式,而且會比 bridging 好設定. Routing 模式提供的功能較強大而且可以針對不同的使用者作管理與控制. 
    除非你需要下列的功能才會需要使用到 bridging 模式:

    • 需要 VPN 支援 non-IP 協定如 IPX(Netware 所使用的協定)
    • 需要使用廣播封包的程式,比如是 LAN games
    • 需要支援非由 samba 或是 WINS 所分享的檔案,可以透過瀏覽的方式去讀取 Windows 所分享的檔案.(這一項覺得怪怪的,不是很能了解,或許是 samba 和 WINS 需要使用大量的廣播封包)

    基本上使用 OpenVPN 推廌的 routing 模式即可.

    Numbering private subnets

    VPN 在使用上就是透過本地端的 Private IP 連線到遠端的 VPN ,而 VPN 再指派另外一組 Private IP 給使用者.但實際應用上要注意這兩組 Private IP 不能為同一網段.

    在 Internet Assigned Numbers Authority (IANA) 保留下列幾組 IP 位置給 private internets 使用.(請參考 RFC 1918):

    • 10.0.0.0 10.255.255.255 (10/8 prefix)
    • 172.16.0.0 172.31.255.255 (172.16/12 prefix)
    • 192.168.0.0 192.168.255.255 (192.168/16 prefix)

    上面所保留下來的 IP 將會使用在 VPN 的設定檔,但有一點非常重要就使請謹慎選擇 IP 區段以避免剛剛所說的衝突.

    • 不同的區域使用了相同的 LAN subnet (site to site)
    • 遠端和 VPN 選擇使用相同的 private subnets. (point to point)

    舉列來說, 假如你的VPN 使用的私人區域網域網段為 192.168.0.0/24 . 現在你要從你的外部地方網路連線回 VPN 但你所在的環境如 WiFi LAN 剛好也使用相同的私人區域網段.那資料將無法做 routing ,因為你的機器將無法得知號如何從 192.168.0.1 連上 VPN 所在的位置.

    另外一個例子, suppose you want to link together multiple sites by VPN, but each site is using 192.168.0.0/24 as its LAN subnet. This won't work without adding a complexifying layer of NAT translation, because the VPN won't know how to route packets between multiple sites if those sites don't use a subnet which uniquely identifies them.

    最佳的方式是避免使用 10.0.0.0/24 以及 192.168.0.0/24 當做 private LAN network addresses. 使用其他範圍的 IP 位置可以避免 WiFi cafe, airport, 或是 hotel w 常使用的區段.建議使用 10.0.0.0/8 這一區段的.

    避免 VPN Server 與 Client IP 使用相同區段的 IP.

    當然你也可以不用像我這麼辛苦自己架設 VPN 外.你還可以找一些商用的 VPN 如: go-vpn付點費用就可以使用了.

  • 5 個網友的想法 “就是要上網 – OpenVPN (一) Server

    1. 自動參照通知: 就是要上網 – OpenVPN-AS (VPN+SSL) | Benjr.tw

    2. 自動參照通知: OpenVPN-Access Server | Benjr.tw

    3. 自動參照通知: 就是要上網 – OpenVPN ( 二) Client | Benjr.tw

    4. 其實這一篇還不算完全完成,目前我還是無法透過公司的 Proxy 連到遠端的 VPN Server.等有空再自己架 Proxy Server 來試試看!!!

    發表迴響