2020年10月1日 星期四

設定特定連線才使用VPN

環境:win10,已新增一個VPN連線 (IP:a.b.c.d,連線名稱:SV)

目的:限制只有跟 IP w.x.y.z 的連線,才使用 VPN


步驟:

  1. 預設啟用VPN後,所有連線,都會經過VPN,先取消此設定。
    到「控制台\所有控制台項目\網路連線」,於 VPN 連線上
    按右鍵->「內容」->「網路功能」->「網際網路通訊協定第4版(TCP/IPv4)」->「內容」->「進階」->不要勾選「使用遠端網路的預設閘道」





  2. 啟用 VPN。(經過步驟1的設定後,此時啟用 VPN,連線也不會經過 VPN。)
    然後使用「route print」指令,找出 VPN 連線的介面ID。
    如下,可知名稱 SV 的 VPN,介面ID 為 57
    C:\WINDOWS\system32>route print
    ===========================================================================
    介面清單
     12...0a 00 27 00 00 0c ......VirtualBox Host-Only Ethernet Adapter #10
     16...0a 00 27 00 00 10 ......VirtualBox Host-Only Ethernet Adapter #9
     57...........................SV
      1...........................Software Loopback Interface 1
    ===========================================================================

  3. 將要經過 VPN 的連線,設進路由。
    假設跟 IP w.x.y.z 的連線,才要經過VPN,可如下設定,加入路由表
    route add -p w.x.y.z mask 255.255.255.255 0.0.0.0 if 57
    參數 -p:預設電腦重啟、VPN關閉重啟,設定會取消。加上 -p 參數可保留設定。
    閘道 0.0.0.0:0.0.0.0 使用預設路由,也可以指明設定IP

    再使用「route print」指令檢查使用中的路由表,應該可以發現多了以上的設定
    C:\WINDOWS\system32>route print
    ===========================================================================
    介面清單
     12...0a 00 27 00 00 0c ......VirtualBox Host-Only Ethernet Adapter #10
     16...0a 00 27 00 00 10 ......VirtualBox Host-Only Ethernet Adapter #9
     57...........................SV
      1...........................Software Loopback Interface 1
    ===========================================================================
    
    IPv4 路由表
    ===========================================================================
    使用中的路由:
    網路目的地                 網路遮罩         閘道          介面       計量
              0.0.0.0          0.0.0.0      192.168.0.1    192.168.0.8    281
             10.0.0.0        255.0.0.0     10.10.10.101      10.10.10.50     26
          10.10.10.50  255.255.255.255            在連結上       10.10.10.50    281
              w.x.y.z  255.255.255.255            在連結上       10.10.10.50     26
              a.b.c.d  255.255.255.255      192.168.0.1    192.168.0.8     26

  4. 若要刪除上面的 route 設定
    route delete w.x.y.z mask 255.255.255.255 0.0.0.0
    或
    route delete w.x.y.z mask 255.255.255.255


參考:
Shunze 學園 - 《分享》增加VPN連線後的遠端網段路由
Windows 雙網路搭配雙網卡 @ Welkin小窩 :: 痞客邦 ::
networking - How can I make the Windows VPN route selective traffic (by destination network)? - Super User


2020年9月6日 星期日

jQuery Datepicker 增加清除按鈕

原本 jQuery Datepicker 的操作按鈕面板(showButtonPanel: true),只有「Today」、「Done」,兩個按鈕。
沒有清空日期的按鈕,只能於input上,將選擇的日期手動清除。
$(".test").datepicker({
    dateFormat: "yy-mm-dd",
    showOn: "both",
    buttonImageOnly: true,
    showButtonPanel: true,
    buttonImage: "img/calendar.png"
});


此處增加「Clear」按鈕,用來清空選擇的日期。

方法一:
參考 https://stackoverflow.com/a/15799622
將「Done」按鈕,修改成為清空的效果。缺點是「Done」按鈕不見了。

$(".test").datepicker({
    dateFormat: "yy-mm-dd",
    showOn: "both",
    buttonImageOnly: true,
    showButtonPanel: true,
    closeText: 'Clear',
    onClose: function (dateText, inst) {
        if ($(window.event.srcElement).hasClass('ui-datepicker-close')) {
            document.getElementById(this.id).value = '';
        }
    },
    buttonImage: "img/calendar.png"
});


方法二:
參考 https://stackoverflow.com/a/6941440https://stackoverflow.com/a/28045758
另外新增一個「clear」按鈕。

//另外新增一個clear按鈕
function datepickerAddClearBtn() {
        var old_fn = $.datepicker._updateDatepicker;
        $.datepicker._updateDatepicker = function (inst) {
        old_fn.call(this, inst);
        var buttonPane = $(this).datepicker("widget").find(".ui-datepicker-buttonpane");

        $("<button type='button' class='ui-datepicker-clean ui-state-default ui-priority-primary ui-corner-all'>Clear</button>").appendTo(buttonPane).click(function (ev) {
            $.datepicker._clearDate(inst.input);//清除選擇的日期
            $.datepicker._hideDatepicker();//關閉Datepicker
        });
    };
}
datepickerAddClearBtn();

$(".test").datepicker({
    dateFormat: "yy-mm-dd",
    showOn: "both",
    buttonImageOnly: true,
    showButtonPanel: true,
    buttonImage: "img/calendar.png"
});




其他:
jQuery-Timepicker-Addon 附加套件上亦適用


2020年8月14日 星期五

PHP 找出字串中不可見的字元

匯入資料時,發現資料長度,跟肉眼看到的不一樣。
此時資料中可能有不可見的字符,要看到這些字元,有個簡便的方式,
先用 json_encode() 函式處理,便可看到原本看不到的字元。
多字節的 Unicode 字元,也會轉成 \u**** 的 Unicode Code Point 格式,可看到字元在 Unicode 字元集中的編號。

情況一:
字串"test",長度4,但匯入時,長度卻為7,比看到的多了 3(使用strlen計算字算長度)。
用 json_encode() 處理後,出現 "\ufefftest",前面多了「\ufeff」
「\ufeff」:是檔案的 BOM


情況二:
字串"1234",長度4,但匯入時,長度卻為10,比看到的多了 6(使用strlen計算字算長度)。
用 json_encode() 處理後,出現 "\u202d1234\u202c",前面多了「\u202d」,後面多了「\u202c」
網上查到以下兩種情況可能會發生
1.在 iphone 通訊錄,複製電話號碼(我沒iphone,就沒試了)
 參考:iOS通讯录复制的手机号码字符串多了奇怪的unicode码\\u0000202d-\\u0000202c_lnking1992的专栏-CSDN博客_通讯录号码复制有特殊字符
2.excel 中複製欄位資料(我測試沒試出來)
參考:记一次编码导致的问题:\\u202d和\\u202c_fan3394565的博客-CSDN博客_\\u202c

前後不可見的字元分別是,LRO、PDF
「\u202e」:RLO,Unicode控制字符,開始從右到左的文字
「\u202d」:LRO,Unicode控制字符,開始從左到右的文字
「\u202c」:PDF,Unicode控制字符,結束上一次定義


[將不可見的特殊字元去除]
因為都剛好在字串前後,我就直接只用 trim() 處理
trim($str, " \t\n\r\0\x0B\u{feff}\u{202d}\u{202c}");
//" \t\n\r\0\x0B"為 trim 預設就會去除的特殊字元

BOM「\ufeff用16進位表示為\xef\xbb\xbf
也可寫成
trim($str, " \t\n\r\0\x0B\xef\xbb\xbf\u{202d}\u{202c}");


其他:
\u{****}寫法,PHP7才支援,也可用 json_decode 將 Unicode Code Point  轉回。
var_dump(json_decode('"\u202d"'));
var_dump(json_decode('"\u9999"'));


參考:
关于Unicode控制字符RLO,LRO,PDF 的坑 - scgaopan的个人空间 - OSCHINA
Unicode codepoint 轉譯語法
碼位 - 維基百科,自由的百科全書
php - UTF-8 to Unicode Code Points - Stack Overflow
PHP - 使用PHP將Unicode字符轉換為“\ uxxxx”格式 | php Tutorial




2020年8月10日 星期一

windows 使用內建指令計算檔案雜湊值

網路上下載檔案時,有的會提供檔案校驗碼(checksum),
裡面可能有 MD5、SHA256、......,各種雜湊演算法,計算出來的檔案雜湊值(Hash Value)

windows 內建了 certutil 指令,可用計算檔案的各種雜湊值
例如:
計算 D:\test.iso 檔案的 SHA256 雜湊值
certUtil -hashfile D:\test.iso SHA256


參考:
certutil | Microsoft Docs
https://superuser.com/a/898377
有趣的命令行系列——才被黑客重視的命令certutil - 每日頭條


2020年8月9日 星期日

CentOS 7 安裝 GitLab

到官網 https://about.gitlab.com/install/
有相對應的作業系統安裝說明 https://about.gitlab.com/install/#centos-7
這邊安裝的版本是 gitlab-ce 13.2.2

安裝(設定nginx SSL憑證,使用 HTTPS 連線)
  1. 安裝依賴的的套件
    $ yum install -y curl policycoreutils-python openssh-server
    
    
  2. 啟動 SSH 服務
    $ systemctl enable sshd
    $ systemctl start sshd
    
  3. 防火牆開啟網頁要用的PORT網頁
    這邊開 9000 PORT,預計當 HTTPS PORT
    //firewall-cmd --permanent --add-service=http
    //firewall-cmd --permanent --add-service=https
    $ firewall-cmd --permanent --zone=public --add-port=9000/tcp
    $ systemctl reload firewalld
    $ firewall-cmd --list-all --zone=public
  4. 安裝 SMTP Server (Postfix)
    使用者註冊、初次修改密碼、忘記密碼使用
    $ yum install postfix
    $ systemctl enable postfix
    $ systemctl start postfix
  5. 安裝 GitLab 套件的yum儲存庫(repo)
    有兩個版本,CE社群版(Community Edition),EE企業版(Enterprise Edition)
    Community Edition or Enterprise Edition | GitLab
    這邊安裝 CE 版,若要安裝 EE 版,將指令中的「ce」改成「ee」即可
    $ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
  6. 使用 yum 指令安裝 GitLab 套件,GitLab 自帶很多會用到的其他套件(nginx、puma、...)
    我在2G RAM虛擬機器上須安裝時,跑很久都沒跑完,記憶體被吃光。
    後來看到官網建議要4G RAM,改成4G RAM才在可忍受的時間安裝完畢。
    $ yum install -y gitlab-ce
  7. 預計使用 HTTPS 加密連線,先產生 nginx 使用的 SSL 憑證
    (這邊選擇用自己發的憑證,若有合法網域,可略過此步驟,GitLab 會自動申請Let's Encrypt的憑證)
    $ mkdir /etc/gitlab/ssl
    $ chmod 755 /etc/gitlab/ssl
    $ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/gitlab/ssl/nginx.key -out /etc/gitlab/ssl/nginx.crt
  8. 修改 GitLab 設定檔 gitlab.rb,設定網頁訪問用的外部網址,與設定 nginx 使用的SSL憑證
    $ vi /etc/gitlab/gitlab.rb
    external_url 改為要瀏覽的網址
    external_url 'https://192.168.0.100:9999'

    修改 GetLab 自帶 Nginx 的 ssl_certificate、ssl_certificate_key 設定
    預設為
    # nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt"
    # nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"
    改為
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/nginx.crt"
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/nginx.key"
    若沒改,預設會取得 external_url 設定中的網域,自動向 Let's Encrypt 申請憑證
    但如果設定的網域是自訂的,或設定的是IP,無法申請 Let's Encrypt 認證的憑證
    所以這邊選擇設定自發憑證的位置

    更新GitLab服務設定
    $ gitlab-ctl reconfigure
    執行 gitlab-ctl reconfigure  後,即可使用 external_url 設定的網址訪問
    (若出現 502 錯誤,可稍等一下,我測試 gitlab-ctl reconfigure 一跑玩,馬上試,出現502,似乎相關服務還沒重新跑)

    若依然出現502錯誤
    502-Whoops, GitLab is taking too much time to respond
    檢查 GetLab 自帶且目前啟動的服務中(gitlab-ctl status),有哪些可能是 PORT 跟系統原本的服務相衝突了
    可在 /etc/gitlab/gitlab.rb 中修改各服務使用的 PORT
    (自帶的 Nginx 使用的PORT,依 external_url 設定的網址而定)
  9. 安裝成功,系統預設有一個 root 帳號,瀏覽 external_url 設定的網址
    會出現設定root密碼的畫面,設定後,即可用 root 登入
  10. 若為自發的HTTPS憑證,則專案的git config須設定 http.sslVerify false才能存取
    $ git config [--global] http.sslVerify false


其他:
  1. GitLab專案儲存庫(repositories),存放位置修改
    例如,改到 /home/git-data
    $ mkdir /home/git-data
    #參考原本repositories資料夾位置 /var/opt/gitlab/git-data 權限,做了一樣的修改(雖然官網說明沒寫)
    $ chown git.root /home/git-data
    $ chmod 700 /home/git-data
    修改 gitlab.rb 設定檔中的 git_data_dirs 設定,改為新的資料夾位置路徑
    $ vi /etc/gitlab/gitlab.rb
    git_data_dirs({
      "default" => {"path" => "/home/git-data"}
    })
    讓設定生效
    $ gitlab-ctl reconfigure
    若原本repositories 已有資料,可用以下操作移到新位置
    $ gitlab-ctl stop
    # Note there is _no_ slash behind 'repositories', but there _is_ a
    # slash behind 'git-data'
    $ rsync -av /var/opt/gitlab/git-data/repositories /home/git-data/
    $ gitlab-ctl upgrade
    $ gitlab-ctl start
  2. GitLab 關閉開放自行註冊帳號
    管理者登入後 > Admin Area > General > Sign-up restrictions >Sign-up enabled
  3. GitLab 關閉SSH,只通過https存取
    管理者登入後 > Admin Area > General > Visibility and access controls > Enabled Git access protocols
  4. 相關指令
    gitlab-ctl reconfigure   # 更新GitLab服務設定
    gitlab-ctl restart       # 重新啟動GitLab
    gitlab-ctl status        # 檢視GitLab服務狀態
    gitlab-ctl tail          # 查看GitLab服務執行期間的log
    gitlab-ctl stop nginx    # 停止GitLab自帶的nginx
    gitlab-ctl start nginx   # 啟動GitLab自帶的nginx

參考:
https://docs.gitlab.com/omnibus/settings/nginx.html#manually-configuring-https
https://docs.gitlab.com/omnibus/settings/configuration.html#storing-git-data-in-an-alternative-directory
https://docs.gitlab.com/omnibus/package-information/defaults.html