2010/07/09

Oleg: 利用 PoPToP 架設 PPTP VPN 服務

PPTP VPN 算是最容易實作和使用的 VPN 服務。Windows 已內建連線客戶端,只要幾步驟就可以建立連線,在公司連回家中 VPN 穿過公司防火牆看網頁,或者在國外出差時連回家中 VPN 存取網路芳鄰等。連線過程有經過加密,總之是一個幹壞事的好管道。你的 AP 或許會需要這個架設功能,以後好方便使用。刷過 Oleg 韌體的 ASUS WL-520gU 要做到這件事,靠 ipkg 套件管理系統簡直是易如反掌。 (參考:Oleg: 安裝 ipkg Optware 套件管理系統)

安裝方法

$ ipkg install poptop

修改設定

/opt/etc/pptpd.conf

#logwtmp
因為程式會嘗試載入 /usr/lib/pptpd/pptpd-logwtmp.so,可是這個地方根本沒這個檔案,而且在 Oleg 韌體中 /usr/lib 屬於唯讀區域無法讀寫。修改成註解只是不會紀錄連線狀態,對 VPN 連線並無影響。

localip 192.168.1.10
remoteip 192.168.88.1-5
分配IP。請參考:PoPToP - Ubuntu 下架設 PPTP VPN

/opt/etc/init.d/S20poptop

找到以下文字:
/opt/sbin/pptpd -b `nvram get lan_ifname` -c ...
改成:
/opt/sbin/pptpd -c ...
把 -b 項目刪除的原因是,我發現它呼叫的 bcrelay 對我們並沒有什麼幫助,還是要自己修改 iptables 防火牆設定,乾脆關掉節省記憶體。

/opt/etc/ppp/chap-secrets

預設無此檔案,必須自己建立。可以從 PoPToP 官網拉範本檔來改。
$ wget http://poptop.sourceforge.net/dox/chap-secrets.txt -O /opt/etc/ppp/chap-secrets
# PPP CHAP secrets file.
# See pppd(1) for file format.

# Secrets for authentication using CHAP
# client        server  secret          IP addresses
username       pptpd   password        *

# For ppp patched with smbauth you use
# * pptpd &/etc/samba/smbpasswd *

最後記得改權限保護這個檔案:
$ chmod 600 /opt/etc/ppp/chap-secrets

由於 Oleg 內建的 pppd 並不會到 /opt/etc/ppp 去讀取 chap-secrets,而是在 /tmp/ppp 目錄下,因此我們可以建一個 Symbolic Link:
$ ln -s /opt/etc/ppp/chap-secrets /tmp/ppp/chap-secrets

因為 /tmp 是屬於 Flash 儲存,重開機後會消失,因此我們還要多做一些設定將這些更改保留。

/tmp/local/.files

/tmp/ppp/chap-secrets
這個檔案可以設定當執行 flashfs 相關儲存時,哪些檔案要保留以便下次開機時自動回復。如果沒有做這步驟在 Flash 所做的修改重開機後就全不見了。

如果檔案內已經有內容,則附加在檔案後。如果沒有這個檔案,請手動建立。

/usr/local/sbin/post-firewall

防火牆設定。這個檔案可能已經有一些設定 (例如你架了網頁伺服器,並做了防火牆設定。參考:Oleg: 安裝網頁伺服器 (thttpd, lighttpd, nginx) 和 PHP FastCGI)。我們的目的是要開啟 TCP 1723 和 GRE 協定,請將 # PPTP 以下的這幾個指令插入到檔案裡,記得一定要在最後一行 (iptables -A INPUT -j DROP) 之前,不然設定會沒用。

iptables -I FORWARD 紀錄非常重要,如果少了這個封包將會被 Oleg 預設的防火牆規則給擋下來,可以看到 /tmp/syslog.log 有許多 DROP 紀錄。而使用 -I 插入而非 -A 附加是因為 -A 附加在預設規則之後,如果不插入在預設規則之前,此規則將無效而仍會被阻擋。網段部分請參照 remoteip 設定修改。

為什麼不用加 iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -o ppp0 -j MASQUERADE 呢?因為 Oleg 預設規則已經有適合的了。iptables -I FORWARD -d 192.168.88.0/24 -j ACCEPT 規則也是同樣的道理,所以只要 iptables -I FORWARD -s 192.168.88.0/24 就好了。
#!/bin/sh
....略
# PPTP
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -I FORWARD -s 192.168.88.0/24 -j ACCEPT
....略
iptables -A INPUT -j DROP

儲存 Flash 所做的修改

$ flashfs save && flashfs commit && flashfs enable
請記得修改非 /opt 位置的檔案 (例如 /tmp, /usr/local -> /tmp/local) 後一定要進行此步驟。如果沒做儲存的動作,所做的修改會全部白費。包括剛才的 /tmp/ppp/chap-secrets 和 /usr/local/sbin/post-firewall。

重新開機

$ reboot

重開完成後找一台電腦來試試看 VPN 連線是否可以建立,及連線是否正常。

問題集錦

如有問題請查看 /tmp/syslog.log 文件 (或網頁介面的 Status & Log - System Log),找出相關錯誤訊息來除錯。

問題一

pppd[371]: File not found
pppd[371]: Couldn't load plugin /usr/lib/pptpd/pptpd-logwtmp.so
請修改 /opt/etc/pptpd.conf,把logwtmp前面加上#註解掉。

問題二

pppd[587]: The remote system is required to authenticate itself
pppd[587]: but I couldn't find any suitable secret (password) for it to use to do so.
pptpd[586]: GRE: read(fd=6,buffer=4205cc,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs
沒建立符號連結 /tmp/ppp/chap-secrets,pptpd 找不到認證用的帳號密碼檔。

問題三

ping 或 tracert 或瀏覽網頁皆沒有回應。在 /tmp/syslog.log 有發現 DROP 的紀錄。
執行 iptables -L -v,檢查 Chain FORWARD 第一筆紀錄是不是自己加的規則。
Chain FORWARD (policy ACCEPT 275 packets, 9788 bytes)
 pkts bytes target     prot opt in     out     source               destination 
  220 29733 ACCEPT     all  --  any    any     192.168.88.0/24      anywhere    
    0     0 ACCEPT     all  --  br0    br0     anywhere             anywhere    
    0     0 logdrop    all  --  any    any     anywhere             anywhere            state INVALID
...略

不是的話請修改 /usr/local/sbin/post-firewall 檔案,使用 iptables -I 方式插入到最前面。

其他不通問題,請參考 Diagnosing Forwarding on pptpd 頁面一步步檢查除錯。要使用 tcpdump 抓封包工具協助除錯,請先安裝:

$ ipkg install tcpdump

參考環境: ppp0 是 AP 進行 PPPoE 撥接後建立的對外連線,ppp1 是 PPTP VPN 連線成功後所建立的連線。可下 ifconfig 查看。環境有不同的請自行查看 ifconfig 結果判別。

Client Tunnel Network Interface : ppp1
Client Tunnel Network Interface Address : (同remoteip設定)
Server Tunnel Network Interface : ppp1
Server Tunnel Network Interface Address : (同localip設定)
Server External Network Interface : ppp0

參考文章

- Poptop installation - AsusForum.NET -- WL500g
- PPTP vpn server available for oleg firmware? - AsusForum.NET -- WL500g

2 則留言:

  1. For the firewall rule it is better to add the following line:
    "iptables -D INPUT -j DROP"
    before "iptables -A INPUT -j DROP"
    so that the original "reject all rule" at the end is removed

    回覆刪除
  2. Yes.

    "iptables -D INPUT -j DROP" should be put at first in order to remove "DROP ALL" last default rule. I just didn't show it at this example. I just suppose you have created this file and now you open this file for adding some new rules for PPTN VPN.

    If you have saw another article, you can find the whole example of "post-firewall" file. "iptables -D INPUT -j DROP" is just there.

    回覆刪除