<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>查理布朗的倒楣世界 &#187; debian</title>
	<atom:link href="http://clyang.net/blog/tag/debian/feed" rel="self" type="application/rss+xml" />
	<link>http://clyang.net/blog</link>
	<description>Clyang's Murmuring</description>
	<lastBuildDate>Tue, 27 Mar 2012 20:57:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>在Debian下快速合併多個tiff檔並轉成pdf格式</title>
		<link>http://clyang.net/blog/2009/06/19/329</link>
		<comments>http://clyang.net/blog/2009/06/19/329#comments</comments>
		<pubDate>Fri, 19 Jun 2009 11:11:26 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[ps2pdf]]></category>
		<category><![CDATA[tiff2pdf]]></category>
		<category><![CDATA[tiff2ps]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=329</guid>
		<description><![CDATA[前幾天朋友傳了一大個壓縮檔給我，打開後發現是一本極度實用的工具書，但是讓人困擾的是每一個頁面都是掃描後的tiff檔案，所以造成閱讀上的極度不便，而且也非常浪費磁碟空間，突然想起之前曾經將單一個tiff檔案轉換成pdf的經驗，所以稍微摸索了一下，總算研究出來作法。 轉換指令極為簡單，唯一要確定的是你的系統中有安裝libtiff-tools以及Ghostscript，如果缺少請先"apt-get install ghostscript libtiff-tools"安裝一下吧，一旦安裝完畢，只需將你要轉換的tiff檔案都放置在同樣的資料夾下，然後只用下列指令即可一次搞定: tiff2ps *.tif &#124; ps2pdf14 -sPAPERSIZE=a4 &#8211; &#62; output.pdf 請注意&#8217;-'跟&#8217;&#62;&#8217;中間是有個空白的!!!有兩個部份要稍微說明一下，第一個是關於ps2pdf14的部份，這地方是指定轉換出來的pdf檔案的相容性: ps2pdf12 轉換出來的檔案相容於Acobat 3以後的版本 ps2pdf13 轉換出來的檔案相容於Acobat 4以後的版本 ps2pdf14 轉換出來的檔案相容於Acobat 5以後的版本 而"-sPAPERSIZE"則是指定輸出的紙張大小，這邊我使用的是A4，其他詳細可以指定的紙張大小請參考這個超仔細的頁面。 最後，關於效率的部份，我轉換每個約8.1MB大小的110個tiff檔，耗時約20分20秒(CPU為Xeon E5405)，產出的pdf檔案約25MB，成果讓我相當滿意!]]></description>
			<content:encoded><![CDATA[<p>前幾天朋友傳了一大個壓縮檔給我，打開後發現是一本極度實用的工具書，但是讓人困擾的是每一個頁面都是掃描後的tiff檔案，所以造成閱讀上的極度不便，而且也非常浪費磁碟空間，突然想起之前曾經將單一個tiff檔案轉換成pdf的經驗，所以稍微摸索了一下，總算研究出來作法。</p>
<p><span id="more-329"></span></p>
<p>轉換指令極為簡單，唯一要確定的是你的系統中有安裝<a title="libtiff-tools" href="http://www.libtiff.org/tools.html" target="_blank">libtiff-tools</a>以及<a title="Ghostscript" href="http://pages.cs.wisc.edu/~ghost/" target="_blank">Ghostscript</a>，如果缺少請先"<strong>apt-get install ghostscript libtiff-tools</strong>"安裝一下吧，一旦安裝完畢，只需將你要轉換的tiff檔案都放置在同樣的資料夾下，然後只用下列指令即可一次搞定:</p>
<blockquote><p>tiff2ps *.tif | ps2pdf14 -sPAPERSIZE=a4 &#8211; &gt; output.pdf</p></blockquote>
<p><strong>請注意&#8217;-'跟&#8217;&gt;&#8217;中間是有個空白的</strong>!!!有兩個部份要稍微說明一下，第一個是關於ps2pdf14的部份，這地方是指定轉換出來的pdf檔案的相容性:</p>
<ol>
<li>ps2pdf12 轉換出來的檔案相容於Acobat 3以後的版本</li>
<li>ps2pdf13 轉換出來的檔案相容於Acobat 4以後的版本</li>
<li>ps2pdf14 轉換出來的檔案相容於Acobat 5以後的版本</li>
</ol>
<p>而"<strong>-sPAPERSIZE</strong>"則是指定輸出的紙張大小，這邊我使用的是<strong>A4</strong>，其他詳細可以指定的紙張大小請參考這個<a title="detail paper size code" href="http://pages.cs.wisc.edu/~ghost/doc/cvs/Use.htm#Known_paper_sizes" target="_blank">超仔細的頁面</a>。</p>
<p>最後，關於效率的部份，我轉換每個約8.1MB大小的110個tiff檔，耗時約20分20秒(CPU為Xeon E5405)，產出的pdf檔案約25MB，成果讓我相當滿意!</p>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/06/19/329/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mencoder轉影片給IPod Touch觀賞之全攻略</title>
		<link>http://clyang.net/blog/2009/03/08/268</link>
		<comments>http://clyang.net/blog/2009/03/08/268#comments</comments>
		<pubDate>Sat, 07 Mar 2009 18:44:48 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[IPod Touch]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[mencoder]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=268</guid>
		<description><![CDATA[*** Note *** 本篇的作法轉出來的檔案也可以順利的在IPhone上面播放 IPod Touch除了聽歌功能強悍外，影音撥放的能力也是吸引我的重點，大小適中的螢幕適合在通勤或出門等朋友時拿出來看看影片打發時間，可惜IPod Touch承襲著Apple Inc.一貫的風格，只能撥放MPEG4以及x264的編碼，對於大多數的電影採取的xvid、DivX或是日劇常用的rmvb都不支援，必須經過轉換才可以正常撥放，Windows上面有一堆簡單方便且免費的軟體可以使用，但是我實在不想要浪費自己電腦的資源和電費來做這種浪費時間的事情，於是腦筋就動到某台身在遠方卻有8個核心可以使用的強大機器，用遠端的運算資源，電費也是別人家付，多划算阿!!! 畢竟在這經濟不景氣的年代，說要好好善用資源啊!!! XD 那台機器上面跑的是Linux，所以很自然的就想到mencoder這個好用的轉檔程式，支援市面上常見的各種格式。無奈我在該台機器上面沒有root的權限，所以花了很多工夫才弄好，於是在這邊跟大家分享一下，如果再沒有root權限的情況下，裝好mencoder，步驟非常繁複，但是一步一步跟著做應該可以成功編譯完成才是(God bless XD)。 cd /tmp ; mkdir convert ; cd convert ; mkdir x264 yasm faac 到這裡以及這裡抓取下列必要的檔案 (如果有更新的日期就抓最新的) source snapshot essential-20071007.tar.bz2 all-20071007.tar.bz2 windows-all-20071007.zip 解壓縮最新的source snapsot到/tmp/convert/mplayer_code 再把all-20071007.tar.bz2解壓縮到/tmp/convert/codecs 再將windows-all-20071007.zip解壓縮到/tmp/convert/win32 最後將all-20071007.tar.bz2分別解壓縮到/tmp/convert/codecs以及/tmp/convert/win32 (兩個目錄都要喔) 在這裡下載最新的x264原始碼並解壓縮到/tmp/convert/x264_code &#8230; <a href="http://clyang.net/blog/2009/03/08/268">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;"><strong>*** Note *** 本篇的作法轉出來的檔案也可以順利的在<a title="IPhone" href="http://www.apple.com/iphone" target="_blank">IPhone</a>上面播放</strong></span></p>
<p><a title="IPod Touch" href="http://www.apple.com/ipodtouch/">IPod Touch</a>除了聽歌功能強悍外，影音撥放的能力也是吸引我的重點，大小適中的螢幕適合在通勤或出門等朋友時拿出來看看影片打發時間，可惜<a title="IPod Touch" href="http://www.apple.com/ipodtouch/">IPod Touch</a>承襲著<a title="Apple Inc." href="http://www.apple.com">Apple Inc.</a>一貫的風格，只能撥放MPEG4以及x264的編碼，對於大多數的電影採取的xvid、DivX或是日劇常用的rmvb都不支援，必須經過轉換才可以正常撥放，Windows上面有一堆簡單方便且免費的軟體可以使用，但是我實在不想要浪費自己電腦的資源和電費來做這種浪費時間的事情，於是腦筋就動到某台身在遠方卻有8個核心可以使用的強大機器，用遠端的運算資源，電費也是別人家付，多划算阿!!! 畢竟在這經濟不景氣的年代，說要好好善用資源啊!!! XD</p>
<p><span id="more-268"></span>那台機器上面跑的是Linux，所以很自然的就想到<a title="mencoder" href="http://www.mplayerhq.hu/design7/news.html" target="_blank">mencoder</a>這個好用的轉檔程式，支援市面上常見的各種格式。無奈我在該台機器上面沒有root的權限，所以花了很多工夫才弄好，於是在這邊跟大家分享一下，如果再沒有root權限的情況下，裝好<a title="mencoder" href="http://www.mplayerhq.hu/design7/news.html" target="_blank">mencoder</a>，步驟非常繁複，但是一步一步跟著做應該可以成功編譯完成才是(God bless XD)。</p>
<ol>
<li>cd /tmp ; mkdir convert ; cd convert ; mkdir x264 yasm faac</li>
<li>到<a title="mencoder src" href="http://www.mplayerhq.hu/design7/dload.html" target="_blank">這裡</a>以及<a title="mencoder codec" href="http://www.mplayerhq.hu/MPlayer/releases/codecs/" target="_blank">這裡</a>抓取下列必要的檔案 (如果有更新的日期就抓最新的)<br />
source snapshot<br />
essential-20071007.tar.bz2<br />
all-20071007.tar.bz2<br />
windows-all-20071007.zip</li>
<li>解壓縮最新的source snapsot到/tmp/convert/mplayer_code<br />
再把all-20071007.tar.bz2解壓縮到/tmp/convert/codecs<br />
再將windows-all-20071007.zip解壓縮到/tmp/convert/win32<br />
最後將all-20071007.tar.bz2分別解壓縮到/tmp/convert/codecs以及/tmp/convert/win32<br />
(<strong>兩個目錄都要喔</strong>)</li>
<li>在<a title="x264 latest source code" href="ftp://ftp.videolan.org/pub/videolan/x264/snapshots/" target="_blank">這裡</a>下載最新的x264原始碼並解壓縮到/tmp/convert/x264_code</li>
<li>取得<a title="libfaac" href="http://www.audiocoding.com/downloads.html" target="_blank">libfaac最新的原始碼</a>，目前是1.28，解壓縮放到/tmp/convert/faac_code</li>
<li>取得<a title="yasm" href="http://www.tortall.net/projects/yasm/wiki/Download" target="_blank">yasm最新的原始碼</a>，目前是0.7.2，解壓縮放到/tmp/convert/yasm_code</li>
<li>安裝<a title="yasm" href="http://www.tortall.net/projects/yasm/" target="_blank">yasm</a><br />
cd /tmp/convert/yasm_code<br />
./configure &#8211;prefix=/tmp/convert/yasm<br />
make &amp;&amp; make install</li>
<li>安裝<a title="x264 codec" href="http://www.videolan.org/developers/x264.html" target="_blank">x264 codec</a><br />
cd /tmp/convert/x264_code<br />
./configure &#8211;prefix=/tmp/convert/x264<br />
make &amp;&amp; make install</li>
<li>安裝<a title="libfaac" href="http://www.audiocoding.com/faac.html" target="_blank">libfaac</a><br />
cd /tmp/convert/faac_code<br />
./configure &#8211;prefix=/tmp/convert/faac<br />
make &amp;&amp; make install</li>
<li>終於進到重點了，開始正式安裝<a title="mencoder" href="http://www.mplayerhq.hu/design7/news.html" target="_blank">mencoder</a>，由於我們不需要mplayer播放器，所以就不用編譯了，省下一些等待時間。<br />
cd /tmp/convert/mplayer_code<br />
./configure &#8211;prefix=/tmp/convert &#8211;disable-mplayer &#8211;codecsdir=/tmp/convert/codecs &#8211;win32codecsdir=/tmp/convert/win32 &#8211;language=zh_TW &#8211;with-extraincdir=/tmp/convert/faac/include:/tmp/convert/x264/include &#8211;with-extralibdir=/tmp/convert/faac/lib:/tmp/convert/x264/lib<br />
make &amp;&amp; make install</li>
<li>如果一切順利，編譯好的<a title="mencoder" href="http://www.mplayerhq.hu/design7/news.html" target="_blank">mencoder</a>就會放置在/tmp/convert/bin的目錄下供您使用啦。</li>
<li>最後使用前，記得先額外指定LD Library Path到<a title="libfaac" href="http://www.audiocoding.com/faac.html" target="_blank">libfaac</a>的目錄:<br />
export LD_LIBRARY_PATH=/tmp/convert/faac/lib</li>
</ol>
<p>假設上面這複雜且費時的12大步驟都順完成了，就可以開始來轉換檔案給<a title="IPod Touch" href="http://www.apple.com/ipodtouch/">IPod Touch</a>用啦!轉檔前先研究了一下<a title="IPod Touch" href="http://www.apple.com/ipodtouch/">IPod Touch</a>對於影像最多可以支援道甚麼程度</p>
<blockquote><p>H.264 video, up to 2.5 Mbps, 640 by 480 pixels, 30 frames per second, Baseline Profile up to Level 3.0 with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats</p></blockquote>
<p>瞭解了之後，才能針對規格去下轉換的參數，關於參數的部分我參考網路上一堆文章後，自己試用後，綜合起來推薦下列的指令 (<strong>別懷疑，那一堆是一整行的指令</strong>):</p>
<p style="padding-left: 30px;">/tmp/convert/bin/mencoder 輸入檔案名稱 -o 輸出檔名.mp4 -vf scale=480:-10,harddup \<br />
-lavfopts format=mp4 -faacopts mpeg=4:object=2:raw:br=128 -oac faac -ovc x264 \<br />
-sws 9 -x264encopts nocabac:level_idc=30:bframes=0:global_header:threads=auto:\<br />
subq=5:frameref=6:partitions=all:trellis=1:chroma_me:me=umh:bitrate=500 -of lavf</p>
<p>下了上面那長串的指令，轉出來的檔案便可以直接餵進去<a title="IPod Touch" href="http://www.apple.com/ipodtouch/">IPod Touch</a>來撥放啦。相信應該有人還是會好奇上面的指令用了一堆參數，到底都代表著甚麼意義呢?我挑幾個重要的出來說明一下，如果需要微調的話也有個依據:</p>
<ul>
<li>-sws 9 &#8212; 影像resampling使用Lanczos Algorithm來強化影像</li>
<li>-vf scale=480:-10 &#8212; 將轉出來的影像寬度設為480，高度自動調整，但是維持在16的倍數，為什麼是16的倍數呢?因為多數的codec在長寬都是16的倍數時壓縮效率最好。</li>
<li>-vf harddup &#8212; 為了維持frame rate，必要時插入重複的frame</li>
<li>-x264encopts nocabac:level_idc=30 &#8212; 因為IPod Touch只支援Baseline Profile Level 3.0</li>
<li>-x264encopts bframes=0 &#8212; 因為Baseline Profile不允許B-Frames</li>
<li>-x264encopts global_header &#8212; 使用單一的全域header，可以節省壓縮後的空間</li>
<li>-x264encopts threads=auto &#8212; <strong><span style="text-decoration: underline;">使用multithreading加快轉換速度</span>，</strong>但是<a title="x264 codes threads sideeffect" href="http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-x264.html" target="_blank">會損失一點點點點點的品質</a></li>
<li>-x264encopts subq=5:frameref=6 &#8212; quarterpixel精度作動作預測設定到最高，並且最多使用6個refernce frames</li>
<li>-x264encopts partitions=all &#8212; 使用全部的microblock size</li>
<li>-x264encopts trellis &#8212; 降低編碼的速度及品質，但是可以減少產生出來的檔案大小</li>
<li>-x264encopts me=umh &#8212; fullpixel的運動補償使用umh演算法</li>
</ul>
<p>我自己測試壓縮了rmvb、wmv及avi (xvid codec)的<span style="text-decoration: line-through;">謎</span>影片，在8 core (dual Xeon E5405 2GHz)的機器上的表現為</p>
<ul>
<li>avi 檔案處理效率約為 128 fps</li>
<li>rmvb 檔案處理效率約為 110 fps</li>
<li><strong>wmv 檔案處理效率約為11 fps</strong></li>
</ul>
<p>說真的，我也不知道為什麼轉換WMV的效率如此之爛，改天我再拿其他的檔案測測看吧。Anyway，這篇從安裝到轉檔到各項參數均完整說明，希望對有這樣需求的朋友們有所幫助啦。</p>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/03/08/268/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>好用的curlftpfs</title>
		<link>http://clyang.net/blog/2009/03/02/262</link>
		<comments>http://clyang.net/blog/2009/03/02/262#comments</comments>
		<pubDate>Sun, 01 Mar 2009 16:07:43 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[curlftpfs]]></category>
		<category><![CDATA[debian]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=262</guid>
		<description><![CDATA[常常在開發網頁程式時，我們會在自己習慣的平台上面寫完及測試後後，再丟上去真正運轉的機器運行，最常見的方法便是用ftp client上傳，但如果更新較為頻繁，這個動作做多了還是會不太耐煩，總希望可以直接mount遠方的ftp目錄當作是自己的一個目錄來使用，如此一來，只需要使用常用的cp、rm這類的指令便可以達到操作遠端ftp目錄下的檔案的功能。 幸運的是，在Debian下面有個方便的套件叫做curlftpfs，這軟體使用的底層便是大名鼎鼎的FUSE，搭配著cURL Library組合而成，讓我們可以很方便的在Debian下直接mount遠方的ftp資料夾。 安裝及使用方法如下: apt-get install curlftpfs (安裝curlftpfs) curlftpfs -o iocharset=big5,codepage=utf8,ipv4,user=帳號:密碼 ftp://xxx.xxx.xxx.xxx 本地目錄 iocharset指的是本機端所使用的編碼 codepage指的是ftp那端所使用的編碼 密碼不可以包含空白 如果你不希望你的密碼暴露出來，可以僅使用user=帳號，如此一來程式會要求你輸入密碼後再繼續執行。最後，假若你希望能在每次開機後，自動mount遠端某個ftp目錄，請編輯/etc/fstab加上一行 curlftpfs#xxx.xxx.xxx.xxx /mount的目錄 fuse rw,iocharset=big5,codepage=utf8,ipv4,user=帳號:密碼,user,noauto 0 0 記得更改一下/etc/fstab的權限，否則就全部的人都可以看到你的帳號密碼了。]]></description>
			<content:encoded><![CDATA[<p>常常在開發網頁程式時，我們會在自己習慣的平台上面寫完及測試後後，再丟上去真正運轉的機器運行，最常見的方法便是用ftp client上傳，但如果更新較為頻繁，這個動作做多了還是會不太耐煩，總希望可以直接mount遠方的ftp目錄當作是自己的一個目錄來使用，如此一來，只需要使用常用的cp、rm這類的指令便可以達到操作遠端ftp目錄下的檔案的功能。</p>
<p>幸運的是，在<a title="Debian" href="http://www.debian.org/" target="_blank">Debian</a>下面有個方便的套件叫做<a title="curlftpfs" href="http://curlftpfs.sourceforge.net/" target="_blank">curlftpfs</a>，這軟體使用的底層便是大名鼎鼎的<a title="FUSE" href="http://fuse.sourceforge.net/" target="_blank">FUSE</a>，搭配著<a title="cURL" href="http://curl.haxx.se/" target="_blank">cURL Library</a>組合而成，讓我們可以很方便的在<a title="Debian" href="http://www.debian.org/" target="_blank">Debian</a>下直接mount遠方的ftp資料夾。</p>
<p>安裝及使用方法如下:</p>
<ol>
<li>apt-get install curlftpfs (安裝curlftpfs)</li>
<li>curlftpfs -o iocharset=big5,codepage=utf8,ipv4,user=帳號:密碼 ftp://xxx.xxx.xxx.xxx 本地目錄<br />
iocharset指的是本機端所使用的編碼<br />
codepage指的是ftp那端所使用的編碼<br />
密碼不可以包含空白</li>
</ol>
<p>如果你不希望你的密碼暴露出來，可以僅使用<strong>user=帳號</strong>，如此一來程式會要求你輸入密碼後再繼續執行。最後，假若你希望能在每次開機後，自動mount遠端某個ftp目錄，請編輯/etc/fstab加上一行</p>
<blockquote><p>curlftpfs#xxx.xxx.xxx.xxx /mount的目錄 fuse rw,iocharset=big5,codepage=utf8,ipv4,user=帳號:密碼,user,noauto 0 0</p></blockquote>
<p>記得更改一下/etc/fstab的權限，否則就全部的人都可以看到你的帳號密碼了。</p>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/03/02/262/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>aria2c &#8211; Linux下的多線程下載軟體</title>
		<link>http://clyang.net/blog/2009/02/20/218</link>
		<comments>http://clyang.net/blog/2009/02/20/218#comments</comments>
		<pubDate>Fri, 20 Feb 2009 15:07:29 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[aria2c]]></category>
		<category><![CDATA[debian]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=218</guid>
		<description><![CDATA[很多朋友轉換到Linux下的時候，再下載大型檔案時，往往會遭遇到網路速度緩慢，想要使用在Windows上面像是flashget這類的多線程軟體，來加速下載。這裡推薦一個好用的小軟體 &#8211; aria2c，不但能夠多線程下載檔案，也能夠拿來下載bittorrent的檔案(有支援DHT)，不過下載bittorrent還是建議使用rtorrent比較威猛剛強一點，這邊介紹在Debian下面如何安裝使用aria2c。 在Debian下面安裝aria2c非常簡單: apt-get install aria2c 多線程下載使用方法如下: aira2c -s16 http://file.to.download/file.zip -s 後面接的數字是線程數目，限制是1~16，應該可以滿足大多數人的需求，如果需要更高的數目，可以透過 -j 來增加。 如果你需要使用aria2c來下載bittorrent檔案，使用方法如下: aria2c  &#8211;enable-dht  &#8211;listen-port=某個port &#8211;max-upload-limit=單一檔案上傳速度 &#8211;max-overall-upload-limit=全局上傳速度 &#8211;torrent-file=torrent檔案 上面簡單介紹了最常使用到的兩種功能，其他的細部設定請自行參酌aria2c的man page。]]></description>
			<content:encoded><![CDATA[<p>很多朋友轉換到Linux下的時候，再下載大型檔案時，往往會遭遇到網路速度緩慢，想要使用在Windows上面像是<a title="flashget" href="http://www.flashget.com" target="_blank">flashget</a>這類的多線程軟體，來加速下載。這裡推薦一個好用的小軟體 &#8211; <a title="aria2c" href="http://aria2.sourceforge.net/" target="_blank">aria2c</a>，不但能夠多線程下載檔案，也能夠拿來下載<a title="Bittorrent" href="http://www.bittorrent.com" target="_blank">bittorrent</a>的檔案(有支援<a title="DHT" href="http://zh.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E5%BC%8F%E9%9B%9C%E6%B9%8A%E8%A1%A8" target="_blank">DHT</a>)，不過下載<a title="Bittorrent" href="http://www.bittorrent.com" target="_blank">bittorrent</a>還是建議使用<a title="rtorrent" href="http://libtorrent.rakshasa.no/browser" target="_blank">rtorrent</a>比較威猛剛強一點，這邊介紹在<a title="Debian" href="http://www.debian.org" target="_blank">Debian</a>下面如何安裝使用<a title="aria2c" href="http://aria2.sourceforge.net/" target="_blank">aria2c</a>。</p>
<p>在Debian下面安裝aria2c非常簡單:</p>
<blockquote><p>apt-get install aria2c</p></blockquote>
<p>多線程下載使用方法如下:</p>
<blockquote><p>aira2c <strong>-s16</strong> http://file.to.download/file.zip</p>
<p><strong>-s</strong> 後面接的數字是線程數目，限制是1~16，應該可以滿足大多數人的需求，如果需要更高的數目，可以透過 <strong>-j</strong> 來增加。</p></blockquote>
<p>如果你需要使用aria2c來下載<a title="Bittorrent" href="http://www.bittorrent.com" target="_blank">bittorrent</a>檔案，使用方法如下:</p>
<blockquote><p>aria2c  <strong>&#8211;enable-dht  &#8211;listen-port=</strong>某個port <strong>&#8211;max-upload-limit</strong>=單一檔案上傳速度 <strong>&#8211;max-overall-upload-limit</strong>=全局上傳速度 <strong>&#8211;torrent-file</strong>=torrent檔案</p></blockquote>
<p>上面簡單介紹了最常使用到的兩種功能，其他的細部設定請自行參酌aria2c的man page。</p>
<blockquote></blockquote>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/02/20/218/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ip_conntrack: table full, dropping packet</title>
		<link>http://clyang.net/blog/2009/02/18/212</link>
		<comments>http://clyang.net/blog/2009/02/18/212#comments</comments>
		<pubDate>Wed, 18 Feb 2009 12:02:55 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[ip_conntrack]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=212</guid>
		<description><![CDATA[之前架設一台vpn時, 由dmesg看到一個警告訊息 "ip_conntrack: table full, dropping packet" google了一下發現似乎是個還蠻常見的問題，通常是NAT user過多或是同時建立太多tcp connection，導致table爆炸，因為Linux Kernel在NAT預設的tcp timeout是五天，難怪user多就爆炸。所以改法很簡單，就是把table加大，timeout縮短即可，要注意的是table所使用的memory為 ip_conntrack_max * 232 Bytes 所以要小心大小，不要改的太爽，加到超過你記憶體能夠負擔的能力，步驟如下: 首先查看一下table size以及timeout預設是多少: cat /proc/sys/net/ipv4/ip_conntrack_max cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 上面兩行指令能告訴你，目前機器上的table大小及tcp timeout時間 改法有二, 選一個你喜歡的作法即可 :Q 方法一: sysctl -w net.ipv4.ip_conntrack_max=131072 (or 任何妳喜歡且不會爆的值) sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=600 (把這兩行寫到你的開機啟動檔裡面) 方法二: 編輯/etc/sysctl.conf, &#8230; <a href="http://clyang.net/blog/2009/02/18/212">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>之前架設一台vpn時, 由dmesg看到一個警告訊息</p>
<blockquote><p>"<strong>ip_conntrack: table full, dropping packet</strong>"</p></blockquote>
<p><a title="Google" href="http://www.google.com/" target="_blank">google</a>了一下發現似乎是個還蠻常見的問題，通常是NAT user過多或是同時建立太多tcp connection，導致table爆炸，因為Linux Kernel在NAT預設的tcp timeout是五天，難怪user多就爆炸。所以改法很簡單，就是把table加大，timeout縮短即可，要注意的是table所使用的memory為</p>
<blockquote><p><strong>ip_conntrack_max * 232 Bytes</strong></p></blockquote>
<p>所以要小心大小，不要改的太爽，加到超過你記憶體能夠負擔的能力，步驟如下:</p>
<p>首先查看一下table size以及timeout預設是多少:</p>
<p style="padding-left: 30px;">cat /proc/sys/net/ipv4/ip_conntrack_max</p>
<p style="padding-left: 30px;">cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established</p>
<p style="padding-left: 30px;">上面兩行指令能告訴你，目前機器上的table大小及tcp timeout時間</p>
<p>改法有二, 選一個你喜歡的作法即可 :Q</p>
<p><strong>方法一:</strong></p>
<p style="padding-left: 30px;">sysctl -w net.ipv4.ip_conntrack_max=131072 (or 任何妳喜歡且不會爆的值)</p>
<p style="padding-left: 30px;">sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=600</p>
<p style="padding-left: 30px;">(把這兩行寫到你的開機啟動檔裡面)</p>
<p><strong>方法二:</strong></p>
<p style="padding-left: 30px;">編輯/etc/sysctl.conf, 加上下列兩行</p>
<p style="padding-left: 30px;">net.ipv4.ip_conntrack_max=131072 (or 任何妳喜歡且不會爆的值)</p>
<p style="padding-left: 30px;">net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=600</p>
<p style="padding-left: 30px;">這樣每次開機就會設定上去啦.</p>
<p>問題便可以因此解決。</p>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/02/18/212/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高效率的iptables GEOIP模組</title>
		<link>http://clyang.net/blog/2009/02/13/182</link>
		<comments>http://clyang.net/blog/2009/02/13/182#comments</comments>
		<pubDate>Thu, 12 Feb 2009 17:35:11 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[geoip]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[policy routing]]></category>
		<category><![CDATA[vpn]]></category>
		<category><![CDATA[xtables-addons]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=182</guid>
		<description><![CDATA[手邊有台vpn server上面用iptables跑policy routing,連往大陸地區就從特定interface出去，之前的做法是到apnic取得大陸地區最新的ip list後，再利用script一行一行餵進去iptables裡面，即使做過CIDR merge後，還是快要達到800筆record，每每上線使用者一多、或是流量變大時機器的loading就會增加，這種作法不用分析也大概猜得出來，iptables內部作rule match是採用list match，當rule量很大的時候，效能當然會變差。 當初在做的時候，有考慮過採用iptables的geoip模組，後來沒有採用的原因有二: 需要打patch-o-matic這個patch，要重編kernel太麻煩。 檢查過該模組對於ip rule的比對作法依然是採用list search。 既然效率沒有比較好，安裝又麻煩，當然就不列入考慮。 後來當兵前，發現有人丟出一個方便的玩意叫做:xtables-addons，只要你的kernel版本是在2.6.17以上、iptables版本在1.4.1以上就可以免patch kernel直接上geoip這個模組。xtables-addons不只提供geoip這模組還提供下列模組，都是可以免patch kernel直接使用的: CHAOS DELUDE DHCPADDR ECHO IPMARK LOGMARK SYSRQ TARPIT TEE condition fuzzy geoip ipp2p ipset length2 portscan quota2 連擋p2p好用的模組ipp2p也可以免patch直接使用，實在相當方便，這也直接解決了上面提到的第一個麻煩，但是當時得知時去翻了一下他的source code，依然是採用list search，所以既然效率沒有增加，也就沒有安裝的動力，不過這個方便的玩意到是列入我的watch list，直到2008年五月的時候丟出了1.5.3版本，從release notes中看到: improved geoip &#8230; <a href="http://clyang.net/blog/2009/02/13/182">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>手邊有台vpn server上面用<a title="iptables" href="http://www.netfilter.org/projects/iptables/index.html" target="_blank">iptables</a>跑policy routing,連往大陸地區就從特定interface出去，之前的做法是到<a title="apnic" href="http://www.apnic.net/" target="_blank">apnic</a>取得大陸地區最新的ip list後，再利用script一行一行餵進去<a title="iptables" href="http://www.netfilter.org/projects/iptables/index.html" target="_blank">iptables</a>裡面，即使做過CIDR merge後，還是快要達到800筆record，每每上線使用者一多、或是流量變大時機器的loading就會增加，這種作法不用分析也大概猜得出來，<a title="iptables" href="http://www.netfilter.org/projects/iptables/index.html" target="_blank">iptables</a>內部作rule match是採用list match，當rule量很大的時候，效能當然會變差。<span id="more-182"></span></p>
<p>當初在做的時候，有考慮過採用<a title="iptables geoip module" href="http://people.netfilter.org/~peejix/geoip/howto/geoip-HOWTO.html" target="_blank">iptables的geoip模組</a>，後來沒有採用的原因有二:</p>
<ol>
<li>需要打patch-o-matic這個patch，要重編kernel太麻煩。</li>
<li>檢查過該模組對於ip rule的比對作法依然是採用list search。</li>
</ol>
<p>既然效率沒有比較好，安裝又麻煩，當然就不列入考慮。</p>
<p>後來當兵前，發現有人丟出一個方便的玩意叫做:<a title="xtables-addons" href="http://jengelh.medozas.de/projects/xtables/" target="_blank">xtables-addons</a>，只要你的kernel版本是在2.6.17以上、<a title="iptables" href="http://www.netfilter.org/projects/iptables/index.html" target="_blank">iptables</a>版本在1.4.1以上就可以免patch kernel直接上geoip這個模組。<a title="xtables-addons" href="http://jengelh.medozas.de/projects/xtables/" target="_blank">xtables-addons</a>不只提供geoip這模組還提供下列模組，都是可以免patch kernel直接使用的:</p>
<ul>
<li>CHAOS</li>
<li>DELUDE</li>
<li>DHCPADDR</li>
<li>ECHO</li>
<li>IPMARK</li>
<li>LOGMARK</li>
<li>SYSRQ</li>
<li>TARPIT</li>
<li>TEE</li>
<li>condition</li>
<li>fuzzy</li>
<li><strong>geoip</strong></li>
<li><strong>ipp2p</strong></li>
<li>ipset</li>
<li>length2</li>
<li>portscan</li>
<li>quota2</li>
</ul>
<p>連擋p2p好用的模組ipp2p也可以免patch直接使用，實在相當方便，這也直接解決了上面提到的第一個麻煩，但是當時得知時去翻了一下他的source code，依然是採用list search，所以既然效率沒有增加，也就沒有安裝的動力，不過這個方便的玩意到是列入我的watch list，直到2008年五月的時候丟出了1.5.3版本，從release notes中看到:</p>
<blockquote><p>improved geoip match: O(log(n)) list search time [previously O(n)]</p></blockquote>
<p>馬上去翻了他的code，這個版本採用binary search來改進效率，從O(n)進步到O(log(n))，拿這台機器為例，n=800且每個封包就得做一次match，這樣的進步實在可觀阿，無奈那時候在當兵，放假時間寶貴，所以就先擱置了。</p>
<p>直到前幾天，突然想起來有這玩意，就把這玩意裝上去了，效果非常顯著，推薦給有使用geoip的朋友可以改用這個模組。</p>
<p>安裝方式:</p>
<ol>
<li>到<a title="xtables-addons download" href="http://dev.medozas.de/files/xtables/" target="_blank">這裡下載</a>最新的<a title="xtables-addons" href="http://jengelh.medozas.de/projects/xtables/" target="_blank">xtables-addons</a>。(目前最新版本為1.9)</li>
<li>解開後<br />
cd xtables-addons<br />
./autogen.sh<br />
./confiure ; make ; make install</li>
<li>搞定收工，夠簡單吧。</li>
</ol>
<p>如果你是要使用geoip模組，由於作者修改了資料儲存的結構，如果你採用舊的csv2bin產生的檔案會無法使用，你必須下列步驟:</p>
<ol>
<li>下載作者<a title="geoip db" href="http://jengelh.medozas.de/files/geoip/" target="_blank">轉換好的檔案</a>(每個月會更新一次)，放在<strong>/var/geoip/LE</strong>下面即可使用。</li>
</ol>
<p>如果想要自己轉換，下載回來的檔案解開後有一隻geoip_csv_iv0.pl程式，你可以自行下載maxmind的geoip csv檔案回來轉。(轉出來是一樣的東西)。</p>
<p>安裝好後，使用方法如下:</p>
<blockquote><p>iptables -t mangle -A PREROUTING -s 192.168.0.0/24 -m geoip &#8211;dst-cc CN -j MARK &#8211;set-mark 0&#215;1</p></blockquote>
<p>擺脫之前那醜陋的800筆紀錄，又能降低loading，實在傷當開心阿。</p>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/02/13/182/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>使用MRTG觀察VPN(pptpd)上線人數</title>
		<link>http://clyang.net/blog/2009/02/01/111</link>
		<comments>http://clyang.net/blog/2009/02/01/111#comments</comments>
		<pubDate>Sun, 01 Feb 2009 13:02:01 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[mrtg]]></category>
		<category><![CDATA[poptop]]></category>
		<category><![CDATA[pptpd]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=111</guid>
		<description><![CDATA[我的VPN伺服器是使用Poptop套件架設在Debian上，一旦有新的服務在手上，自然會好奇到底有多少人在使用，馬上浮現在腦海中的便是利用MRTG來做，實作起來也相當簡單，只需要編輯一個專屬的MRTG config檔以及自行撰寫一個shell script即可完成。 在開始前先來個真相一下: 首先編輯MRTG config檔案: /etc/mrtg.person.cfg #option WorkDir: /var/www/mrtg Options[_]:growright Target[vpn]: `/path/to/your/script/mrtg_person.sh` MaxBytes[vpn]: 64 Options[vpn]: gauge, nopercent, growright YLegend[vpn]: Online Users ShortLegend[vpn]: % LegendI[vpn]:   Online User: LegendO[vpn]:   Online User: Title[vpn]: clyang.net VPN Online User PageTop[vpn]: &#60;h1&#62;clyang.net VPN &#8230; <a href="http://clyang.net/blog/2009/02/01/111">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>我的VPN伺服器是使用Poptop套件架設在Debian上，一旦有新的服務在手上，自然會好奇到底有多少人在使用，馬上浮現在腦海中的便是利用MRTG來做，實作起來也相當簡單，只需要編輯一個專屬的MRTG config檔以及自行撰寫一個shell script即可完成。<span id="more-111"></span></p>
<p>在開始前先來個真相一下:</p>
<div id="attachment_119" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-119" title="Monthly VPN online user by MRTG" src="http://clyang.net/blog/wp-content/uploads/2009/02/vpn-month.png" alt="Monthly VPN online user by MRTG" width="500" height="135" /><p class="wp-caption-text">Monthly VPN online user by MRTG</p></div>
<p>首先編輯MRTG config檔案: /etc/mrtg.person.cfg</p>
<pre class="brush: html">
#option
WorkDir: /var/www/mrtg
Options[_]:growright

Target[vpn]: `/path/to/your/script/mrtg_person.sh`
MaxBytes[vpn]: 64
Options[vpn]: gauge, nopercent, growright
YLegend[vpn]: Online Users
ShortLegend[vpn]: %
LegendI[vpn]:   Online User:
LegendO[vpn]:   Online User:
Title[vpn]: clyang.net VPN Online User
PageTop[vpn]:
&lt;h1&gt;clyang.net VPN Online User&lt;/h1&gt;
&lt;table border=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;System:&lt;/td&gt;
&lt;td&gt;clyang.net VPN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintainer:&lt;/td&gt;
&lt;td&gt;your@email.net.tw&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</pre>
<p>接著編輯mrtg_person.sh，編輯完成後請記得chmod 755 mrtg_person.sh</p>
<pre class="brush: bash">
#!/bin/sh
echo `netstat -a | grep gre|awk &#039;{print $5}&#039;|sort | wc -l|awk &#039;{print$1}&#039;`
echo `netstat -a | grep gre|awk &#039;{print $5}&#039;|sort | wc -l|awk &#039;{print$1}&#039;`
UPtime=`/usr/bin/uptime | awk &#039;{print $3 &quot; &quot; $4 &quot; &quot; $5}&#039;`
echo $UPtime
echo clyang.net
</pre>
<p>最後編輯crontab檔案，加上一行:</p>
<blockquote><p>*/5 *   * * *   root    mrtg /etc/mrtg.person.cfg</p></blockquote>
<p>就大功告成了。</p>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/02/01/111/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian Multi-WAN QoS Howto</title>
		<link>http://clyang.net/blog/2009/01/12/54</link>
		<comments>http://clyang.net/blog/2009/01/12/54#comments</comments>
		<pubDate>Sun, 11 Jan 2009 17:05:38 +0000</pubDate>
		<dc:creator>clyang</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[cbq]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[htb]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Multi Wan]]></category>
		<category><![CDATA[poptop]]></category>
		<category><![CDATA[pptp]]></category>
		<category><![CDATA[QoS]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://clyang.net/blog/?p=54</guid>
		<description><![CDATA[[注意] 引用本文請完整引用並須於引用文章中列上本文章的完整連結 [前言] 某個的vpn設置的時候是希望滿足兩個條件: 1) 隨時可以使用內部ip存取經過ip認證的服務。(如: IEL) 2) 利用固定制ADSL的路由優勢存取原本需要繞遠路的網域 (如:連往對岸)，增快存取速度。 [架構] vpn server的OS為Debian Etch，使用iptables根據目的地的ip來決定封包要透過哪一個interface出去，上圖為VPN的架構，eth0負責handle vpn的連線要求以及做NAT Gateway，而eth1則連接固定制的ADSL負責連往學術網路連線不佳的國家，試用了一陣子，跑起來一切美好，大家也很滿意。無奈人性是邪惡的，使用者一旦發現通往特定地區只要使用vpn就會變快時，就會不理會節約ADSL頻寬使用的柔性宣導，狂抽猛的使用善加利用導致當初的美意徹底被摧毀，同時也降低使用者使用的意願。(本來學網夠慢了，結果用了VPN速度反而越來越慢誰會想用 zZzZZzzz) 因應的方法便是限制user在使用ADSL這段的速度，讓大家都可以使用到合理的速度。 [QoS Howto] 之前使用cbq.init來當做solution，why cbq。init? 因為它的設定最簡單，完全就是懶人的最愛，可惜它的queueing方式不太優良，導致沒有辦法做更精準的限制，所以研究了一下改用HTB來做。HTB跟CBQ差在哪呢? 請自行參考HTB官方網頁的說法。 (http://luxik.cdi.cz/~devik/qos/htb/old/htbmeas1.htm) QoS怎麼套入這個架構呢? 由於poptop這個vpn server會為每個連線建立一個ppp的interface，而系統會在每個ppp interface啟動時自行呼叫/etc/ppp/ip-up，所以我在這個script最下方加上QoS的設定，之後每個連線都會自動被套用上這個設定。首先先針對下載的部分做限制，由於頻寬較為充裕，最多可以允許768kbps的速度，設定如下: # Download Speed QoS of ADSL! offer at least 720Kbps (Max &#8230; <a href="http://clyang.net/blog/2009/01/12/54">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>[注意]</h4>
<p>引用本文請完整引用並須於引用文章中列上本文章的完整連結</p>
<h4>[前言]</h4>
<p>某個的vpn設置的時候是希望滿足兩個條件: 1) 隨時可以使用內部ip存取經過ip認證的服務。(如: <a title="IEL" href="http://ieeexplore.ieee.org/" target="_blank">IEL</a>) 2) 利用固定制ADSL的路由優勢存取原本需要繞遠路的網域 (如:連往對岸)，增快存取速度。</p>
<h4>[架構]</h4>
<div id="attachment_62" class="wp-caption aligncenter" style="width: 440px"><img class="size-full wp-image-62" title="vpn structure" src="http://clyang.net/blog/wp-content/uploads/2009/01/vpn.png" alt="vpn structure" width="430" height="270" /><p class="wp-caption-text">vpn structure</p></div>
<p><span id="more-54"></span>vpn server的OS為Debian Etch，使用iptables根據目的地的ip來決定封包要透過哪一個interface出去，上圖為VPN的架構，eth0負責handle vpn的連線要求以及做NAT Gateway，而eth1則連接固定制的ADSL負責連往學術網路連線不佳的國家，試用了一陣子，跑起來一切美好，大家也很滿意。無奈人性是邪惡的，使用者一旦發現通往特定地區只要使用vpn就會變快時，就會不理會節約ADSL頻寬使用的柔性宣導，<span style="text-decoration: line-through;">狂抽猛的使用</span>善加利用導致當初的美意徹底被摧毀，同時也降低使用者使用的意願。(本來學網夠慢了，結果用了VPN速度反而越來越慢誰會想用 zZzZZzzz)</p>
<p>因應的方法便是限制user在使用ADSL這段的速度，讓大家都可以使用到合理的速度。</p>
<h4>[QoS Howto]</h4>
<p>之前使用cbq.init來當做solution，why cbq。init? 因為它的設定最簡單，完全就是懶人的最愛，可惜它的queueing方式不太優良，導致沒有辦法做更精準的限制，所以研究了一下改用HTB來做。HTB跟CBQ差在哪呢? 請自行參考HTB官方網頁的說法。 (<a title="HTB vs CBQ" href="http://luxik.cdi.cz/~devik/qos/htb/old/htbmeas1.htm" target="_blank">http://luxik.cdi.cz/~devik/qos/htb/old/htbmeas1.htm</a>)</p>
<p>QoS怎麼套入這個架構呢? 由於poptop這個vpn server會為每個連線建立一個ppp的interface，而系統會在每個ppp interface啟動時自行呼叫/etc/ppp/ip-up，所以我在這個script最下方加上QoS的設定，之後每個連線都會自動被套用上這個設定。首先先針對下載的部分做限制，由於頻寬較為充裕，最多可以允許768kbps的速度，設定如下:</p>
<pre class="brush: bash">
# Download Speed QoS of ADSL! offer at least 720Kbps (Max 768Kbps) for user
/sbin/tc qdisc add dev $1 root handle 2: htb
/sbin/tc class add dev $1 parent 2: classid 2:1 htb rate 720kbit ceil 768kbit
/sbin/tc filter add dev $1 protocol ip parent 2:0 prio 1 handle 6 fw flowid 2:1
</pre>
<p>這邊使用一個技巧，由於我們可以確定ADSL的inbound一定會從eth1進來，所以我們利用iptables可以將封包加上mark的功能，將eth1進來的封包都加上mark (標號為6) 所以就可以利用這個mark去做tc的filter依據。iptables加上mark指令如下:</p>
<blockquote><p>/sbin/iptables -A PREROUTING -t mangle -i eth1 -j MARK &#8211;set-mark 6</p></blockquote>
<p>下載限速的部分就大功告成啦。</p>
<p>接著則是上傳速度限制的部分，礙於ADSL的uplink頻寬普遍不大，為了避免濫用，每個user限制只能使用128kbps。首先在eth1上面掛載一個root qdisc:</p>
<blockquote><p>/sbin/tc qdisc del dev eth1 root<br />
/sbin/tc qdisc add dev eth1 root handle 2: htb r2q 8</p></blockquote>
<p>接著編輯/etc/ppp/ip-up:</p>
<pre class="brush: bash">
# 限制個別user對ADSL端的上傳速度
#取得撥進來的user目前是使用哪個ppp interface
interface=$1

#針對不同的使用者給予特定的標記
contamark=`echo $interface | cut -c 4-99`
mark=`expr $contamark + 500`

#由於vpn架設時,已經先把送往eth1的封包都標成1了
#所以下面這行指令的意思是(當中的$5則是使用者撥入後取得的ip):
#當封包的source ip是$5 且 已經被標記成 mark 0x1了
#就把該封包套用到使用者專屬的tc-class
/usr/local/sbin/iptables -t mangle -A POSTROUTING -s $5 -m mark --mark 0x1 -j CLASSIFY --set-class 2:$mark

#建立使用者專屬的tc-class
/sbin/tc class add dev eth1 parent 2: classid 2:$mark htb rate 128kbit ceil 128kbit
</pre>
<p>最後，編輯/etc/ppp/ip-down，當使用者斷線後刪除相關設定。</p>
<pre class="brush: bash">
# remove download tc disc
/sbin/tc qdisc del dev $1 root

# remove uplink limit
interface=$1
contamark=`echo $interface | cut -c 4-99`
mark=`expr $contamark + 500`

/usr/local/sbin/iptables -t mangle -D POSTROUTING -s $5 -m mark --mark 0x1 -j CLASSIFY --set-class 2:$mark
/sbin/tc class del dev eth1 parent 2: classid 2:$mark htb rate 128kbit ceil 128kbit
</pre>
<h4>[結論]</h4>
<p>對於ADSL端做出QoS限制後，反應良好、使用者人數回流、ADSL使用率增加(之前因為uplink被吃光導致download速度受阻)。最後當然是有圖有真相啦:</p>
<div id="attachment_67" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-67" title="vpn_traffic" src="http://clyang.net/blog/wp-content/uploads/2009/01/vpn_traffic.png" alt="vpn mrtg traffic" width="500" height="135" /><p class="wp-caption-text">vpn mrtg traffic</p></div>
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><!-- Do not remove -->]]></content:encoded>
			<wfw:commentRss>http://clyang.net/blog/2009/01/12/54/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

