解決 Synology Hyper Backup 遠端 NAS 裝置備份無法連線的問題

前言

這幾天在設定 Synology Hyper Backup 遠端備份的時候,發生了網路都通但無法連線的錯誤,因此開始了除錯之旅,在這邊紀錄一下過程與解決辦法。

問題

  1. 遠端 NAS IP 可連線,可 Ping
  2. Synology Hyper Backup 與 Hyper Backup Vault 皆為最新版本 (3.0.2-2531)
  3. 可成功完成身分驗證
  4. 遠端 NAS 的 TCP/6281 可以連線
  5. 點選共用資料夾時發生「無法連線至備份目的地」的錯誤

過程

錄製封包

由於設備在遠端,又無可遠端操作的設備,因此選擇從閘道器 (Gateway) 進行封包錄製,大多數 Gateway 應該都有這個功能,在這裡以我家用的 FortiGate 50E 為例子。

我將 Filter 設定為我 NAS 的 IP 與 TCP/6281 (Hyper Backup) ,來避免錄製到其他封包。

分析封包

透過 Wireshark 分析封包,我從中發現了一個有趣的情況,TCP 連線有成功被建立,但當 TLS 交握才剛進行到 Client Hello 時,TCP 連線就直接被 Server RST 了。

由於在 Client Hello 階段就出事了,因此懷疑是憑證的問題。

更換憑證

我的 NAS 有簽憑證,因此先將 Hyper Backup 的憑證換回自動產生的 Synology.com

然後就好了

更換憑證後, Hyper Backup 就成功建立備份任務了。

結論

不能用 ECC 的憑證,要用 RSA 的。

PHP 7.0 下安裝 phpLDAPadmin 發生錯誤的修正方法

在稍具規模的網路環境中, 網管時常選用 LDAP 來進行帳號的統整管理, 一方面提供管理便利度, 另一方面使用者也不必因為不同系統而記憶不同帳號, phpLDAPadmin 是一套常見的 LDAP 管理介面, 但 phpLDAPadmin 已經很久沒有更新了, 若想要安裝在 PHP 5.6 以上, 甚至是最新版的 PHP 7 的環境中, 是無法順利安裝的, 因此我們需要做些修正.

Session 相關錯誤

打開 index.php 時出現下列錯誤:

  • Undefined variable: _SESSION in …. on line 379
  • Fatal error: Uncaught Error: Call to a member function getValue() on null in … on line 379

導致這個錯誤的主要原因是因為 phpLDAPadmin 需要使用 session, 在 PHP 中若要使用 session, 需要先執行 session_start() 這個函數, 但不知道為什麼 phpLDAPadmin 並沒有這麼做, 因此要解決這個問題, 一種方法是自己找正確的地方加上 session_start(), 另一種方法則是啟動 auto_start 這個特性, 這邊介紹如何啟動 auto_start 這個特性

編輯 php.ini 中的 session.auto_start

session.auto_start = 0

修改為

session.auto_start = 1

password_hash 相關錯誤

修正完 session 的問題後, 畫面上還有一個關於 password_hash 的錯誤

  • Fatal error: Cannot redeclare password_hash() in … on line 2236

造成這個錯誤的原因在於 php 5.5 以後內建了 password_hash 這個函數, 導致內建的 password_hash 與 phpLDAPadmin 自己的 password_hash 發生衝突, 因此只要將 phpLDAPadmin 的 password_hash 名稱替換成別的名稱就可以避開這個問題了

具體的解決辦法如下

對檔案打 patch

wget https://raw.githubusercontent.com/osixia/docker-phpLDAPadmin/stable/image/service/phpldapadmin/assets/php5.5.patch
patch -p1 -d ./phpldapadmin < php5.5.patch

修改 TemplateRender.php

sed -i "s/password_hash/password_hash_custom/g" ./phpldapadmin/lib/TemplateRender.php

Mac 的使用者會遇到 invalid command code W 這個錯誤, 具體原因與解決辦法請參考 MAC 下執行 sed 指令出現錯誤: invalid command code W

記得把指令中的 ./phpldapadmin 替換成 phpldapadmin 的實際位置

Apache .htaccess 沒有效果

我們知道在 Apache 中可以使用 .htaccess 來針對當下目錄做相關設定, 但時常發生 .htaccess 無效的狀況, 這邊分享一下一些常見的原因與排除方法

沒有複寫權限

Apache 根目錄預設是禁止複寫設定的, 可以透過編輯 httpd.conf 當中的設定開啟複寫功能

編輯 httpd.conf

sudo vim /etc/apache/httpd.conf

找到相關目錄設定(這邊以內建路徑為例)

<Directory "/Library/WebServer/Documents">
    Options FollowSymLinks Multiviews
    MultiviewsMatch Any

        AllowOverride None

        Require all granted
</Directory>

將 AllowOverride 修改為 All

<Directory "/Library/WebServer/Documents">
    Options FollowSymLinks Multiviews
    MultiviewsMatch Any

        AllowOverride All

        Require all granted
</Directory>

重新啟動 Apache 即可

檔案名稱錯誤

Apache 可以修改 .htaccess 的名稱, 可能因為某些原因名稱被修改了
可以尋找設定檔中的參數 AccessFileName 來確認正確名稱

模組無效

很多時候其實 .htaccess 有生效, 只是是因為 .htaccess 中有進行模組是否存在的相關檢查, 以至於我們以為沒有生效

.htaccess 可能有類似的內容

<IfModule mod_rewrite.c>
    .......
</IfModule>

上述的 .htaccess 會檢查 Apache 是否有 rewrite 這個模組, 若有才執行, 這種狀況變成要啟動該模組才會正常運行

編輯 httpd.conf, 找到下面的內容並將前方的 # 移除

#LoadModule rewrite_module libexec/apache2/mod_rewrite.so

調整 Mysql/MariaDB Table 名稱大小寫不敏感

MySQL 與 MaraiDB 預設對於 table 的名稱是大小寫敏感的, 也就是 case sensitive, 但最近遇到客戶要求要將表名稱設定為大小寫不敏感, 設定上十分容易, 步驟如下

注意: 請先檢查是否有任何 Table 名稱在改為小寫後會重複的 Table, 若發生衝突 MySQL 會崩潰

編輯 MySQL/MariaDB 設定檔(不同作業系統可能會在不同目錄)

sudo vim /etc/mysql/my.cnf

找到 [mysqld] 這個 section 下方加入

lower_case_table_names = 1

接著重新啟動 MySQL/MariaDB 即可

sudo service mysql restart

Glances – 超強大資源使用監視工具

只要說到伺服器的資源監視想到的不外乎就是 top 與 進階版的htop, 今天要介紹一個更厲害的資源使用監視工具 Glances.

Glances 是一套使用 python 構成的資源監視工具, 除了基本的資源監視外還提供了 Web 介面以及遠端查看的功能.

Requirements

Python > 2.7, >= 3.3
psutil>=2.0.0

Installation

使用 pip 安裝

pip install glances

使用 shell script 安裝

curl -L https://bit.ly/glances | /bin/bash

Usage

基本使用

就跟 top 一樣, 直接在畫面上顯示資訊

glances

啟動 Web 介面

Glances 可以提供 web 介面, 但在使用前要補安裝相依套件 bootle

pip install bottle

接著啟動

glances -w

接著就可以使用喜歡的瀏覽器訪問 http://127.0.0.1:61208

遠端模式

server 模式

glances -s

client 連接

glances -c ip

Access Control

預設模式下 Glances 是免帳密驗證的, 但是為了安全起見我們還是設定一組帳號進行驗證
加入驗證的方法很簡單, 只需要帶入參數 --username--password

glances -s --username  --password

Glances 便會在啟動過程確認要設置的帳號密碼

Define the Glances server username: keniver
Define the Glances server password (keniver username):
Password (confirm):

最後, Glances 會詢問是否紀錄帳號與密碼, 之後啟動就不會再詢問了

Do you want to save the password? [Yes/No]:

當我們為 Glances 啟動驗證後, 我們連線時需要帶入 --username , --password, 並輸入先前設定的密碼才能連線

使用 CloudFlare SSL 憑證後出現過多重新導向的問題

CloudFlare 是一間非常有名的 CDN 廠商, 除了 CDN 與抗DDoS 的功能外, 免費版也提供了 SSL 憑證服務, 讓網站可以立刻從 HTTP 升級到 HTTPS, 使網站內容可以安全傳遞.

某日一個掛在 CloudFlare 的服務突然不能訪問, 只要嘗試訪問服務都會出現 ERR_TOO_MANY_REDIRECTS(過多重新導向) 的問題, 經過追查後整理出成因與解決辦法

發生條件


Cloudflare SSL 模式選擇 Flexible
Server Side 有設定 HTTP rewrite to HTTPS

發生原因

先來看 一下 CloudFlare SSL 的各種模式

(來源: https://www.cloudflare.com)

從上圖可以看出 Flexible 與 Full 最大的差別在於 CloudFlare 與 Origin Server 之間是否走 HTTPS, 這也是過多重新導向的核心原因

若我們在 Origin Server 設定 HTTP 自動導往 HTTPS, 或者程式本身有重新導向(Ex: WordPress), 從 Flexible 的角度來看, CloudFlare 透過 HTTP 存取 Origin, Origin 根據設定要求 Rewrite 到 HTTPS, CloudFlare 將 301/302 導向送往使用者端, 但SSL 模式下, 使用者訪問的網址已經是 HTTPS 了, 因此發生 HTTPS 不斷跳往 HTTPS 的問題, 這也就引發了 ERR_TOO_MANY_REDIRECTS 的問題

解決辦法

  1. Origin Server 關閉 HTTP 導向 HTTPS 功能
  2. 啟動 SSL Full 模式, 直接使用 HTTPS 訪問 Origin (推薦)
    (備註: Origin 要啟動 HTTPS, Strict 模式下憑證必須是有效的不能自簽)

後記

服務本身就有提供HTTPS, 但為了相容一些舊設備因此繼續開放HTTP, 前些日子為了提升整體安全性將所有流量導往 HTTPS, 沒想到悲劇就這樣發生了, 雖然快速找到問題並暫時後復, 但團隊為此猶豫要不要繼續開放 HTTP, 後來研究發現 CloudFlare SSL 相容性竟然意外的好, 因此後續還是強制使用 HTTPS.

在 Debian 8 上安裝 Nginx + PHP7-FPM

Nginx 在 Web Server 領域有著極為優異的表現, 如果搭配 PHP-FPM 可以讓網站的速度更上一層樓, 本篇文章將與各位分享如何在 Debian 8 上安裝 Nginx 與 PHP-FPM

環境資訊

Debian 8 (Jessie) 請注意OS版本, 本文針對 Debian 8 做說明
Nginx 1.6.2
PHP 7.0

安裝 nginx

sudo apt-get install nginx -y

安裝 PHP7-FPM

本文章為濃縮版, 指令細節可以參考 在 Debian 8 (Jessie) 上安裝 Apache + PHP 7

echo "deb http://mirrors.teraren.com/dotdeb/ stable all" | sudo tee --append /etc/apt/sources.list
echo "deb-src http://mirrors.teraren.com/dotdeb/ stable all" | sudo tee --append /etc/apt/sources.list
wget -qO - https://www.dotdeb.org/dotdeb.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install php7.0-fpm php7.0-common -y
sudo apt-get install php7.0-zip php7.0-mysql php7.0-mcrypt php7.0-mbstring php7.0-json php7.0-imagick php7.0-gmp php7.0-curl php7.0-dom php7.0-gd -y

調整 PHP-FPM 設定

我們必須調整 php 的設定, 使得 php 更加安全

sudo vim /etc/php/7.0/fpm/php.ini

將本來由 ;註解掉的設定

;cgi.fix_pathinfo=1

修改為

cgi.fix_pathinfo=0

重新啟動 PHP-FPM

sudo systemctl restart php7.0-fpm

連接 Nginx 與 PHP

sudo vim /etc/nginx/sites-available/default

將下方設定檔寫入其中

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm index.php index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }
}

重新啟動 Nginx

sudo systemctl restart nginx

測試

將測試用檔案寫入 Nginx 預設目錄

echo "<?php phpinfo();" | sudo tee /var/www/html/info.php

打開瀏覽器前往 http://你的IP/info.php


當你看到這個畫面就代表PHP成功運行, 紅框的部分顯示 FPM/FastCGI 代表我們的 PHP 確實是使用 PHP-FPM 模式運行

由於 phpinfo 會透露很多詳細資訊, 為了安全起見, 欣賞完畢要順手把 info.php 刪除

sudo rm /var/www/html/info.php

macOS 無法使用 127.0.0.2 的解決辦法

127.0.0.0/8 是保留給 loopback 網路卡使用的網段, 我們可以藉由 127.0.0.0/8 來模擬不同的IP以及測試網卡驅動是否正常, 在 Windows 跟 Linux 下 127.0.0.0/8 都可以正常運作, 但 macOS 下卻無法連線, 主要原因是因為 FreBSD家族預設只會 bind 127.0.0.1, 因此 127.0.0.2, 127.0.0.3 之類的都不會通.

我們可以透過下列指令將需要的 loopback IP 叫回來( 這邊用 127.0.0.2 作為範例)

sudo ifconfig lo0 alias 127.0.0.2 netmask 0xFFFFFFFF

指令執行成功後, 我們就會發現可以 ping 到 127.0.0.2 了

註: 重新開機設定會消失, 需要重新執行指令

Linux 設定 VLAN 802.1Q

在複雜網路環境中適度的使用 VLAN 會幫助我們降低管理複雜度, 當我們設定完 Switch 端 VLAN 設定後, 我們也必須調整電腦端的 VLAN 設定來接入 VLAN 網路, Linux 對於 VLAN 的支援非常穩定, 透過以下的方法我們便可以在 Linux 輕鬆使用 VLAN.

安裝相關套件

安裝 VLAN 套件

sudo apt-get install vlan

將 802.1q 模組載入 Kernel

modprobe 8021q

確認 Kernel 有正確載入 802.1Q 模組

sudo lsmod | grep -i 8021q 

有輸出就代表有正常載入 802.1Q 模組

8021q                  27844  0 
garp                   13117  1 8021q
mrp                    17343  1 8021q

設定網路卡

在我的網路環境中, 我有一張實體網路卡 eth0, 並且要設定兩張 VLAN 網卡, 分別為 VLAN 5 與 VLAN 10.

編輯 /etc/network/interfaces

# 將 eth0 網卡切入手動模式
auto eth0
iface eth0 inet manual
        pre-up ifconfig $IFACE up

# 網卡名稱格式為 Bridge 網卡.VLAN

# 建立 VLAN 5 網卡, 靜態網路設定
auto eth0.5 
iface eth0.5 inet static
        vlan-raw-device eth0  #Bridge 到 eth0
        # 以下為基本網卡設定, 依照需求設定即可
        address 10.10.10.254
        netmask 255.255.255.0

# 建立 VLAN 10 網卡, DHCP
auto eth0.10
iface eth0.10 inet dhcp
        vlan-raw-device eth0

設定完畢後重新啟動 networking

/etc/init.d/networking restart

若設定都正確, ifconfig 將會顯示設定好的 VLAN 網卡, 這樣我們就可以正常存取 VLAN 網路了

在 Debian 8 (Jessie) 上安裝 Apache + PHP 7

環境

Debian 8 (Jessie) 請注意OS版本, 本文針對 Debian 8 做說明
Apache 2.4
PHP 7.0

加入 dotdeb 資源

新增套件來源

新增 dotdeb.org 資源庫, 此為 PHP7 的套件來源

echo "deb http://mirrors.teraren.com/dotdeb/ stable all" | sudo tee --append /etc/apt/sources.list
echo "deb-src http://mirrors.teraren.com/dotdeb/ stable all" | sudo tee --append /etc/apt/sources.list

由於我的主機在日本, 因此我選擇日本的鏡像點, 你也可以從 https://www.dotdeb.org/mirrors/ 尋找比較適合的鏡像點

加入 dotdeb.org 的 GPG Key

新的套件來源都必須加入 GPG Key 來確保完整性, 我們可以透過下列指令匯入 dotdeb 的 GPG Key

wget -qO - https://www.dotdeb.org/dotdeb.gpg | sudo apt-key add -

更新主機套件資訊以及升級過期套件

sudo apt-get update && sudo apt-get upgrade -y

安裝 Apache + PHP 7

安裝 Apache

sudo apt-get install apache2 -y

安裝 PHP 7

sudo apt-get install php7.0 php7.0-common -y

安裝 PHP 7 常用函數庫

我們可以透過 apt-cache 列出所有可以安裝的 php7.0 函數庫

apt-cache search php7.0

這邊我就只安裝常用的套件, 各位可以依照需求自行補充安裝

sudo apt-get install php7.0-zip php7.0-mysql php7.0-mcrypt php7.0-mbstring php7.0-json php7.0-imagick php7.0-gmp php7.0-curl php7.0-dom php7.0-gd -y

連接 Apache 與 PHP 7

sudo apt-get install libapache2-mod-php7.0 -y && sudo service apache2 restart

測試結果

在 Web 目錄中建立一個 test.php 來確認是否能夠正常執行 php

echo "<?php phpinfo();" | sudo tee /var/www/html/test.php

打開瀏覽器 前往 http://[你的IP]/test.php

若出現以上面的畫面就代表 Apache 與 PHP 7 成功運作