作者:cschen33.tw@yahoo.com.tw
最後更新日期:2003/08/25
本文參考:http://amvpn.sourceforge.net/amvpn.html(需 要較詳細的資料請參考這)

●補注:版本已經更新到0.99, 好像已經不發展了....
◎補注(2003/08/05): 版本已經更新到0.98,多了幾個參數,可以使用email來通知連線的狀況,不久再補充
●這是後來加的註解,希望你在看本文時心理有一個底
本文是可以解決linux<->linux間的VPN,如果你想要跨平台解決方案(windows<->linux)的話,我後 來找到所謂PPTP(這是微軟的point to point tunnel protocol),可做為VPN server,而client端的軟體只要是windows98以後都有,重點是linux之類的作業系統有一個免費版的Sever 版poptop(www.poptop.org)而client版的也有,如此所有的軟體都有 了,你就不用在煩惱的事,因此如果是跨平台的可以考慮pptp,,可以略過本文


你可能已經很聽過VPN很久了,但是其原理是什麼如何做?需不要硬體的配合?等等的疑問,也看過別人寫的VPN實在是很難看得懂,但是自己使用軟體實作之 後,豁然開朗,我發了兩天的時間就測試成功(一天看資料,另一天實作,除錯三、四天),所以寫下來希望對你有幫助,因為其中有碰到一些問題,解決了之後, 覺得真的很簡單,以下的說明將一步步的導引進入VPN的世界
#我也看了一下windows nt(2000,xp)等所提供的vpn設定是很好設定,但不知在做什麼(不用懂原理)?,不似linux實在(不懂要架的起來很難)

VPN對你有何幫助?
如果你公司有兩個office,有兩個區域網路,透過VPN可以將兩個區域網路經由網際網路公網將產生一個通道將其串起來,也就是在感覺上兩個網路可以使 用私人ip互相連線(任何的服務均可直接連線如ping,telnet,www,Windows網路芳鄰等等)
而建立的通道是以編碼的方式在網際網路上連線,而且所有兩個私網間的任何建線都是以編碼,因此安全性比較高


VPN的原理:
我們可以下面兩張圖片來解釋
兩個網路以VPN連接如下圖:

連線時或使用的感覺如下圖:


實作amvpn
  1. 下載檔案:

  2. 請至amvpn的網站下載,我是使用redhat9.0因此我 下載rpm的src檔 使用下面命令
    rpmbuild --rebuild  amvpn-*.src.rpm
    然後安裝上述所提示編譯後的軟體
    rpm -ivh amvpn-0.xx.rpm
  3. 系統要求:
  4. Gun/Linux Kernel 2.4.x
  5. 相依的外部元件

  6. 你必須安裝有openssl相關套件
  7. 安裝的設定檔共有兩個檔
    1. /etc/amvpn.conf 這是amvpn的主要設定檔沒有別的
    2. /etc/modules.conf 如果你原始的/etc/modules.conf中沒有一個虛擬的設備tun則amvpn套件會幫你加入一個,並備份原始的檔案到 /etc/modules.conf.dist

  8. 安裝的執行檔共有三個
    1. /sbin/amvpn:執行檔
    2. /etc/rc.d/init.d:啟動為系統服務的角本
    3. /sbin/amvpn-keytool:這是一個簡單的key及certificates的管理及產生工具,它是使用opssl命 令列的工具來產生keys並使用sftp來安全的傳送CSR(Certificate Signing Request)


  9. 使用amvpn-keytool來產生keys及certificates等我們以兩台主機來說明M1為server而M2為client要 執行命今時請先確這兩台主機的ssh服務有執行,然後依序執行下面的命令,目前還不是非常熟悉(待我明白後再加以補充)
    M1

    amvpn-keytool genca
    amvpn-keytool genkey
    amvpn-keytool gencert
    產生key/cert
    產生VPN key/CSR
    產生VPN cert
    M2

    amvpn-keytool genkey
    amvpn-keytool -r root@M1:/usr/share/amvpn -c gencert
    產生VPN key/CSR
    -c代表執行amvpn-keytool由遠端的機器
    M1
    amvpn-keytool -r root@M2:/usr/share/amvpn gencert
    M2

    amvpn-keytool validate
    0.99
    接下來在M1及M2各執行amvpn-keytool secure amvpn (這個命令是要配合/etc/amvpn.conf中run-as-user amvpn)它會更改/usr/share內目錄及檔案的權限
  10. 設定檔實例(/etc/amvpn.conf)
    下面包含了server及client上兩台主機的/etc/amvpn.conf的設定,你可以根據自己私網的設定變動少許就可以套用,至於 tunnel-ip代表則是選該區域網路內沒有用到的ip就可以了
  11. server(192.168.1.0)
    client(192.168.2.0)
    tunnel-ip 192.168.16.1


    route-ip 192.168.16.0
    route-mask 255.255.255.0

    route-ip 192.168.2.0
    route-mask 255.255.255.0

    #proxy(代理伺服器設定)
    #因為我不需要所以沒有設定
    #proxy-IP
    #proxy-port
    #proxy-user
    #proxy-password

    #SMB(網路芳鄰)轉送設定
    #它轉送UDP137的資料(分享資源廣播)
    local-net 192.168.1.0
    local-mask 255.255.255.0
    remote-net 192.168.2.0
    remote-mask 255.255.255.0
    route-smb yes
    tunnel-ip 192.168.16.2
    #server-ip "server的public的IP"
    server-ip 111.222.333.444
    route-ip 192.168.16.0
    route-mask 255.255.255.0

    route-ip 192.168.1.0
    route-mask 255.255.255.0








    #SMB(網路芳鄰)轉送設定

    local-net 192.168.2.0
    local-mask 255.255.255.0
    remote-net 192.168.1.0
    remote-mask 255.255.255.0
    route-smb yes
  12. 啟動
  13. 經由上述的設定之後我們可以啟動兩個服務在兩台主機啟動請執行service amvpn start
    如果一切正常的話則兩台電腦間已經建立了一個通道(連線)
  14. 路由設定

  15. 在上述主機方面已經設定好之後一般windows電腦的必須新增路由,如在上述的server區域網路內的電腦必須加入route add 192.168.2.0 mask 255.255.255.0 "server私人ip",而client區域網路內的電腦必須加入route add 192.168.1.0 mask 255.255.255.0 "client私人ip",這樣子封包才會往正確的地方送,另外要再加入route add 192.168.16.0 mask 255.255.255.0 "server或client私人ip"
  16. 測試
    server主機


    查看與client的連線
    檢查tun設備
    查看路由


    測試連線

    測試網路芳鄰

    再來到其它電腦上查看網路芳鄰上的整個網路
    看是否有client上的群組,及是否可以直接
    連線如果可以就成功如果失敗請看下面
    雜項問題

    netstat
    ifconfig
    route


    ping 192.168.2.254
    ping 192.168.2.x 
    nmblookup teddy
    主機名稱:7171 應該存在
    會多出一個tun0設備
    會多了一個閘道
    192.168.2.0  /tun0
    192.168.16.0 /tun0
    ping client
    ping client內部的電腦
    查詢client內部的一台電腦名稱
    查得到才是正常
    client主機


    查看與server的連線
    檢查tun設備
    以下同上
    netstat
    ifconfig
    route


    ping 192.168.1.254
    ping 192.168.1.x
    nmblookup jim
    主機名稱:7171
    會多出一個tun0設備
    會多了一個閘道
    192.168.1.0  /tun0
    192.168.16.0 /tun0
    ping server
    ping server內部的電腦
    查詢server內部的某台電腦名稱
    查的到才是正常

  17. 雜項問題
    1. wins
    2. 在windows的鄰路芳鄰有一個分享資源的廣播功能,會使用wins來將那些資源記錄下來(名稱及ip),如此我們可以使用ip來存取該項資源
      由於我台北主機是windows nt4.0沒有啟動wins,所以網路芳鄰要看基隆的群組時好時壞,後來啟動了wins(我看不到另一個網域的IP)服務還是時好時壞,本來想用 remote announce 但是還是有問題,後來實在受不了,將nt4.0的wins關閉啟動另一個samba的wins功能,結果nmblookup 在server及client 均能正常的執行(可能nt4.0的和samba有相容性的問題吧?),samba啟動wins很簡單/etc/samba/smb.conf加入一行 wins support = yes就可以了
    3. windows電腦網路芳鄰無法瀏覽時
    4. windows電腦一定有tcp/ip協定不一定要有NetBUEI協定,因此沒有的話請新增,如果存在tcp/ip則
      請查看一下該電腦的網路的設定中TCP/IP項目wins設定是否有誤,最好是加入wins,然後使用net view \\主機名稱,來查詢或是net view /workgroup:群組的名稱 來查詢,一定要查的到才行,可是有時候你必須在兩邊的主控主機建立帳號,我曾經遇到查詢時說使用者密碼錯誤,之後加入smb的帳號就正常了,
    5. 電腦識別資料及群組

    6. 這也是我碰到的一個問題,某一電腦的名稱和一samba主機的群組相同,讓我浪費了一些時間在這個問題上,最後決定更改群組名稱,問題就解決了,另外有些 電腦不在群組內,可能是該電腦的識別資料有誤,你可以在我的電腦->控制台->網路->識別資料 內設定你的工作群組,記住登入的網域和你本身所在的工作群組沒有絕對的關係,因此網路芳鄰才可以不同的群組
    7. samba重新啟動,真的有啟動嗎?
    8. service smb restart ,真的重新啟動嗎?,我測試service smb stop 後執行ps -aux |grep nmbd ,常會看見有殘留的行程,因此之後,我執行service smb restart通常會加一個命令nmblookup 本機的smb名稱,直到查到才確定成功啟動
    9. 我試著設定好幾個wins(跨網域)可以部份解決網路芳鄰看得到確無法存取的問題,聽說撥接網路,如果wins設定為遠端的網路wins 伺服器,也有可能可以瀏覽該網路

網路芳鄰的設定:
我有兩個區域(子網)網路:
192.168.0.0(workgroup1) ,domain master ,wins (windows nt4.0)
192.168.1.0(workgroup2) ,domain master ,wins(samba)
我參考了samba的BROWSIN.txt的文件,其中並沒有我要的結果
整理其說明如下:
  1. 每一個子網都會推舉一個local master borwser(LMB),然後local master browser 會尋找domain master browser(DMB),告訴DBM說它是某子網的(LMB)的傳送一個封包"MasterAnnouncement"給(DMB),如此DBM就會定 時的排程的同步該LMB的browse list,因此不管你有多少子網都可以整合成一個大的browser list
  2. 如果網路內有NT的機器DBM一定要給NT來當否則會有很多問題
  3. 在該本章中提到的一群組名稱都相同,而DMB也只有一台,但我的不是我有兩個群組(網域),兩個DBM(一個NT一個SAMBA),經測試兩 個網域主機根本無法溝通,samba使用remote announce ,remote browse sync 到NT沒用,而NT沒有這種功能,如果都是NT或是都是samba可能就沒有問題
  4. 因此在網路芳鄰看不到不同網域的群組是正常,但是如何可以連上對方子網的電腦,將對方子網的wins主機加入TCP/IP的設定,然後去尋找 電腦,或是使用瀏覽器\\電腦名稱或IP
  5. 建議網路芳鄰的主機最好是同一種作業系統,否則會有很多問題
  6. 網路芳鄰看不到並不代表不存在,在確定資源存不存在最重要的是使用DOS下的兩個工具net ,nbtstat來查看,因為沒有群組,主機也是可以存在的 ,如果samba則findsmb,nmblookup ,及smblcient 都是很好的工具
  7. 以下是LMB的註冊碼
    00
    一般機器
    03
    wins
    1B
    DBM
    1E
    Group的名稱
    01
    Master Browser


AMVPN的環境檔說明

新增功能(email- notify)
0.98多了e-mail通知功能的功能
可以在發生一些事件時通知系統管理員
下面的事件是可以設定通知client或是server端.


notify-sender-id

Email-id 放置在通知信的from欄位.例如:

notify-sender-id admin@example.com

如果這個功能沒有指定在amvpn的環境檔,將會使用如下的格式: <run-as-user>@<host-name>這堛 <run-as-user> 是run-as -user選項所指定的使用者名稱,而<host-name>是本機主機的名稱.

notify

可用的事件如下. 它有一般的格式: notify event-name:email-id-list. 而email-id-list是一個或是多個的email. 多個email必須使用,分開.事件的名稱可以是下面的任一個:

範例如下:.

max-pending-mails

在這種情況下慢速連線的email通知信可能發費許多時間,而先前的通知信可能還未在送,而下一個通知信是正在處理中.為了避免大量等待通 知要,可能費盡系統的資源,這個選項可以被使用.如果沒有指定內定是5.

如果amvpn程序是被使用('kill -9'刪除),則它將無法傳送通知郵件.然而通知 將會將會由另一端來傳送(如果另一端有設定), 因為它會偵測到一個disconnect. 因此,建議最好是兩邊都設定,如此任一邊被kill都會得到通知.



結論:
上述是以軟體的實作,當然外面也有硬體在賣,其原理不脫上述的,知道原理就可以很容易上手,簡而言之一般vpn軟體,會先建立一個虛擬的設備它可以指定 ip就好像一個網路卡的設備一樣,在兩台機器間建立一個編碼的連線,配合適當的路由轉送封包,然後一切就像一般的區域網路的操作般
一旦設定好了,應用就是你的問題了(例如:電腦的遠端搖控就變的很簡單,因為都是使用私人IP)
可以你還是考慮你網際網路的頻寬(不要真的把它認為會和區域網路內的一樣快,一定會慢,有點耐心),可能的話將公共網路的速度升級
待續....