分類:技術相關

使用 bind9 作為 GeoDNS 伺服器

在繼續前,你需要先了解GeoDNS為何物,以及bind之基本使用方式。

簡單來說,若要讓bind為不同地區的使用者返回不同的查詢結果,則需要判斷DNS請求從何而來。國家IP資料從MaxMind便能獲取到。倘若要將MaxMind的IP地址資料庫變為bind的acl,可以利用這裡的指令碼。但是為了簡化過程,我們直接下載預先做好的的acl檔案。

要如何做到呢?依舊是透過上面提供的連結。

只需要下面這一條指令就能夠下載到acl了。

curl http://phix.me/geodns/download/MaxMind/GeoIP.acl.gz | zcat > geodns.acl

下載完成了之後,進到bind的全局設定裡頭,將這個檔案include進去,然後還需要稍微做些修改。

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the 
// structure of BIND configuration files in Debian, *BEFORE* you customize 
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

// GeoDNS Configuration

// acl file sepified the IP zones of countries. 
include “/etc/bind/geodns.acl";

include "/etc/bind/named.conf.cn";
include "/etc/bind/named.conf.us";
include "/etc/bind/named.conf.any";

include “/etc/bind/named.conf.default-zones”;

在這裡,/etc/bind/named.conf.cn中指明瞭中國地區解析的地址,/etc/bind/named.conf.us則是美國,/etc/bind/named.conf.any則是任何。需要注意的是,要將any放在最後。否則any將會匹配任何查詢,換言之,在any之後的地區都不會被解析。

這裡將named.conf.cn的內容放出來作為範例:

view "china" {

	match-clients { CN; };
	recursion no;

	zone "magicnat.com" {
		type master;
		file "/etc/bind/zones-china/magicnat.com";
	};

	zone "magicnat.org" {
		type master;
		file "/etc/bind/zones-china/magicnat.org";
	};

	zone "nat.moe" {
		type master;
		file "/etc/bind/zones-china/nat.moe";
	};

	zone …
};

每一個view,就是每一個區域。這個區域要解析的國家在match-clients中定義。例如中國就是CN,美國則是US。也可以將兩個國家一併寫在match-clients中。若要匹配任何國家,則可以使用any。還有一點也是需要注意的:在使用view之後,就不能在view之外存在zones。在named.conf.default-zones中的區域就會出現問題。可以在配置檔案中將其include註釋,也可以將其加入一個view,就像這樣:

view "local" {

	match-clients { any; };
	recursion no;

	// prime the server with knowledge of the root servers
	zone "." {
		type hint;
		file "/etc/bind/db.root";
	};

	// be authoritative for the localhost forward and reverse zones, and for
	// broadcast zones as per RFC 1912

	zone "localhost" {
		type master;
		file "/etc/bind/db.local";
	};

	zone "127.in-addr.arpa" {
		type master;
		file "/etc/bind/db.127";
	};

	zone "0.in-addr.arpa" {
		type master;
		file "/etc/bind/db.0";
	};

	zone "255.in-addr.arpa" {
		type master;
		file "/etc/bind/db.255";
	};

};

最後一點:若是你像我這樣將default-zones的clients設為any的話,你得將載入default-zones的語句放在配置檔案的最末尾。原因和將any區域放在最後是一樣的。

ShadowManager 穩定版本釋出

歷時 4 個月(明明就是五天),shadowmanager的開發終於結束了。

ShadowManager 是一個用於同時維護多個不同加密的 shadowsocks 伺服器的輕量級,可擴展指令碼。

預設命令的使用方式如下:

add: 新增一個伺服器到 shadowmanager 的管理,需要 3 個參數。埠,密碼,和加密方法。
start: 啟動 shadowmanager,無需參數。
stop: 停止 shadowmanager,無需參數
restart: 重啟 shadowmanager,無需參數。
status: 檢視 shadowmanager 狀態,無需參數。
show: 顯示所有 shadowsocks 伺服器,無需參數。
remove: 移除指定 ID 的 shadowsocks 伺服器,使用 "show" 來檢視所有伺服器,需要 1 個參數,伺服器 ID。
enovr: 啟用一個或多個覆寫,可將覆寫名作為參數(可選)。
disovr: 禁用一個或多個覆寫,可將覆寫名作為參數(可選)。

Shadowmanager 的特性之一是其可擴展性,在 Shadowmanager 中,提供了覆寫(Overrides),包含(Includes)與鉤子(Hooks)。它們可以被用來修改那些未在 Shadowmanager 中給出選項的行為。包含在 Shdowmanager 載入後讀取,覆寫在 Shadowmanager 載入之前。在每個覆寫之前都有兩位字元,它們所代表的是載入的優先順序。優先順序從 00 排列至 zz,字元越往後,優先順序越高。

目前,Shadowmanager 提供這些覆寫:

  • 00-no-root:該覆寫通過替換 root 檢測函數來跳過 root 檢查,在需要臨時關閉 root 檢測時很有用。
  • 10-base64-encrypted-passwd:使用 base64 來儲存伺服器的密碼。這在你需要在密碼中使用特殊字元時有用。
  • 20-json-to-shadowmanager:該覆寫提供了一個 ‘json2manager’ 命令,可以用於將shadowsocks json 配置檔案轉換為 shadowmanager 的配置檔案。
  • 30-generate-qr-code:為 Shadowmanager 的伺服器生成二維碼。
  • 40-randpass:新增一個命令 ‘add-randpass’ 至 shadowmanager,這個命令允許使用者新增隨機密碼的 shadowsocks 伺服器。
  • 70-time-limit:以小時限制每個 shadowsocks 伺服器可以使用的時間。這個覆寫會使用 pre-add 事件鉤子,並新增一個 Cronjob 來檢查賬戶並移除過期伺服器。
  • 90-pre-server-daemon:為每個伺服器使用單獨的程序。在需要分開統計每個伺服器的流量時有用。
  • 90-screen-start:這個覆寫將替換 ‘start’ 命令原本的實現,使用該覆寫會讓 shadowsocks 伺服器在 screen 內啟動,而不是作為服務啟動。這在需要檢視伺服器日誌時有用。
  • 99-chinese-usage:這個覆寫提供了中文的幫助文字。
  • aa-wizard:為 shadowmanager 的伺服器新增、伺服器移除等操作提供一個嚮導。
  • zz-interactive-mode:這個覆寫會使得 shadowmanager 以互動式模式啟動。該方法可能會引起一些問題,故不推薦。

鉤子是在特定行為執行前後運行的函數。這些鉤子可以在 hooks/ 中定義。某些覆寫可能會按需修改鉤子來達成某些目的。在非原版的實現中也可以定義鉤子。(例如覆寫與包含,甚至鉤子本身!)

usage: hook <hooked_function>

Hook 命令會檢測函數是否存在,若存在則會將其執行。

若想要新增您自己的命令用法與解釋至 shadowmanager,您可以使用 ‘add-help’ 與 ‘add-usage’。這兩個命令都會從標準輸入讀取輸入。幫助文字的語言可以在這兩個命令的參數內定義。若留空,則會被作為預設語言顯示(當偏好語言不能被提供時使用)。

usage: echo '   <your-command>: <your-explaination>' | add-help [help-language]
usage: echo '   <your-command>: command-name <parameters>' | add-usage [help-language]

Shadowmanager 釋出於 MIT 協議。項目地址:https://github.com/MagicNAT/shadowmanager/

隨手摘記:重啟基於tcp的伺服器而不丟包的巧妙做法

最近伺服器上掛著的站多了起來,於是發現重啟httpd時候會丟掉不少的請求… 雖然不是一個很大的問題,但是不解決總是讓人心裡不舒服,故稍作研究,發現了一個利用iptabels DROP請求從而巧妙的解決客戶端被拒絕連線的問題。

想法來自:http://www.mail-archive.com/haproxy@formilux.org/msg06885.html

做法很簡單,就是這樣:

iptables -I INPUT -p tcp --dport the_port_of_server --syn -j DROP
... restart your service ...
iptables -D INPUT -p tcp --dport the_port_of_server --syn -j DROP

簡單來說,就是三個步驟。先DROP通往服務埠的連線,因為是DROP,故客戶端不會收到拒絕連線的資訊。於是客戶端會繼續傳送tcp請求,直到超時或收到響應。之後便是重啟服務,然後移除iptables規則,這時,客戶端便能收到伺服器的迴應了,並且在此期間,客戶端並沒有收到任何伺服器拒絕連線的訊息。

使用SSH隧道突破內網對映埠

目的 : 在外部網路的主機上 ( 219.136.123.122 ) ,連線到遠端區域網 ( 192.168.100.23 ) 內沒有埠對映主機 ( 下稱內服 )的 SSH 上 .

需求 : 一臺同時能被內服和外部網路的主機訪問,並且建立ssh隧道的外網伺服器 ( 下稱外服 ) .

外網主機 -> 外服 < - 萬惡的路由器 <- 內服 對於懶人們…直接提供一部到位的方案. 運行這些命令 :
內服執行 : ssh -N -f -R 遠端埠:127.0.0.1:22 外服使用者@外服地址
執行後將需求登陸,進行登陸。
若未提示錯誤,便可以通過登陸到外服,然後輸入 ssh localhost -p 遠端埠 .
例如在外服 ssh -N -f -R 2222:127.0.0.1:22 someone@whatever.com 後就在外部網路能通過 ssh whatever.com -p 2222 來訪問內網主機了.
就這樣 , 不多說 .

原理
參數解釋 :
-N : 將本地機的某個埠轉發到遠端指定機器的指定埠. 其原理很簡單,在本地機器上分配一個 socket 偵聽制定埠, 當此埠接受連線之後, 就會同過安全通道轉發出去, 同時遠端主機和 host 的 hostport 埠建立連線.
-f : 執行後臺驗證,即在一次登陸成功之後便後臺運行.
-R : 即將將遠端主機的某個埠轉發到本地端指定機器的指定埠,也就相當於在遠端主機使用了-N參數.
只有 -N -R 連用時,才能正常建立連線,否則將無法接收遠端主機資料或向遠端主機發送資料.

關於CDLinux之安裝

學校電腦上的Windows總崩…故此周研究CDL之安裝安裝方法略坑…

安裝*.iso自然想到的是UltraISO,可是,用UltraISO就錯了…就是因為這點困擾了我幾個小時.因為命名的關係,總之就是有些奇怪的原因,使得UltraISO,WinRAR一類的軟體解壓檔案是,會搞得大小寫亂七八糟,所以說我用7zip代替了…事實證明,這成功了.

再接下來就是用GRUBINST和GRLDR搞U盤了,在GRUBINST選上不儲存舊MBR,不在軟盤找GRLDR和關閉從舊的MBR找GRLDR之後安裝,再把GRLDR丟進根目錄,然後建立內容如下的menu.lst

color black/cyan yellow/cyan
timeout 30
default 0
title Load CDLinux
find –set-root /CDLINUX/bzImage
kernel /CDLINUX/bzImage CDL_DEV=LABEL=CDlinux CDL_LANG=zh_CN.UTF-8
initrd /CDLINUX/initrd
boot

title Reboot
reboot

然後,大功告成.

附件 : grldr grubinst