歡迎您光臨本站 註冊首頁

構建基於Linux的VPN網路

←手機掃碼閱讀     火星人 @ 2014-03-29 , reply:0

構建VPN幾乎是Linux的最高級應用之一了,學會了這項技術,是足以使你自豪的資本。VPN的主要用途就是建立一個加密的通信機制,然後通過把所有的你的子網的信息按照特定的方式加密傳輸,構成一個邏輯上的虛擬的網路。簡單的說,就是一個Linux系統的IP層加密解決方案。這裡面需要用到不少組件,下面一一介紹。

1、準備工作和安裝

· 從http://www.kernel.org下載2.4.X的內核,除了2.4.15版本(該版本有一個致命錯誤)。然後把該內核放置到: /usr/src中。(這裡我們使用Linux-2.4.18.tar.gz),然後釋放:tar zxvf linux-2.4.18.tar.gz

· 刪除原來的連接rm linux

· ln ?s linux-2.4.18.tar.gz linux

· 檢查當前的網卡和SCSI的型號(參見內核升級一章)

· cd linux (進入linux-2.4.18目錄)

· make menugonfig

· make dep

· make bzImage

· 編譯工作做到這裡就打住!

· 從http://www.swox.com/gmp 下載gmp庫的最新版本到/usr/local/src。

· tar zxvf gmp-4.0.1.tar.gz

· cd gmp-4.0.1

· ./configure

· make

· make install

· 從http://www.freeswan.org下載freeswan...?/usr/local/src

· tar zxvf freeswan-1.97.tar.gz

· 從http://www.strongsec.com/freeswan/ 下載x509patch-0.9.11-freeswan-1.97.tar.gz ,這個是補丁文件。釋放,進入x509補丁目錄,複製freeswan.diff到外面的freeswan源目錄,然後回到freeswan源目錄中運行:patch ?p1 < freswan.diff

· 從http://www.openssl.org下載openssl-0...?頭牛??肽柯?

· ./config (如果原來系統中有openssl需要先uninstall再安裝,不過一般情況下你可能uninstall不下來8-)。如果無法uninstall,找到他們的路徑,在這裡通過—prefix=參數指定路徑覆蓋舊版本的文件。這裡嚴重建議:如果你沒有把握確定路徑,最好這樣做:到你用的發行包的開發商的FTP站點(如果你用turbolinux就去ftp.turbolinux.com用redhat就去ftp.redhat.com),用 anonymous用戶和隨便一個電子郵件作為密碼登陸,找到你用的發行包版本的生機目錄,然後下載相應的RPM包,注意:這裡的包至少應該是 0.9.6b1以上的i386版本。下載完畢後用rpm ?Uvh更新。這樣做完了很乾凈。

· make (如果你用rpm包升級就不用這個步驟了)

· make test (如果你用rpm包升級就不用這個步驟了)

· make install (如果你用rpm包升級就不用這個步驟了)安裝完了以後執行openssl命令,輸入version看看是不是你剛剛安裝的版本。如果不是,可能沒有覆蓋原來安裝的舊版本。從1.20重新來過

· 然後回到freeswan的源目錄,運行:make menugo,在networking options中選擇關於iptables和ipsec相關的所有選項。其中ipsec是freeswan加上的,最好把前面括弧中M(模塊方式)換成* (編譯進內核)。下列內核選項應該選上:

進入:Networking Options至少選擇上:

 
  • Network packet filtering (replaces ipchains)
      
  • Network packet filtering debugging (NEW)
      進入:IP: Netfilter Configuration --->
      <*> Connection tracking (required for masq/NAT) (NEW)
    FTP protocol support (NEW)
    IRC protocol support (NEW)



    注意:如果你需要使用DHCP功能,需要增加Pachet Socket mmapped IO和Socket Filtering兩個選項,參見DHCP一章。

    等等……

    把下面的選項全部標記<*>
    返回上一層菜單后,把列表選項最下面的凡是IPSEC相關的選項全部選為<*>。另外的,如果你打算使用撥號連接請在網路設備支持菜單選擇ppp支持(注意,你用的ppp程序一定要2.4版本以上的)

    · 然後檢查網卡和硬碟選項是否正確,如果沒有問題就逐層退出,然後保存配置。

    · 退出后將自動編譯內核,等待……

    · 編譯完成後,來到/usr/src/linux目錄,運行:make modules;make modules_install

    · cp System..map /boot/System.map-2.4.18-vpn

    · cd arch/i386/boot

    · cp bzImage /boot/vmlinuz-2.4.18-vpn

    · cd /boot

    · rm System.map

    · ln ?s System.map-2.4.18-vpn System.map

    · vi /etc/lilo.conf

     boot=/dev/sda
      map=/boot/map
      install=/boot/boot.b
      prompt
      timeout=50
      lba32
      default=linux-vpn
      image=/boot/vmlinuz
    label=linux
    initrd=/boot/initrd
    read-only
    root=/dev/sda5
      image=/boot/vmlinuz-2.4.18-vpn
    label=linux-vpn
    initrd=/boot/initrd
    read-only
    root=/dev/sda5



    · 運行lilo更新數據

    · reboot

    · 啟動后,運行:ipsec setup restart 應該不報任何錯誤而正常出現freeswan的版本。

    注意:還有一些必要的內核參數配置,這些配置可以在rc.local中實現。他們是:

      echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
      echo 1 > /proc/sys/net/ipv4/ip_forward



    如果你把下面兩項編譯成模塊(前面擴號是M而不是*):

       FTP protocol support (NEW)
    IRC protocol support (NEW)



    你需要在rc.local中加上:

    modprobe ip_nat_ftp



    安裝完了,接下來我們將說明幾種VPN的玩法。

    2、配置Frees/wan用於支持雙網關通信。也就是兩個異地的子網通過一對ipsec的VPN網關進行交互訪問。第一種玩法是網路對網路的VPN。一般的,某企業在甲乙兩地(距離相當遠)各有一個辦公室,每個辦公室各有一套LAN,他們分別通過專線連接到internet網路上。甲LAN上是企業的管理中心,運行著企業的管理系統。而乙LAN上的用戶也需要使用該管理系統,儘管乙LAN可以通過internet(公網)連接過去,但是企業的老闆說不行!我們的數據不能暴露在公網上,必須加密!好了,我們的VPN網路就可以應用於該企業的這種需求。首先在甲乙兩個LAN的出口各放置一台我們的 Linux伺服器,他們都安裝好了ipsec(前面說的安裝步驟一個都不少),兩個LAN的數據分別通過各自的這台機器(ipsec gateway)進入公網,凡是經過該網關的數據全部都是加密的。在效果上,兩個LAN的用戶可以互相ping到對方的機器,儘管他們可能一個是 192.168.1.0/24網段,另一個是192.168.10.0/24網段的。他們好像在同一個區域網中工作,沒有界限。公共網路的加密部分對他們來說也是透明的。而兩個LAN在公共網路上交換的數據是密文的。這就是虛擬專用網VPN。
    但願你已經按照前面的步驟順利的安裝好了兩台機器,下面我告訴你怎樣配置成網對網的環境。

    · 我們先配置甲網的ipsec網關(該網關有兩個網卡,我們配置他們的地址分別為eth1:192.168.1.231和eth0:21.9.22.22)。安裝完成後,我們首先要做的事情是生成CA證書。(用到剛才安裝的openssl)

    · 找到openssl.cnf文件,一般在/etc/ssl/中,也可能在/var/ssl中或/usr/ssl中(實在不行你就find / -name 「openssl.cnf」找找嘛!),要是有好幾個,你要搞清楚哪個是你安裝的版本。改動其中的default_bits選項的值從1024到 2048,然後改動default_days的值到3650。讓期限為10年!保存退出。

    · 在/var/中建立一個目錄:/var/sslca,改變該目錄的許可權為700(chmod 700 /var/sslca)

    · 在你安裝的openssl目錄中找到CA.sh腳本。注意,應該是你當前運行的openssl版本的CA.sh

    · cd /var/sslca 進入到你剛才建立的目錄

    · 比如你剛才找到的CA.sh在/usr/lib/ssl/misc/,那麼就輸入/usr/lib/ssl/misc/CA.sh ?newca,接下來你會被問到一系列問題。問題和回答類似於下面的樣子。如果你確認哪些你有把握更改就改, ~/sslca#/usr/lib/ssl/misc/CA.sh -newca
      CA certificate filename (or enter to create)
    (enter)
      Making CA certificate ...
      Using configuration from /usr/lib/ssl/openssl.cnf
      Generating a 2048 bit RSA private key
      ........................................+++
      ........................................+++
      writing new private key to './demoCA/private/./cakey.pem'
      Enter PEM pass phrase:(enter password)
      Verifying password - Enter PEM pass phrase:(enter same password again)
      -----
      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) [AU]:US(enter)
      State or Province Name (full name) [Some-State]:State(enter)
      Locality Name (eg, city) []:City(enter)
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:21vianet(enter)
      Organizational Unit Name (eg, section) []:(enter)
      Common Name (eg, YOUR name) []:CA(enter)
      Email Address []:ca@xxx.com(enter)
      ~/sslca#



    · 下一步是給網關生成證書:

    命令和要回答的問題如下:

    ~/sslca# /usr/lib/ssl/misc/CA.sh -newreq
    Using configuration from /usr/lib/ssl/openssl.cnf
    Generating a 2048 bit RSA private key
      ...................................+++
      ...............................+++
      writing new private key to 'newreq.pem'
      Enter PEM pass phrase:(enter password)
      Verifying password - Enter PEM pass phrase:(repeat password)
      -----
      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) [AU]:US(enter)
      State or Province Name (full name) [Some-State]:State(enter)
      Locality Name (eg, city) []:City(enter)
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:ExampleCo(enter)
      Organizational Unit Name (eg, section) []:(enter)
      Common Name (eg, YOUR name) []:vpnserver.rd.xxx.com(enter)
      Email Address []:user@xxx.com(enter)
      Please enter the following 'extra' attributes
      to be sent with your certificate request
      A challenge password []:(enter)
      An optional company name []:(enter)
      Request (and private key) is in newreq.pem
      natecars@buzzword:~/sslca$ /usr/lib/ssl/misc/CA.sh -sign
      Using configuration from /usr/lib/ssl/openssl.cnf
      Enter PEM pass phrase:(password you entered for the ca certificate)
      Check that the request matches the signature
    Signature ok
      The Subjects Distinguished Name is as follows
      countryName :PRINTABLE:'US'
      stateOrProvinceName :PRINTABLE:'State'
      localityName :PRINTABLE:'City'
      organizationName :PRINTABLE:'21vianet'
      commonName :PRINTABLE:'vpnserver.rd.xxx.com'
      emailAddress :IA5STRING:'rd@xxx.com'
      Certificate is to be certified until Feb 13 16:28:40 2012 GMT (3650 days)
      Sign the certificate? [y/n]:y(enter)
      1 out of 1 certificate requests certified, commit? [y/n]y(enter)
      Write out database with 1 new entries
    Data Base Updated
      (certificate snipped)
      Signed certificate is in newcert.pem



    在以上步驟中一定要記住你輸入的密碼。如果哪一不錯了,想重新來過的話,記住刪除/var/sslca目錄下面的所有子目錄即可。

    · 把文件名字改為你需要的

    ~/sslca# mv newcert.pem vpnserver.rd.xxx.com.pem
      ~/sslca# mv newreq.pem vpnserver.rd.xxx.com.key



    · 編輯.key文件,刪除'-----BEGIN CERTIFICATE REQUEST-----'後面所有的東西,之後,這個文件應該從'-----BEGIN RSA PRIVATE KEY-----'至'-----END RSA PRIVATE KEY-----'結束。

    · 如果正常的安裝了x.509補丁,你應該可以看到/etc/ipsec.d及其下面的目錄。如果沒有,你就自己建立。然後按照下面的位置複製合適的文件:(此時你仍然在/var/sslca目錄中)

     # cp vpnserver.rd.xxx.com.key /etc/ipsec.d/private
      # cp vpnserver.rd.xxx.com.pem /etc/ipsec.d
      # openssl x509 -in demoCA/cacert.pem -outform der -out rootca.der
      # cp rootca.der /etc/ipsec.d/cacerts/RootCA.der
      # openssl x509 -in host.example.com.pem -outform der -out /etc/x509cert.der
      # openssl ca -gencrl -out crl.pem
      # cp crl.pem /etc/ipsec.d/crls



    · 在/etc/ipsec.secrets中加入一行:: RSA vpnserver.rd.xxx.com.key "password",然後刪除其他所有行。其中的password是你前面生成密要的時候回答問題輸入的密碼。

     # basic configuration
      config setup
    interfaces=%defaultroute
    klipsdebug=none
    plutodebug=none
    plutoload=%search
    plutostart=%search
    uniqueids=yes
      conn %default
    keyingtries=1
    compress=yes
    disablearrivalcheck=no
    authby=rsasig
    leftrsasigkey=%cert
    rightrsasigkey=%cert
    left=%defaultroute
    leftcert=vpnserver.rd.xxx.com.pem
    auto=add
    pfs=yes
      conn roadwarrior
    right=%any
      conn roadwarrior-net
    leftsubnet=192.168.1.0/255.255.255.0
    right=%any
      conn net-net
    leftsubnet=192.168.1.0/255.255.255.0
    right=%any
    rightsubnet=192.168.10.0/255.255.255.0
      conn world-net
    leftsubnet=*
    right=%any
    rightsubnet=192.168.10.0/255.255.255.0



    黑體字的部分是你需要根據你實際的環境更改的。我們用的兩端的子網是192.168.1.0/24和192.168.10.0/24。文件中 vpnserver.rd.xxx.com.pem是CA證書。這個配置是通用的,也就是說可以適用LAN-LAN方式的倆接和遠端客戶端兩種方式。
    · 下面配置分支機構的網關。這個機器也要事先安裝完全freeswan等軟體。

    重新執行上面的2.7-2.9步驟生成分支機構的證書,注意:在回答問題的過程中,關於主機名稱的部分的輸入改變為你分支機構的網關機器名稱,比如:vpncliet.rd.xxx.com。

    · 複製下列生成的文件到分支機構網關上的相應位置(比如通過軟盤複製):

     cp vpnserver.rd.xxx.com.pem /etc/ipsec.d
      cp vpnclient.rd.xxx.com.key /etc/ipsec.d/private
      cp vpnclient.rd.xxx.com.pem /etc/ipsec.d
      執行命令:openssl x509 ?in vpnclient.rd.xxx.com.pem ?
        outform der ?out /etc/x509cert.de
      cp rootca.der /etc/ipsec.d/cacerts/RootCA.der
      cp crl.pem /etc/ipsec.d/crls



    · 配置分支機構的/etc/ipsec.secrets 寫上一行:

      RSA vpnclient.rd.xxx.com.key "password"。



    其他行刪除。Password就是前面回答問題的時候輸入的密碼。

    · 配置/etc/ipsec.conf

     # basic configuration
      config setup
    interfaces=%defaultroute
    klipsdebug=none
    plutodebug=none
    plutoload=%search
    plutostart=%search
    uniqueids=yes
      conn %default
    keyingtries=0
    compress=yes
    disablearrivalcheck=no
    authby=rsasig
    rightrsasigkey=%cert
    leftrsasigkey=%cert
    right=%defaultroute
    rightcert=vpnclient.rd.xxx.com.pem
    auto=add
    pfs=yes
      conn roadwarrior
    left=21.9.22.22
    leftcert=vpnserver.rd.xxx.com.pem

      conn roadwarrior-net
    left=21.9.22.22
    leftcert=vpnserver.rd.xxx.com.pem
    leftsubnet=192.168.1.0/255.255.255.0

      conn net-net
    left=21.9.22.22
    leftcert=vpnserver.rd.xxx.com.pem
    leftsubnet=192.168.1.0/255.255.255.0
    rightsubnet=192.168.10.0/255.255.255.0



    其中黑體的部分是你可以根據實際情況修改的。

    · 首先啟動server端的ipsec:ipsec setup restart,然後同樣啟動客戶端的ipsec

    · 建立通道:ipsec auto ?up net-net然後在Server端可以用命令ipsec whack status應該可以看到新建立的幾個通道。此時,你在兩個子網中應該可以互相ping 通。
    3、配置Frees.wan用於支持遠程客戶端訪問。也就是允許一個Windows客戶端,來通過VPN和公司內部的網路進行通訊。

    第2種VPN玩法其實就是把分支機構的LAN換成一個單獨的,地址不固定的機器。這樣的應用適合總經理出差的時候從外地ISP撥號上網連接到本部網路的情況。期間,非但有認證,而且通過ISP和公網的數據全部是加密的。這種方式在伺服器端的配置和上面完全一樣(記得嗎?我們在行面給出的配置已經是兼顧了兩種用法)。這裡需要做的是把總經理的筆記本配成VPN客戶端。他的筆記本應該是windows2000的並且升級到sp2。

    · 首先重複2.7-2.9步驟生成證書,其中有關主機名的部分可以輸入你總經理的機器名。類似於:win.rd.xxx.com。當然,總經理的機器要是同名的。

     openssl pkcs12 -export
    -in win.rd.xxx.com.pem
        -inkey win.rd.xxx.com.key
        -certfile demoCA/cacert.pem
        -out win.rd.xxx.com.p12



    · 用命令察看環境:最好把結果輸出到文件記住,以後用得到。

     openssl x509 -in demoCA/cacert.pem -noout -subject



    · 把上面生成的p12文件傳送到總經理的機器上,放在一個正規的地方(這個文件很重要)。

    · 在總經理的機器上從http://vpn.ebootis.de站點下載:ipsec.exe

    · 在總經理的機器上從: http://agent.microsoft.com/windows2...ipsec資源工具。

    · 安裝上述兩個軟體,並且把他們放在同一個目錄中。

    · 建立一個ipsec的MMC:(希望你知道MMC是什麼)

    依次進入Start/Run/MMC,
    File (or Console) - Add/Remove Snap-in
    單擊 'Add'
    選 'Certificates', 然後選 'Add'
    選 'Computer Account', 然後點 'Next'.
    選 'Local computer', 然後點 'Finish'.
    選 'IP Security Policy Management', 然後點 'Add'.
    選 'Local Computer', 然後點 'Finish'
    選 'Close' 然後點 'OK'



    展開左側窗口中 'Certificates (Local Computer)'
    右鍵 'Personal', 選 'All Tasks' 然後點 'Import'
    點 Next



    輸入哪個.p12 文件的路徑 (就是剛才你從伺服器網關複製過來的,瀏覽選擇也可), 然後點'Next' 輸入export password(密碼), 然後點Next 選'Automatically select the certificate store based on the type of certificate', 然後點Next 點Finish, 如果有任何提示窗口彈出都選yes 退出MMC,保存當前配置到管理工具中,這樣就不用每次都重新來過了。以上所做就增加了一個證書到總經理的機器上。

    · 設置ipsec工具:

    編輯總經理機器上的ipsec.conf文件,把rightca的=後面寫成剛才openssl x509 -in demoCA/cacert.pem -noout ?subject命令生成的結果。類似下面這樣:

     conn roadwarrior
    left=%any
    right=(ip_of_remote_system)
    rightca="C=US,S=State,L=City,O=21vianet,
          CN=CA,Email=ca@xxx.com"
    network=auto
    auto=start
    pfs=yes
      conn roadwarrior-net
    left=%any
    right=(ip_of_remote_system)
    rightsubnet=192.168.1.0/24
    rightca="C=US,S=State,L=City,O=21vianet,
          CN=CA,Email=ca@xxx.com"
    network=auto
    auto=start
    pfs=yes



    黑體部分要注意配置正確。

    · 運行ipsec.exe有下面輸出:

     C:ipsec>ipsec
      IPSec Version 2.1.4 (c) 2001,2002 Marcus Mueller
      Getting running Config ...
      Microsoft's Windows XP identified
      Host name is: (local_hostname)
      No RAS connections found.
      LAN IP address: (local_ip_address)
      Setting up IPSec ...

    Deactivating old policy...
    Removing old policy...

      Connection roadwarrior:
    MyTunnel : (local_ip_address)
    MyNet : (local_ip_address)/255.255.255.255
    PartnerTunnel: (ip_of_remote_system)
    PartnerNet : (ip_of_remote_system)/255.255.255.255
    CA (ID) : C=US,S=State,L=City,O=ExampleCo,...
    PFS : y
    Auto : start
    Auth.Mode : MD5
    Rekeying : 3600S/50000K
    Activating policy...

      Connection roadwarrior-net:
    MyTunnel : (local_ip_address)
    MyNet : (local_ip_address)/255.255.255.255
    PartnerTunnel: (ip_of_remote_system)
    PartnerNet : (remote_subnet)/(remote_netmask)
    CA (ID) : C=US,S=State,L=City,O=ExampleCo,...
    PFS : y
    Auto : start
    Auth.Mode : MD5
    Rekeying : 3600S/50000K
    Activating policy...
      C:ipsec>

    這時候你從客戶端ping伺服器後面的內網得到幾個'Negotiating IP Security'之後就可以ping通了。這樣總經理帶著這台筆記本到有互聯網路的地方就可以象在辦公室一樣連接到公司里了。

    值的注意的是,出於安全性的問題,我們建議你關閉VPN網關上面的所有其他服務,並仔細配置防火牆。通常的,如果你希望把所有的流量都發送給主站網關,在從站就不需要增加iptables策略。否則,需要增加這樣一條策略:

     iptables ?t nat ?A POSTROUTING ?o eth0 ?j MASQUERADE



    在主站由於路由的原因,需要增加下面的策略:

      iptables ?t nat ?A POSTROUTING ?o ipsec0 ?s ! 192.168.10.0/255.255.255.0 ?
        j SNAT ?to 192,168.1.231
      iptables ?t nat ?A POSTROUTING ?o eth1 ?s ! 192.168.10.0/255.255.255.0 ?
        j SNAT ?to 192,168.1.231

    每行中前面的黑體是子網網段,後面的是本網關的內側出口。

  • [火星人 ] 構建基於Linux的VPN網路已經有775次圍觀

    http://coctec.com/docs/linux/show-post-204078.html