冷呆獸試驗場

設定L2TP / IPSec Server for Android on Ubuntu 10.04

原本參考了好幾篇文章使用openswan與xl2tpd架設L2TP/IPSec VPN Server, 但是設定好之後, 都只能連上幾秒鐘又斷線, 直到看到這篇:

如何在Debian/Ubuntu服務器上架設PPTP/L2TP/IPSec VPN

看了之後才發現重點在Ubuntu 10.04自己套件庫的openswan有問題, 照著上面這篇換了套件版本後就成功連上, 所以做了一下筆記:

環境: Ubuntu 10.04.4 32bit, 使用pppoe撥接, 有設定eth0內網IP

  1. 先加入ppa的套件庫, 安裝新版的openswan和所需的套件

    sudo apt-get install python-software-properties  
    sudo add-apt-repository ppa:openswan/ppa  
    sudo apt-get update  
    sudo apt-get install openswan ppp xl2tpd
    

    在安裝過程都用預設值安裝

  2. 修改/etc/ipsec.conf

    version 2.0  
    config setup  
            nat_traversal=yes  
            virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12  
            oe=off  
            protostack=netkey  
            plutostderrlog=/var/log/pluto.log  
    
    include /etc/ipsec.d/l2tp-psk.conf
    
  3. 修改/etc/ipsec.d/l2tp-psk.conf, 將裡面的YOUR_SERVER_IP改成你的IP, 應該也可以改成domain name

    conn L2TP-PSK-NAT  
        rightsubnet=vhost:%priv  
        also=L2TP-PSK-noNAT  
    
    conn L2TP-PSK-noNAT  
        authby=secret  
        pfs=no  
        auto=add  
        keyingtries=3  
        dpddelay=40  
        dpdtimeout=130  
        dpdaction=clear  
        rekey=no  
        ikelifetime=8h  
        keylife=1h  
        type=transport  
        left=**YOUR_SERVER_IP**  
        leftprotoport=17/1701  
        right=%any  
        rightprotoport=17/%any
    
  4. 修改/etc/ipsec.secrets, 加入下面這行, 後面的YOUR_PSK_STRING請自行代換成為想要的字串

    **YOUR_SERVER_IP** %any: PSK "**YOUR_PSK_STRING**"
    
  5. 修改/etc/xl2tpd/xl2tpd.conf, 將YOUR_SERVER_IP換掉, 還有設定自己想要的虛擬IP range, 請勿與現有的IP range重覆到, local ip則是要在range之外同網段的IP

    [global]  
    ipsec saref = yes  
    listen-addr = **YOUR_SERVER_IP**  
    port = 1701  
    
    [lns default]  
    ip range = 192.168.1.51-192.168.1.100  
    local ip = 192.168.1.50  
    refuse chap = yes  
    refuse pap = yes  
    require authentication = yes  
    name = Moe-Eee  
    ppp debug = yes  
    pppoptfile = /etc/ppp/options.xl2tpd  
    length bit = yes
    
  6. 修改/etc/ppp/options.xl2tpd, ms-dns可換成自己慣用的DNS server

    require-mschap-v2  
    ms-dns 168.95.1.1  
    ms-dns 168.95.192.1  
    asyncmap 0  
    auth  
    crtscts  
    lock  
    hide-password  
    modem  
    debug  
    name l2tpd  
    proxyarp  
    lcp-echo-interval 30  
    lcp-echo-failure 4
    
  7. 修改/etc/ppp/chap-secrets, 加上自己想要的帳號與密碼

    "user1" l2tpd "password1" *
    
  8. 自行新增一個shell script, 或是加在/etc/rc.local裡面:

    echo 1 > /proc/sys/net/ipv4/ip_forward  
    for each in /proc/sys/net/ipv4/conf/*  
    do  
        echo 0 > $each/accept_redirects  
        echo 0 > $each/send_redirects  
    done  
    iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT  
    iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT  
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE  
    bash -c "sleep 5; /etc/init.d/ipsec restart"
    
  9. 重啟openswan與xl2tpd:

    sudo /etc/init.d/ipsec restart  
    sudo /etc/init.d/xl2tpd restart
    
  10. 檢查ipsec設定:

    sudo ipsec verify
    

執行上面指令的結果應該除了最後一項Opportunistic Encryption Support會是DISABLED以外, 其他都OK, 不過目前使用的這個版本在Two or more interfaces found, checking IP forwarding會顯示FAILED, 在google之後發現應該是可以略過的錯誤

  1. 檢查port是否有在listen:
    在UDP/500與UDP/4500的部份會由pluto這隻程式listen, 而UDP/1701(先前設置的)會由xl2tpd所listen

接下來是設定Android上的VPN連線 設定 -> 無線與網路 -> VPN設定 -> 新增VPN

選 新增L2TP/IPSec PSK VPN

VPN名稱: 請自行取個名字

設定VPN伺服器: 填上VPN Server的public IP或是domain name

設定IPSec預先共用金鑰: 填入前面設定的YOUR_PSK_STRING

啟用L2TP密碼: 保持不勾, 這個沒有使用

DNS搜尋網域: 不更改

設定完成後按倒退鍵將目前設定儲存, 再按下剛剛設定的VPN名稱開始連線, 輸入前面設定的user1與password1就可以連線了