Ubuntu DDNS伺服器搭建
一直以來都是在印象筆記等記錄、總結,很早之前就想寫分享文章,但自己拖延太嚴重,明日復明日,已經9102年了,決定先從以前部分筆記搬家開始,先邁出第一步?。
本文主要介紹通過Apache+cgi實現ubuntu環境下搭建DDNS伺服器,主要包含3個部分:環境搭建、系統設計以及具體實現。
一、環境搭建
如下圖所示,伺服器環境主要分以下4步完成:
1.1 第一步:安裝apache
執行命令列
sudo apt-get install apache2複製程式碼
1.2 第二步:配置apache支援cgi程式
配置apache執行cgi程式可分為兩種情況:
- ScriptAlias目錄的CGI,用ScriptAlias指令使Apache允許執行特定目錄中的CGI程式。
- ScriptAlias以外目錄的CGI。則可以用Options顯式地允許CGI的執行
操作如下:
執行命令,開啟apache下default配置
sudo gedit /etc/apache2/sites-available/default修改前程式碼塊:ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<Directory "/usr/lib/cgi-bin">AllowOverride NoneOptions ExecCGI -MultiViews +SymLinksIfOwnerMatchOrder allow,denyAllow from all</Directory>要使/var/www/cgi-bin/這個目錄下可以執行CGI,則修改後為:
## 用 ScriptAlias 指令設定 ##
ScriptAlias /cgi-bin/ /var/www/cgi-bin/## 用 Options 顯示設定 ##
<Directory "/var/www/cgi-bin/">AllowOverride NoneOptions +ExecCGI -MultiViews +SymLinksIfOwnerMatchOrder allow,denyAllow from all</Directory> 設定執行命令,重啟Apache服務sudo /etc/init.d/apache2 restart 複製程式碼
1.3 第三步:安裝mysql資料庫
執行命令
sudo apt-get install mysql-server mysql-client複製程式碼
友情提示: apt-get程式會自動下載安裝最新的mysql版本。在安裝的最後,它會要求裡輸入root的密碼,注意,這裡的root密碼是指你要給MySQL設定的root密碼。
1.4 第四步:設定Ubuntu檔案執行讀寫許可權
LAMP組建安裝好之後,PHP網路伺服器根目錄預設設定是在:/var/www。由於Linux系統的安全性原則,改目錄下的檔案讀寫許可權是隻允許root使用者操作的,所以我們不能在www資料夾中新建修改和刪除檔案,必須要先修改/var/www目錄的讀寫許可權。在介面管理器中通過右鍵屬性不能修改檔案許可權,得執行root終端命令。
執行命令
sudo chmod 777 /var/www複製程式碼
至此,伺服器環境搭建完成。
二、系統設計
2.1 DDNS系統設計
2.2 伺服器流程設計
如圖所示,伺服器在接收到請求後,需要進行使用者認證,認證通過後才能跳轉至cgi程式進行資料庫操作,資訊獲取等。
2.3 資料庫設計
核心表格:
1.device記錄裝置對應的域名,ip地址,裝置資訊等
2.user記錄使用者資訊,使用者ddns許可權等
三、詳細實現
3.1 Makefile編譯C cgi程式
LDFLAGS := -L/usr/lib/mysql-workbench -lmysqlclient -L/usr/lib/i386-linux-gnu/ -lcrypto
INCLUDE := -I. -I/usr/include/mysql
RECO_TARGET_DIR := /var/www/cgi-bin
#所有的原始檔
ALL_SRC_FILES := $(wildcard *.c)
#所有的目標檔案
ALL_TARGET_OBJS := $(patsubst %.c,$(RECO_TARGET_DIR)/%.o,$(ALL_SRC_FILES))
#依賴檔案
#RECO_TARGET_DIR := $(RECO_TARGET_DIR)/ddnscgi
RECO_DEPEND_FILE:= $(RECO_TARGET_DIR)/MAKEFILE.DEPEND
RECO_TARGET_NAME:=ddnstest
#避免RECO_TARGET_NAME為空時,導致誤刪除
ifeq ($(RECO_TARGET_NAME),)
RECO_TARGET_NAME:=oooxxxx
endif
#確定編譯目標型別
RECO_MK_EXE := $(RECO_TARGET_DIR)/$(RECO_TARGET_NAME)
RECO_MK_TARGET := $(RECO_MK_EXE)
RECO_MK_TARGET : $(RECO_MK_TARGET)
#包含依賴檔案
ifneq ($(MAKECMDGOALS),clean)
include $(RECO_DEPEND_FILE)
endif
#exe生成規則
$(RECO_MK_EXE): $(ALL_TARGET_OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
#.o檔案生成規則
$(RECO_TARGET_DIR)/%.o:%.c
$(CC) $(INCLUDE) -o $@ -c $<
#生成依賴檔案
$(RECO_DEPEND_FILE):
@set -e; \
#echo "Making $@ ..."; \
$(CC) $(INCLUDE) -E -MM $(ALL_SRC_FILES) | sed 's,\(.*\)\.o[ :]*,$(RECO_TARGET_DIR)/\1.o $@:,g'>$(RECO_DEPEND_FILE);
#執行clean操作
clean:
-rm -rf $(RECO_TARGET_DIR)/$(RECO_TARGET_NAME)
-rm -rf $(RECO_TARGET_DIR)/*.o
-rm -rf $(RECO_DEPEND_FILE)複製程式碼
3.2 Apache重定向實現頁面跳轉
首先,啟用apache重寫模組,並重啟apache服務
方式一:
sudo a2enmod rewrite
方式二:
sudo ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
方式三:
修改配置檔案:/usr/local/apache/conf/httpd.conf 開啟LoadModule rewrite_module modules/mod_rewrite.so複製程式碼
其次,完成以下配置
- 修改Apache下httpd.conf或/etc/apache2/sites-available/default檔案: 將所有的AllowOverride None 改為 AllowOverride All 。
- 在需要做頁面跳轉的目錄下新建.htaccess檔案。
- 在.htaccess中設定重寫規則。
.htaccess內容語法格式如下:
RewriteEngine On # 將 RewriteEngine 模式開啟
RewriteCond String 正則表示式 //當滿足是才執行rewriteRule
RewriteRule 正則表示式 目標地址
當請求地址滿足正則表示式時,跳轉至目標地址。複製程式碼
3.3 Apache Basic和digest認證的實現
在實際應用中,常要求某些頁面、資料、功能只允許特定的人訪問,為了實現這個目標,那麼就要應用認證功能。HTTP 提供一個用於許可權控制和認證的通用框架。最常用的是Basic認證和Digest認證。
Basic認證(基本認證):基本認證是一種用來允許Web瀏覽器或其他客戶端程式在請求時提供使用者名稱和口令形式的身份憑證的一種登入驗證方式。把 "使用者名稱+冒號+密碼"用BASE64演演算法加密後的字串放在http request 中的header Authorization中傳送給服務端,包含密碼的明文傳遞。
Digest認證(摘要認證):摘要認證可以看做是基本認證的增強版本,不包含密碼的明文傳遞。引入了qop、nonce、cnonce等一系列安全增強的選項,並使用 MD5 加密達成"不可逆的"。
一個典型的客戶端與伺服器間進行http身份認證過程:
在apache伺服器實現basic認證:
- 採用htpasswd方式生成密碼檔案
- 在httpd.conf或default檔案中進行認證配置
採用htpasswd方式生成密碼檔案:
htpasswd -c /root/.htpasswd admin
在httpd.conf或default檔案中進行認證配置:
<Directory "/var/www/">
AuthType basic
AuthName "Authorization "
AuthUserFile /root/.htpasswd
Require user cnsecer
</Directory>
其中“/var/www/”代表被需要認證的目錄,/root/.htpasswd則指第一步生成的密碼檔案
複製程式碼
Apache實現digest認證:
- 啟用digest認證模組。
- 使用htdigest命令建立密碼檔案。
- 在httpd.conf或default檔案中進行認證配置。
1.啟用digest認證模組:
a2enmod auth_digest
2.使用htdigest命令建立密碼檔案:
htdigest -c /usr/local/nagios/etc/nagios.users "Nagios Access" nagiosadmin
其中"Nagios Access"需與下方3.配置的AuthName 一致。
3.在httpd.conf或default檔案中進行認證配置:
<Location /nagios/>
AuthType Digest
AuthName "Nagios Access"
AuthDigestDomain /nagios/ http://192.168.0.205/nagios/
AuthDigestProvider file
AuthUserFile /usr/local/nagios/etc/nagios.users密碼檔案路徑
Require valid-user
</Location>複製程式碼
至此,Ubutun下DDNS伺服器搭建完成。
最後
此專案完成時間2016,有點久遠,存在不足之處,歡迎小夥伴們一起交流。另外,想了解更多,可以訪問以下連結:
Makefile規則:
Apache Rewrite規則: