2014年7月27日 星期日

架PPTP Server (VPN) 在OpenWrt

PPTP (Point to Point Tunneling Protocol) 是我最常看到的VPN (Virtual Private Network),幾乎所有系統內建支援,甚至貴一點的Route都看得到它的影子,說它是"通用的VPN"也不為過。

虛擬私人網路(英語:Virtual Private Network,簡稱VPN),是一種常用於連線中、大型企業或團體與團體間的私人網路的通訊方法。虛擬私人網路的訊息透過公用的網路架構(例如:網際網路)來傳送行內網的網路訊息。它利用已加密的通道協議(Tunneling Protocol)來達到保密、傳送端認證、訊息準確性等私人訊息安全效果。這種技術可以用不安全的網路(例如:網際網路)來傳送可靠、安全的訊息。需要注意的是,加密訊息與否是可以控制的。沒有加密的虛擬私人網路訊息依然有被竊取的危險。
以日常生活的例子來比喻,虛擬私人網路就像:甲公司某部門的A想寄信去乙公司某部門的B。A已知B的位址及部門,但公司與公司之間的信不能註明部門名稱。於是,A請自己的秘書把指定B所屬部門的信(A可以選擇是否以密碼與B通訊)放在寄去乙公司位址的大信封中。當乙公司的秘書收到從甲公司寄到乙公司的信件後,該秘書便會把放在該大信封內的指定部門信件以公司內部信件方式寄給B。同樣地,B會以同樣的方式回信給A。
在以上例子中,A及B是身處不同公司(企業網路路)的計算機(或相關機器),透過一般郵寄方式(公用網路)寄信給對方,再由對方的秘書(例如:支援虛擬私人網路的路由器或防火牆)以公司內部信件(內部網路)的方式寄至對方本人。請注意,在虛擬私人網路中,因應網路架構,秘書及收信人可以是同一人。許多現在的作業系統,例如Windows及Linux等因其所用傳輸協議,已有能力不用透過其它網路設備便能達到虛擬私人網路連接。(Wikipedia)

在OpenWrt架PPTP,可參考OpenWrt HOWTOs,它並沒有GUI可用,必須用ssh來設定

安裝
opkg install pptpd kmod-mppe

啟用
/etc/init.d/pptpd enable
/etc/init.d/pptpd start

預設IP是172.16.1.1,想用其它IP,修改/etc/ppp/options.pptpd檔案,應該是第一行,像這樣子
172.16.1.1:

再來設定/etc/pptpd.conf加入下面二行...
localip 172.16.1.1
remoteip 172.16.1.100-109
localip在OpenWrt HOWTOs解釋上、應該可以不必加入,作用應該跟修改/etc/ppp/options.pptpd是一樣意思,似乎是版本上不同問題,保險起見、還是加入吧。
remoteip是設定當USER登入後、配發IP的範圍。

在/etc/ppp/chap-secrets設帳號...
#USERNAME  PROVIDER  PASSWORD  IPADDRESS
帳號 * 密碼 *
新增多個直接新增下一行。

設定好之後,重新啟動pptpd就OK了!!
可以用Windows來連線試試看!!

PS:要對外連線,記得設定防火牆

已知問題:

  1. 架好之後、無法連線,還是用自己電腦直接連線測試
    在同區段網路不會有防火牆問題,這是pptpd沒啟動。
    這是軟體BUG,從SSH登入,下pptpd指令,就可以連線了。
    我目前用(12.09, r36088)並無這個問題,目前遇到是trunk版有這問題。
    可以直接在/etc/rc.local裡exit 0之前輸入pptpd  或在網頁上System ==> Startup 下設定
  2. 連線後、無法上網
    在防火牆插入iptables -A forwarding_rule -s 192.168.125.0/24 -j ACCEPT 紅字部分請改你的IP區段

2014年7月26日 星期六

第一次使用OpenWrt

OpenWrt是針對嵌入式裝置的GUN/Linux系統。
主要是以IP分享器為主、除了OpenWrt,還有其他像dd-wrt、Tomato(番茄)、Gargoyle(石像鬼),也針對分享器開發。

這些韌體各有優缺點(主要還是GUI方面...),但都是以Linux為基礎核心。

要如何知道你的分享器有支援這第三方韌體,查詢官方網頁就知道!!
OpenWrt (官方WikiWikipedia)  只有最基本、需要其他功能必須自己裝
dd-wrt (官方WikiWikipedia) 功能很齊全!!GUI介面反應較慢
Tomato (Wikipedia) 沒用過、據說不錯用
Gargoyle (Wikipedia) 沒用過、據說Qos設定很方便好用

強烈警告!!
刷機有一定的風險!!有可能會刷壞變磚(brick)!!但九成八以上使用者都是操作不當!!
是可以試著用TTL線救回來,要是TTL線不行,直接在買一台新的吧。(須拆機!最好不要用!!)
PS:TTL線,拍賣都有得賣,其實就是RS-232,差在電壓信號不一樣,身邊有現成的USB to RS-232 也可以在接MAX232之類IC轉換電壓信號,電腦(串列阜)上的也可以。

在這裡、主要我以OpenWrt第一次登入設定為主
需要telnet跟ssh連線軟體,我是用PuTTY (用telnet時,請直接點telnet協定、直接改port不能用)

刷好OpenWrt之後,要先用telnet連192.168.1.1設定root密碼
如果不是192.168.1.1,請看自己網路設定裡"預設閘道"

passwd root


設定完後、下次登入就只能用ssh登入,telnet就不能登入

密碼設好後,設定上網方式,default是dhcp。
要以pppoe連線:

vi /etc/config/network



config interface 'wan'
        option ifname 'eth1'
        option proto 'dhcp'



config interface 'wan'
        option ifname 'eth1'
        option proto 'pppoe'
        option username '你的帳號'
        option password '你的密碼'

儲存離開後

/etc/init.d/network restart

就會以pppoe自動連線上網

上網設定好後,就可以安裝OpenWrt上的軟體庫
建議安裝luci來輔助設定,有GUI介面比較容易理解

opkg update  (第一次使用opkg或清單過期,得先update)
opkg install luci
/etc/init.d/uhttpd enable (設定開機啟動)
/etc/init.d/uhttpd start (啟動uhttpd)

這樣就可以用http://192.168.1.1設定分享器

注意!!盡量以GUI+SSH方式來設定
有部分版本在GUI設定好,並未即時生效,還是要用SSH來restart

2014年2月5日 星期三

XBMC裡 Youtube無法登入解決辦法 (在Ubuntu 12.04 LTS)

環境Ubuntu 12.04 LTS  XBMC 12.3  Youtube 4.4.6

雖然XBMC上Youtube外掛是可以用、也可觀看影片。
XBMC只有對岸的拼音輸入法,在搜尋上是有點困難
但可以用電腦搜尋後,再加入"稍後觀看"清單裡。
一樣可以在XBMC上撥放!
這些就必須要有登入才能使用!!

實際上、它應該可以在美國地區可以正常使用。
美國地區是使用ANSI字碼 ,在台灣連Youtube是使用UTF-8,
在登入時、會出現字碼轉換的問題,它自己本身沒有做字碼轉換。
所以在XBMC的Youtube設定好帳號密碼  會出現"plugin.video.youtube腳本錯誤"。

修改"~/.xbmc/addons/plugin.video.youtube/YouTubeCore.py"
大約在第399行那  有一段是...
        if get("url_data"):

            request = urllib2.Request(link, urllib.urlencode(url_data))
            request.add_header('Content-Type', 'application/x-www-form-urlencoded')
在"if get("url_data"):"下插入程式碼
            urldata = get("url_data")
            url_data = {}

            for key in urldata:
                url_data[key.encode('UTF-8')] = urldata[key].encode('UTF-8')

也就是變成這樣.....
        if get("url_data"):
            urldata = get("url_data")
            url_data = {}

            for key in urldata:
                url_data[key.encode('UTF-8')] = urldata[key].encode('UTF-8')

            request = urllib2.Request(link, urllib.urlencode(url_data))
            request.add_header('Content-Type', 'application/x-www-form-urlencoded')

解決字碼問題後,plugin.video.youtube還是會出現Flase錯誤。
原因應該是Youtube網頁有修改過、要搜尋Html的Tag不符  (不確定是不是美國Youtube與台灣Youtube不相同)

修改"~/.xbmc/addons/plugin.video.youtube/YouTubeLogin.py"
尋找   (在第199行)
nick = self.common.parseDOM(ret["content"], "p", attrs={"class": "masthead-expanded-acct-sw-id2"})
修改成
nick = self.common.parseDOM(ret["content"], "span", attrs={"id": "yt-masthead-user-displayname"})

修改後、就可以正常登入。

youtube scripts是用python寫的
python是很重視tab跟enter  跟C/C++、Java 用"{}"差很多   說實在的  我也不太會  >"<
修改時要注意python的編寫規則....

參考文章
http://wiki.xbmc.org/index.php?title=Add-on:YouTube
https://code.google.com/p/youtubexbmc/issues/detail?id=103
https://code.google.com/p/youtubexbmc/issues/detail?id=115

2013年10月21日 星期一

在Ubuntu 12.04 LTS 設定防火牆 (使用ufw)

ufw即為「Uncomplicated Firewall」的縮寫,直譯則是「不複雜的防火牆」
Ubuntu 的 ufw 跟之前學的iptables比,真的很簡單
但是 ufw 只是一個簡單的 iptables 前端定工具,無法完全取代 iptables 的有設定,所以若想做進一步複雜的 firewall 設定,還是得回到 iptables 層面。
簡單幾句指令、就可以加入規則

Ubuntu預設都會安裝,如果你目前使用的版本沒有
sudo apt-get install ufw
所有設定檔在/etc/ufw/下

常用的指令
啟用
  sudo ufw enable

關閉
   sudo ufw disable

查看防火牆狀態/規則
   sudo ufw status

查看防火牆規則  以編號列出
sudo ufw status numbered

刪除防火牆規則

sudo ufw delete RULE | NUM
Ex:
sudo ufw delete 1  //刪除列表"1號"規則
sudo ufw delete allow http  |   sudo ufw delete allow 80
sudo ufw delete deny http  |   sudo ufw delete deny 80
sudo ufw delete reject http  |   sudo ufw delete reject 80
================================================
加入防火牆規則
sudo ufw allow http  |   sudo ufw allow 80
指令跟刪除差不多  只是把delete拿掉
指令裡、以protocol方式加入  如上面http之類的...
ufw會參照/etc/services裡面的通訊對照  想以其他的protocol  可以去裡面找  不然也可以直接打

阻擋外部進來的服務
   sudo ufw default deny 

內定是允許或是禁止

   sudo default allow[deny]

指定從10000埠到20000埠 設定allow  通訊協定為UDP
sudo ufw allow 10000:20000/udp
反之  刪除在allow前加delete
sudo ufw delete allow 10000:20000/udp

參照網頁
http://kirby86a.pixnet.net/blog/post/94339388-ufw(uncomplicated-firewall)%E5%AE%89%E8%A3%9D%E8%88%87%E8%A8%AD%E5%AE%9A
http://cm-life.blogspot.tw/2008/05/ufw.html
http://cm-life.blogspot.tw/2008/05/ufw.html?m=1
https://help.ubuntu.com/community/UFW
http://www.arthurtoday.com/2010/11/ubuntu-ufw.html#.UmUFeVCnp6s
http://download.ithome.com.tw/article/index/id/974
http://wiki.ubuntu-tw.org/index.php?title=Ufw
http://www.arthurtoday.com/2009/11/ubuntu-ufw.html#.UmUkn1Cnp6s

2013年9月14日 星期六

安裝OFFICE2007出現 WINDOWS INSTALLER 服務無法更新某些被防寫保護的WINDOWS檔案

從XP的原版光碟裡 "I386\FP40EXT.CAB"解壓縮fp4autl.dll到"C:\program files\common files\microsoft shared\web server extensions\40\bin"

再重新安裝OFFICE2007就OK了

2013年7月26日 星期五

用 Eclipse Java 開發 Google Drive API (基本範例)

主程式:Eclipse  (我是用Indigo版 3.7)
Eclipse外掛:使用 Eclipse 專用的 Google 外掛程式 (最好參考這裡Google Plugin for Eclipse)
程式碼範例:Quickstart: Run a Drive App in Java

首先先建置Eclipse的環境  (建議不要用中文外掛  問題多多)

先到 Help ==> Install New Software

點Add

Name 隨便打  打你看得懂的就好
Location 輸入外掛的網址
外掛的網址請依照你的Eclipse版本  Google Plugin for Eclipse 輸入
在按OK
我是點這三個
在下載安裝的時候  可能會發生錯誤  可以不用理他
安裝完成後  Eclipse 要重開


你會看到你的Eclipse工具列上多了Google的按鈕  (沒看到請回應我  我忘記我是怎麼弄的)

好了...  Eclipse的環境建置好了

新建Java project

程式碼如下   (怕以後原始網頁會改  在此紀錄我所使用的範例)
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class DriveCommandLine {

  private static String CLIENT_ID = "YOUR_CLIENT_ID";
  private static String CLIENT_SECRET = "YOUR_CLIENT_SECRET";

  private static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
  
  public static void main(String[] args) throws IOException {
    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();
   
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE))
        .setAccessType("online")
        .setApprovalPrompt("auto").build();
    
    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
    System.out.println("Please open the following URL in your browser then type the authorization code:");
    System.out.println("  " + url);
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String code = br.readLine();
    
    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
    GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);
    
    //Create a new authorized API client
    Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).build();

    //Insert a file  
    File body = new File();
    body.setTitle("My document");
    body.setDescription("A test document");
    body.setMimeType("text/plain");
    
    java.io.File fileContent = new java.io.File("document.txt");
    FileContent mediaContent = new FileContent("text/plain", fileContent);

    File file = service.files().insert(body, mediaContent).execute();
    System.out.println("File ID: " + file.getId());
  }
}
請依照請況修改你的Class Name

你會發現你import的部分  有一堆找不到lib的部分

這時候請點工具列的Google按鈕
點Add Google APIs

找Drive API在按Finish  (我是用v2版)
完後  你會看到妳的project底下另外多了Drive API的Lib
再回去看程式碼import的部分
紅底線就會不見了  因為有正確匯入的Google API的JAR

接下來要在自己的帳戶開啟API權限
點Services裡面找Drive API  把她打開
再點API Access ==> Create an OAuth 2.0 client ID
Application type裡面 選Installed application
Installed application 裡選Other
再點Create Client ID


會有類似這樣的東西
對應範例程式碼裡面"CLIENT_ID"跟"CLIENT_SECRET"
照上面紅色箭頭修改

範例程式碼最下面有一段
"java.io.File fileContent = new java.io.File("document.txt");"
這個就是要上傳的檔案
例如C:\document.txt就改成"C:\\document.txt"
這樣程式可以Run了

這個範例會在雲端硬碟的根目錄建立一個"My document"的檔案其內容就是document.txt的內容