中華電信 hicloud CVPC 的 IPsec VPN

先說結論,如果照中華電信 hicloud 的文件設定,是絕對不會通的

我一開始參考的是這邊

  • 16.5 如何新增 IPSEC Tunnel 至客戶端 IPSEC 設備
  • 16.6 客戶端 IPSSEC VPN 設備 Tunnel 設定範例

這兩份文件。

16.5 這份文件提供了 hicloud 端的 IPsec 設定,基本上沒有太大的問題,要注意的是加密演算法要和本地端設備設定相同

主要的問題會在 16.6 這份文件讓人很困惑。以 phase 1 來說,文件中的設定用了

set security ike proposal ike-proposal authentication-algorithm md5

set security ike proposal ike-proposal encryption-algorithm 3des-cbc

這樣的加密和認證方式,但是 hicloud 的後台並沒有這個組合可以選,所以我改用 sha1/3des 這個組合。

同樣的問題也發生在 phase 2,文件中用了

set security ipsec proposal ike-proposal authentication-algorithm hmac-sha1-96

set security ipsec proposal ike-proposal encryption-algorithm aes-128-cbc

這樣的組合,但是一樣後台並沒有這樣的組合,所以我一樣用 sha1/3des

如果只有這樣,你的 IPSec tunnel 肯定還是不會起來,花了很長時間找原因之後,忽然發現在

run show log kmd-logs

的時候,會噴類似下面的 log

Jun 5 15:03:52 sr-hq-srx240-1 kmd[22276]: IKE negotiation failed with error: Authentication failed. IKE Version: 1, VPN: ike-vpn-hicloud-10-0-0-0 Gateway: gw-hicloud-10-0-0-0, Local: xxx.xxx.xxx.xxx/500, Remote: 210.65.122.28/500, Local IKE-ID: xxx.xxx.xxx.xxx, Remote IKE-ID: 127.0.0.1, VR-ID: 0

可以看到 IKE 在 negotiation 的時候,認證失敗了。而失敗的原因並不是設定中的 pre-shared-key 打錯,而是因為 hicloud 的 Remote IKE-ID 是 127.0.0.1。

所以我們必須要在設定中加上這樣的設定

set security ike gateway ${YOUR_GATEWAY_NAME} remote-identity inet 127.0.0.1

這樣就會通了,而這一點是完全沒有在文件上提到的。

中華電信 hicloud 後台並不支援 Firefox

UPDATE:2018-08-22 使用 Firefox 61.0.2 應該已經可以了

官方的 Q&A 裡面提到

Q. 虛擬私雲 (hicloud VPC) 虛擬資料中心 管理介面 (vDC ) 有支援那些瀏覽器 ?

A. hicloud VPC 雲伺服器 Console 管理介面相容於部分瀏覽器與作業系統,建議您參考『hicloudVPC 操作說明手冊』(https://userportal.hicloud.hinet.net/vpc/document/files/hicloudVPC_Manual.pdf) 系統需求清單內瀏覽器與作業系統支援列表,並建議您使用 Firefox 瀏覽器得到最佳的相容性。

『建議您使用 Firefox 瀏覽器得到最佳的相容性』

但是用 Firefox 60.0.1 打開後台,只會看到這樣的空白頁

Screenshot-2018-6-4 中華電信hicloud雲端服務.png

而用 Chrome 打開同樣的頁面則可以正常顯示

螢幕快照 2018-06-04 上午10.01.55.png

甚至用 Safari 11.1.1 也可以正常顯示

螢幕快照 2018-06-04 上午10.08.54.png

中華電信你是不是在開我玩笑?

[macOS] 更新後登入畫面變成英文的解決方法

幾天前更新 High Sierra 10.13.3 補充更新後,重開機登入畫面變成英文的了。隨手搜尋了一下好像沒看到有人遇到一樣的問題。

解決方法是到「系統偏好設定」→「語言與地區」新增英文語系,並把英文設為預設後(拉到最上面)重開機。重開機回來以後再到一樣的地方把繁體中文設為預設,再重開機就好了。

Caddy + gunicorn + django

前言

目前這個部落格是放在東京 Linode 主機上,最近遇到的問題是 nginx 每天都會自動死掉,每天都得要 ssh 進去 restart nginx service,實在有夠麻煩。再加上我有用 Let’s Encrypt,每 90 天都要更新憑證。乾脆一不做二不休的把 web server 換成會自動更新憑證的 caddy,以下這篇記錄轉換的過程。

安裝 caddy

以下參考這份文件

安裝 caddy 很簡單,直接在 shell 下執行:

curl -s https://getcaddy.com | bash -s personal

使用 personal license 來安裝 caddy

然後建立必要的目錄

sudo mkdir /etc/caddy && sudo chown -R root:www-data /etc/caddy

建立空白的 caddy 設定檔

sudo touch /etc/caddy/Caddyfile

建立給 caddy 使用的 ssl 目錄

sudo mkdir /etc/ssl/caddy
sudo chown -R www-data:root /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

安裝 Caddy 系統服務

從官方 repository 下載 caddy.service

sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

讓 systemd 發現新下載的 caddy.service

sudo systemctl daemon-reload

Enable caddy.service

sudo systemctl enable caddy.service

(Optional) 檢查 Caddy 是否有正確運作

建立 /var/www/index.html

echo '<h1>Hello World!</h1>' | sudo tee /var/www/index.html

編輯 /etc/caddy/Caddyfile 設定檔

http:// {
    root /var/www
    gzip
}

然後啟動 Caddy server

sudo systemctl start caddy

設定 gunicorn

之前用 nginx 當作 web server 的時候,是搭配 uwsgi 來把 request 傳到 django 內。而 Caddy 雖然有 plugin 可以支援 uwsgi,但是需要自己編 Caddy,所以在這裡我改用 gunicorn。

安裝 gunicorn 和 runit

sudo apt install -y runit
sudo -H pip install gunicorn
sudo service runit start

設定 runit,${project_name} 為您的專案名稱

mkdir /etc/sv/${product_name}/
touch /etc/sv/${project_name}/run
chmod u+x /etc/sv/${project_name}/run
vim /etc/sv/${project_name}/run

編輯 /etc/sv/${project_name}/run

#!/bin/sh

# gunicorn 執行檔位置
GUNICORN=/usr/local/bin/gunicorn
# Django 專案位置
ROOT=/var/www/my_django_project
# 執行時的 pid 位置
PID=/tmp/my_django_project.pid

# Django 專案的 wsgi.py 位置
APP=my_django_project.wsgi

if [ -f $PID ]; then rm $PID; fi

cd $ROOT
exec $GUNICORN -c $ROOT/gunicorn.conf.py --pid=$PID $APP --group www-data

再來設定 django 專案,在專案根目錄中新增 gunicorn.conf.py,內容如下

# 用本機的 8000 port
bind = "127.0.0.1:8000"
# gunicorn 的 pid file,和前面 runit 設定檔內相同
pidfile = "/tmp/my_django_project.pid"
# 設定要用幾個 worker 來執行
workers = 1
timeout = 90

再來讓 runit 把 gunicorn 跑起來

ln -s /etc/sv/${project_name} /etc/service/${project_name}

如果到這邊都有做對,當你建立好 symbolic link 後執行 ps -aux | grep gunicorn,就會看到 gunicorn 的 process 跑起來了

設定 Caddy

最後設定 Caddy 把 request 丟給 gunicorn 處理,編輯 /etc/caddy/Caddyfile,加上

my_django_project.fykuan.tw {
    root /var/www/my_django_project
    proxy / 127.0.0.1:8000 {
        transparent
        except /static
    }
    tls ${your_email_address}
}

然後重新啟動 Caddy

sudo service caddy restart

就可以用瀏覽器打開 https://my_django_project.fykuan.tw 試試看了