2016年5月20日 星期五

CentOS 7 安裝 proxychains

因為yum沒有proxychains 可以直接安裝,然後又需要透過server去連ss代理

安裝 proxychains
# cd ~
# git clone https://github.com/rofl0r/proxychains-ng.git 
# cd proxychains-ng 
# ./configure && make && make install  
# make install-config

配置
# vim /usr/local/etc/proxychains.conf
更改
socks4 127.0.0.1 9050

socks5 127.0.0.1 xxxx
xxxx為你shadowsocks本地代理的port

開啟shadowsocks
$ sslocal -s <server_ip> -p <server_port> -l <local_port> -k <password> -m <method>
配合nohup和&可以使之后台运行,关闭终端也不影响:
#nohup sslocal -s 服务器地址 -p 服务器端口 -l 本地端端口 -k 密码 -m 加密方法 &

檢查是否代理成功
# proxychains4 curl https://api.ipify.org/?format=json

參考資料:
https://www.netroby.com/view/3653  Install proxychains on centos 6
https://wiki.archlinux.org/index.php/Shadowsocks_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)  Shadowsocks (简体中文)



2016年5月17日 星期二

gitlab 自動custom hook佈署到server上

gitlab和web server現在放在同一台機器上,想要本地測試完git push到機器上後自動佈署到web服務上
因為懶得搞另一套 jenkins,所以打算用hook做

方案
git本身的hook
gitlab的 custom hook   http://docs.gitlab.com/ee/hooks/custom_hooks.html
gitlab的 web hook   http://docs.gitlab.com/ee/web_hooks/web_hooks.html

這裡選用gitlab的 custom hook

步驟:
0. 切換到git使用者,因為gitlab文件的使用者權限都是git
# sudo su git
1. 假設root使用者的test專案需要hook
2. 找server上test.git庫的位置,我的放在 /var/opt/gitlab/git-data/repositories/root/test.git ,但也有可能放在 /home/git/repositories/<group>/<project>.git ,依你安裝的方式不同而不同
3. 進入該資料夾後新建 custom_hooks 資料夾
4. 進入 custom_hooks 資料夾,在這邊新增原git hook類型的檔案,ex. pre-receive。這邊新增 post-receive這個鉤子文件,當push完成後這個文件就會被調用
post-receive
#!/bin/sh
git --work-tree=/var/www/test.localhost/html --git-dir=/var/opt/gitlab/git-data/repositories/root/test.git checkout -f
--git-dir git庫所在位置
--work-tree 實際文件被存放的位置
5. 別忘了賦予 post-receive 可執行權限
$ chmod +x post-receive
6. /var/www/test.localhost/html 路徑也必須是git權限
# chown git:git -R /var/www/test.localhost/html

最後在本地端測試push後,機器上web服務也馬上更新了,
如果 /var/www/test.localhost/html 上面原本有內容的檔案不會清空,只會被覆蓋

參考資料:
http://sumyblog.me/2015/11/02/use-git-hooks-for-hexo-automatic-deployment/  使用git hooks进行hexo博客自动化部署


2016年5月10日 星期二

Linode CentOS 7主機搭建Cisco AnyConnect VPN

iPhone的shadowsocks在牆外似乎不作用,所以找了一個除了PPTP以外的代理方式

1. 安裝ocserv ( OpenConnect server )

因為ocserv已經在epel 的庫中提供了,可以直接用yum安裝
ocserv.x86_64 : OpenConnect SSL VPN server
直接用yum裝即可
# yum install epel-release (如果你還沒裝epel的話)
# yum install ocserv

2. 準備證書

# cd ~
# mkdir certificates
# cd certificates
在此目錄下新建一個 ca.tmpl的CA證書模版,內容為:
cn = "xx.xx.xx.xx"
organization = "xx.xx.xx.xx"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key

生成CA密鑰
$ certtool --generate-privkey --outfile ca-key.pem
生成CA證書
$ certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
生成伺服器憑證,這裡注意cn項必須對應你伺服器的功能變數名稱或IP,server.tmpl
cn = "Your hostname or IP"
organization = "xx.xx.xx.xx"
expiration_days = 3650
signing_key
encryption_key
tls_www_server

生成密鑰
$ certtool --generate-privkey --outfile server-key.pem
生成server證書
$ certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem
把證書移動到合適的地方
$ cp ca-cert.pem /etc/ocserv
$ cp server-cert.pem /etc/ocserv
$ cp server-key.pem /etc/ocserv

3. 準備配置文件

修改 /etc/ocserv/ocserv.conf
# 登陸方式,目前先用密碼登錄
auth = "plain[/etc/ocserv/ocpasswd]"
 
# 允許同時連接的用戶端數量
max-clients = 4
 
# 限制同一用戶端的並行登陸數量
max-same-clients = 2
 
# 服務監聽的IP(伺服器IP,可不設置)
listen-host = 1.2.3.4
 
# 服務監聽的TCP/UDP埠(選擇你喜歡的數位)
tcp-port = 4433
udp-port = 4434
 
# 自動優化VPN的網路性能
try-mtu-discovery = true
 
# 確保伺服器正確讀取用戶證書(後面會用到用戶證書)
cert-user-oid = 2.5.4.3
 
# 伺服器憑證與金鑰
server-cert = /etc/ssl/private/my-server-cert.pem
server-key = /etc/ssl/private/my-server-key.pem
 
# 用戶端連上vpn後使用的dns
dns = 8.8.8.8
dns = 8.8.4.4
 
# 注釋掉所有的route,讓伺服器成為gateway
#route = 192.168.1.0/255.255.255.0
 
# 啟用cisco用戶端相容性支援
cisco-client-compat = true

這邊要注意tcp-portudp-port不要設9000,以免跟php-fpm的port衝突

4. 測試server

創建測試帳號(test)
$ ocpasswd -c /etc/ocserv/ocpasswd test
Enter password:
Re-enter password:

開啟NAT轉發:(這步我略過,查機器上的設定檔,net.ipv4.ip_forward已開啟)
$ sudo sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
$ sudo sysctl -p

啟動ocserv服務
# ocserv -f -d 1
然後打開手機上的Cisco Anyconnect新建一個VPN,添加服務器:
IP:端口
ex.
xx.xx.xx.xx:4433
連線就能輸入密碼運行

4. 創建客戶端證書,省得老輸入密碼

$ cd ~/certificates/
$ vim user.tmpl
cn = "some random name"
unit = "some random unit"
expiration_days = 365
signing_key
tls_www_client

創建user密鑰
$ certtool --generate-privkey --outfile user-key.pem
創建user證書
$ certtool --generate-certificate --load-privkey user-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template user.tmpl --outfile user-cert.pem
將證書和金鑰轉為PKCS12的格式,好導入Anyconnect,期間會要求你輸入帳號密碼,就輸入用ocpasswd產生的帳號密碼
$ certtool --to-p12 --load-privkey user-key.pem --pkcs-cipher 3des-pkcs12 --load-certificate user-cert.pem --outfile user.p12 --outder
Generating a PKCS #12 structure...
Loading private key list...
Loaded 1 private keys.
Enter a name for the key: test
Enter password:
Confirm password:

然後把user.p12這個證書放到一個可以直接被訪問的地方,用safari打開安裝,導入成功後將對應的VPN => 進階 => 憑證 => 選擇你導入的憑證

為了讓伺服器能夠認得這張證書,我們再來修改一下/etc/ocserv/ocserv.conf配置
$ vim /etc/ocserv/ocserv.conf
# 改為證書登陸,注釋掉原來的登陸模式
auth = "certificate"
 
# 證書認證不支援這個選項,注釋掉這行
#listen-clear-file = /var/run/ocserv-conn.socket
 
# 啟用證書驗證
ca-cert = /etc/ocserv/ca-cert.pem

重啟ocserv
# kill -9 ocserv_pid
# ocserv -f -d 1

使用客戶端證書這方式我只有在公司網路環境才成功走代理,在家裡和3G網路VPN Log只顯示連線成功,但是瀏覽器打開iplocationfinder.com 檢查結果是失敗的 => 查不到原因,所以可能還是改為輸入帳號密碼登入為主  => 20160920已解決

5. 智能分流

因為人在大陸直接全局翻牆會造成大陸國內網站訪問巨慢的問題,所以必須在服務器端設route table推送到客戶端
https://github.com/CNMan/ocserv-cn-no-route
直接將 cn-no-route.txt 之中的 no-route 寫進 /etc/ocserv/ocserv.conf

最後一樣重啟ocserv服務

Windows客戶端下載
https://openconnect.github.io/openconnect-gui/

參考資料:
http://ifreedomlife.com/2015/04/20/Setup-Cisco-AnyConnect-VPN-on-CentOS7/ 在 CentOS 7 上搭建 Cisco AnyConnect VPN
https://www.logcg.com/archives/1343.html  使用ocserv搭建 Cisco Anyconnect 服务器 (主要)