星期五, 11月 07, 2014

inotify (檔案變更監視) 以及 autossh reverse tunnel (ssh 逆向通道)

最近需要管理一台會到處"漂"的電腦,它有網路(衛星的哩)、有電源還有冷氣可吹,高級的很。
缺點就是衛星網路很慢,所以如果想要遠端去管理,最佳方案是文字介面,因為它在防火牆內(雖說如果需要,也能拿到實體ip),不過它也沒什麼服務,還是放防火牆內安心些。
所以,ssh 逆向通道就很方便啦,反正電腦隨時保持一條管道讓我可以ssh進去就好。方法也實在簡單。不過有幾個重點應該要注意。
第一,網路會斷,斷了是沒關係,但是連線後要能再連回來,所以autossh可以代勞這個事。
第二,那台電腦會每天重開機,重開機之後要能自動連線回來。這個我不知道是什麼原因,猜想是因為重開機或重啟SSH reverse tunnel時,因為被連端的電腦的port還來不及關閉,新的連線需求就又來了,導致電腦回應說我的port已經在使用中了,所以無法建立連線。由於知識不足,所以想了另一個方法,就是我每次要建tunnel時,就把port加1。當這個port加到一個值時,就再來新的一輪。例如讓port從2220開始,每執行一次就讓port+1,直到port 到2230之後,就再讓port從2220開始。
#!/bin/bash
killall -9 autossh
sleep 10
rportf="/home/user/bin/rport"
RPORT=$(/bin/cat $rportf)
RPORT=$(/usr/bin/expr $RPORT + 1)
echo $RPORT
if [ $RPORT -gt 2230 ]; then
  RPORT=2220
fi
/bin/echo $RPORT > $rportf
SSH_OPTIONS="-i /home/user/.ssh/id_rsa"
# Always assume initial connection will be successful
export AUTOSSH_GATETIME=0
# Disable echo service, relying on SSH exiting itself
export AUTOSSH_PORT=0
autossh -f -- $SSH_OPTIONS -o 'ControlPath none' -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -R $RPORT:localhost:22 serverUserName@serverIP -N
監視一個檔案,如果它有變動,就...
因為那台再外面"漂"的電腦,順利的話會定時傳東西回來。
所以,如果有東西回來時,我要把它放在一個地方昭告大家…
lsyncd是不錯的選擇,不過我想試點不同的,如inotify或是fanotify之類的。
不過好像centos6.5的kernel 還不支援fanotify ,而且查到的討論很少。
所以還是用inotify,不過殘念的是inotify的計畫已經停止了…所以將來還是得回歸到fanotify吧(?)
inotify 預設沒有安裝,套件庫也沒有,要先裝epel,假設你有epel套件庫,那就
yum install incron
即安裝完成。
設定開機啟動 chkconfig incrond on
用法很像crontab,就輸入下面的指令
incrontab -e
如果不給用,出現 user 'xxx' is not allowed to use incron 那就編輯 /etc/incron.allow (如果不存在,就新增一個)
把要用incrontab 的使用者加進去即可,例如:
vi /etc/incron.allow
xxx
yyy
好了之後,再重新
incrontab -e
#分三個部份:
#要監視的檔案/資料夾 事件 要執行的指令
/home/cmd/or1/ IN_MODIFY /bin/cp $@/latestmidas.json /var/www/html/nrtfcst/
#上面會去監視/home/cmd/or1資料夾, 如果有變更(IN_MODIFY),就把裏面的latestmidas.json這個檔案cp到 /var/www/html/nrtfcst中。
#其實我只想監視一個檔案,但是如果我只設定一個檔案,它只有第一次的更動會複製,接下來就沒反應了。
#原因是它是針對檔案的代碼,但是這個檔案一有變動,代碼如果也根著變,它的監視行動就取消了(因為對像(代碼)不見了),但是如果是監視資料夾就沒這個問題,只是這個資料夾有任何變動,我都會把我原來只想監視的檔案複製一份到別的地方。(還好,反正這個資料夾也就一個檔案)。

星期三, 9月 24, 2014

lsyncd 安裝 + 免密碼登入ssh

yum install rsync xinedtd
vi /etc/xinetd.d/rsync
disable = yes 改成
disable = no
/sbin/service xinetd start
chkconfig xinetd on

安裝epel
wget http://mirror01.idc.hinet.net/EPEL/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
安裝 lsyncd
yum install lsyncd
設定 epel
vi /etc/lsyncd.conf
加入下述內容
# 不知道怎麼回事,在使用者模式下命令是正常,但是放在服務下就失敗
# 一直是ssh permission的問題,試了半天,重點是rsh時要指定使用者(-l), 及其 private key (-i)
settings{
    statusFile = "/var/run/lsyncd.status",
    logfile = "/var/log/lsyncd.log",
    nodaemon = false,
--    insist = true,
    log = all
}
sync{
    default.rsync,
    source="/home/cmd/disk1/send2ntu",
    target="192.168.4.11:./or1/",
    rsync={
       binary = "/usr/bin/rsync",
       rsh = "/usr/bin/ssh -i /home/cmd/.ssh/id_rsa -l cmd -o StrictHostKeyChecking=no",
       compress = true,
       sparse = true,
       update = true,
       links = true,
       times = true
    },
    delay = 10
}
# 完成之後存檔,/sbin/service lsyncd restart 即可啟動。 
# 測試正常之後即可設定開機啟動 chkconfig lsyncd on
# selinux issue:
# 很煩,弄了很久,一直有如下的錯諤訊息
#rsync: Failed to exec sudo: Permission denied (13)
#rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6]
#rsync: connection unexpectedly closed (0 bytes received so far) [sender]
#rsync error: error in IPC code (code 14) at io.c(600) [sender=3.0.6]
#測試了老半天之後,想到 selinux 定理:就是查不出原因的錯誤,而且打指令可以執行,放到服務裏就不行
#那九成是selinux出包,用如下指令暫時關掉 selinux
# echo 0 > /selinux/enforce 
# 再重新啟動 lsyncd 竟然正常,那就就定selinux 得設定
# 這裏講一下新工具,allow2audit,它可以分析autit.log檔,並且幫忙產生設定檔,用就是了!!
# 執行下面的指令,把audit.log裏關於AVC與rsync的問題丟給audit2allow 處理,
cat /var/log/audit/audit.log | grep AVC | grep rsync | audit2allow -M  rsyncissue
#******************** IMPORTANT ***********************
#To make this policy package active, execute:
#
#semodule -i rsyncissue.pp
#寫會產生rsyncissue.pp 與 rsyncissue.te 二個檔案,後面那個可以看看,前可那個是二進位檔,用下面的指令設定
semodule -i rsyncissue.pp
#就幫你把問題解決了!!!!
#不過有時候上面的二個步驟要多做幾次才行,因為你知道的,selinux就是那麼複雜。
安裝allow2audit
它是一個關於selinux policy管理的套件組中的一個程式
如果用yum知道哪個套件組有它?請用下面的指令
yum provides */allow2audit
免密碼登入ssh主機
ssh-keygen -t rsa -C "mdchiou@ntu.edu.tw"
#輸入上述指令後,下面三個問題都直接enter即可
Generating public/private rsa key pair.
Enter file in which to save the key (/home/or1/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/or1/.ssh/id_rsa.
Your public key has been saved in /home/or1/.ssh/id_rsa.pub.
#至此即產生完金鑰與私鑰,再透過下面的指令把私鑰上傳至欲登入的主機
ssh-copy-id user@IP
#就這樣,超方便der
安裝samba
yum install samba.x86_64
pdbedit -a user1 # linux已經存在的帳號如or1...
#修改iptables 開放 139 445
#修改selinux 權限開放家目錄
setsebool -P samba_enable_home_dirs on

星期一, 4月 14, 2014

selinux httpd 資料夾權限設定

由於伺服器的硬碟只有200g,所以另外接了一個硬碟櫃,並掛在/disk1 下面 想當然爾,希望把web的幾個服務搬到/disk1下面,然後不意外的selinux肯定會擋 以前都是只好關掉selinux,可是畢竟不是辦法,所以上網查了一下,做法,看起來也不是太難 例如我想放在/disk1/www/html 下
#首先在 /etc/httpd/conf.d/ 下新增一個 mysite.conf 內容如下:
Alias /mysite/ "/disk1/www/html/mysite/"

  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all

#然後
chcon -R -t httpd_sys_content_t /disk1/www/html 
/sbin/service httpd restart
#應該就要好了 #結果試了老半天都不行,都403的權限問題 #上網查了老半天,資料夾的範例都是要你放/var/www 或是/home/user 下面 #啊就硬碟容量不夠,所以不是我要的解法方法 #想來想去,看一下/home /var /disk1 三者的selinux權限哪裏不同好了:
ls -Z /
drwxr-xr-x. root root system_u:object_r:file_t:s0      disk1
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
drwxr-xr-x. root root system_u:object_r:var_t:s0       var
#嗯,的確不同,然後想到要讓httpd可以讀 /home 的資料夾是需要設定的,指令如下:
setsebool -P httpd_enable_homedirs=on
#這樣一來,應該可以讀/home 的資料夾,(但是應該不是/home 下的全部資料,裏面要開放的資料夾還必需要是httpd_sys_content_t 才行)
#那我們把disk1也改成 home_root_t是否就可以了?
chcon -t httpd_sys_content_t /disk1
#注意,不需要加上-R ,因為只要/disk1 是 home_root_t 即可,/disk1 下的www 才需要 httpd_sys_content_t
#本來是打指令啦,不過其實建議用視窗來勾選…比較不會出錯,

system-config-selinux
#如果沒有安裝,請裝上這個就可以了
yum install ploicycoreutils-gui

星期一, 3月 24, 2014

ownCloud 安裝

#用編譯好的套件安裝
cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-6/isv:ownCloud:community.repo
yum install owncloud
#正常情況下安裝好後會在/var/www/html 下建立 owncloud 資料夾
#也會在/etc/httpd/conf.d 下多出這個檔案 owncloud.conf
#重啟httpd 與 mysql
/sbin/service httpd restart
/sbin/service mysql restart

設定MariaDB,這步要先做,主要是在MariaDB中把資料庫及使用者建好
mysql -uroot -p
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS owncloud;
GRANT ALL PRIVILEGES ON owncloud.* TO 'username'@'localhost' IDENTIFIED BY 'password';
quit
#建好之後就可以連上 http://server.ip/owncloud/
#第一次連要設定一個管理者的帳密,重點是要選擇進階選項
#進階選項中可以選用mysql(所以mariadb一定要和mysql完全相容),然後填入上面建的資料庫名稱及使用者帳密
#如果手殘忘了選怎麼辦…
#那就殺掉這個檔案 /var/www/html/owncloud/config.php 
#這個檔案是初始化之後建的,而下面的ssl設定要更動這個檔案,所以有先後順序。
設定使用 https
yum install mod_ssl
mkdir /etc/httpd/ssl
openssl genrsa -des3 -out owncloud.key 4096
openssl req -new -key owncloud.key -out owncloud.csr
openssl x509 -req -days 3650 -in owncloud.csr -signkey owncloud.key -out owncloud.crt
openssl rsa -in owncloud.key -out owncloud.key.insecure 
mv owncloud.key owncloud.secure # 不知道這個檔案做什麼用
mv owncloud.insecure owncloud.key 

mv owncloud.key /etc/pki/tls/private
cp owncloud.crt /etc/pki/tls/certs

#修改 /etc/httpd/conf.d/owncloud.conf

DocumentRoot /var/www/html
SSLEngine On
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCertificateFile /etc/pki/tls/certs/owncloud.crt
SSLCertificateKeyFile /etc/pki/tls/private/owncloud.key
#修改 /var/www/html/owncloud/config.php
#加上 'forcessl' => true,

#重啟服務
/sbin/service httpd restart
#如果錯誤訊息說找不到 owncloud.key 而它確實存在
#就是selinux 的問題,用 ls -Z 看owncloud.key 的屬性和其他檔案是否不同,
#是的話用chcon 改回來即可。

星期一, 3月 17, 2014

samba selinux

新的samba 伺服務設定愈來愈簡單了
什麼都不太需要做就能完成
如果還有問題,就是防火牆沒開 139 與 445
然後,輸入密碼、也能登入,就是進不去資料夾…明明權限都有
搞了半天,是selinux的權限問題,這個仔細看smb.conf裏其實有提到
os:寫英文的誰會看那麼仔細啦!!
家目錄相關的權限設定如下
# If you want to share home directories via samba please run: 
# setsebool -P samba_enable_home_dirs on 

自己在家以外的地方建資料夾,然後要開共享資料夾的權限則設定如下:
# If you create a new directory you want to share you should mark it as 
# "samba-share_t" so that selinux will let you write into it. 
# Make sure not to do that on system directories as they may already have 
# been marked with othe SELinux labels. 
# 
# Use ls -ldZ /path to see which context a directory has 
# 
# Set labels only on directories you created! 
# To set a label use the following: chcon -t samba_share_t /path 

如果是要分享系統資料夾,方法如下(基本上不會用到這個吧):
# 
# If you need to share a system created directory you can use one of the 
# following (read-only/read-write): 
# setsebool -P samba_export_all_ro on 
# or 
# setsebool -P samba_export_all_rw on 
# 
# If you want to run scripts (preexec/root prexec/print command/...) please 
# put them into the /var/lib/samba/scripts directory so that smbd will be 
# allowed to run them. 
# Make sure you COPY them and not MOVE them so that the right SELinux context 
# is applied, to check all is ok use restorecon -R -v /var/lib/samba/scripts 
關於使用者,現在都改用 pdbedit 啦,

星期日, 3月 16, 2014

編譯gmt5

終於,只能裝GMT5了,新版的建議用 yum 安裝,但習慣自己編譯,所以
先裝必要套件,這類套件在 epel 裏都有,要先裝epel
yum install cmake28 netcdf-devel gdal-devel
註:不知道我在堅持什麼,gmt5也在裏面,怎不直接就裝了…
svn checkout svn://gmtserver.soest.hawaii.edu/gmt5/trunk gmt5-dev
下載岸線 gshhg-gmt-2.3.2.tar.gz 放在gmt5-dev裏
tar zxvf gshhg-gmt-2.3.2.tar.gz 會得到gshhg-gmt-2.3.2資料夾,這個路徑要設定在下面中
注意版本也許有更新。
下載 dcw-gmt-1.1.1.tar.gz,並tar zxvf dcw-gmt-1.1.1.tar.gz
#複製 cmake/ConfigUserTemplate.cmake 檔案一份成為 cmake/ConfigUser.cmake
cd cmake
cp ConfigUserTemplate.cmake ConfigUser.cmake
#編輯 cmake/ConfigUser.cmake
vi ConfigUser.cmake
set (CMAKE_INSTALL_PREFIX "/usr/local/gmt5/")
set (NETCDF_ROOT "/usr/bin")  
set (GSHHG_ROOT "/home/cmd/gmt5-dev/gshhg-gmt-2.3.2") 
set (COPY_GSHHG TRUE)
set (DCW_ROOT "/home/cmd/gmt5-dev/dcw-gmt-1.1.1")
set (COPY_DCW TRUE)

# 因為我有自己編譯netcdf,seadas也有自行編譯的一份,而我們還用yum裝了一份
# 想想還是用系統裝的,所以這裏要設定好要用哪一個版本
# 注意1 ConfigUserTemplate.cmake 一定要複製一份成為ConfigUser.cmake,改變才有效
# 注意2 我習慣更動ConfigUser.cmake後會把build裏的東西清空再重做cmake28 ..
cd gmt5-dev
mkdir build
cd build
cmake28 ..
#注意看看是否下列都有出現(節錄,不是整段一樣)
#-- Found DCW: /home/cmd/gmt5-dev/dcw-gmt-1.1.1  
#*  Found GSHHG database       : /home/cmd/gmt5-dev/gshhg-gmt-2.3.0 (2.3.0)
#*  NetCDF library             : /usr/lib64/libnetcdf.so
#*  NetCDF include dir         : /usr/include

make
make install # make install 注意CMAKE_INSTALL_PREFIX 的路徑是否有權限,不然就用root執行

星期四, 3月 13, 2014

安裝Seadas7.02 on CentOS6.5

export OCSSWROOT=/opt/seadas-7.0.2/ocssw
export OCSSW_DEBUG=0               # set to 1 for debugging

vi $OCSSWROOT/OCSSW_bash.env
#export FC=${FC:=gfortran} 改成
export FC=${FC:=ifort}

source $OCSSWROOT/OCSSW_bash.env

cd $OCSSWROOT/build/lib3/src
然後會有一堆問題:權限問題…sqlite3問題…
這些主要都是權限問題,解法方法是弄一個seadas群組,讓要用的人都在那個群組中。
權限問題完之後就是這個問題:
-E- /home/swdev/ocssw/build/src/l2gen/xcal.c line 75: SDstart(/opt/seadas-7.0.2/ocssw/run/var/modisa/xcal/OPER/xcal_modisa_axc26e_412.hdf, 1) failed.
如果
ls /opt/seadas-7.0.2/ocssw/run/var/modisa/xcal/OPER/ 
xcal_modisa_axc26f_412.hdf
#這個問題是程式要用axc26e,但是資料夾裏的是axc26f,解決方法是執行下面的指令
$OCSSWROOT/run/scripts/update_luts.py aqua

星期日, 2月 16, 2014

iptables 內部機器連上內部網站

之前幫實驗室把一台不用舊linux機器拿來當防火牆用
反正內部也沒幾個人,所以只用幾個簡單的指令,主要目的就讓大家共用一個ip上網
後來放外部的一個網站伺服器沒什麼人管,被要求也要納路內網說是比較安並
然後…就發現只要外部ip的人可以連上該伺服器,內網的人反而不行…
找了一下解決方法,搞不太定(因為iptables根本不會,都是網路上查來的)
只好先請大家在自己電腦上的hosts把那個網站的域名的ip直接設成該伺服器的內部ip
最近,查了一下問題原因及解決方法,細節就不多講了,我也是外行,反正適合我們這種只有分內網與外網的簡單的防火牆(二張網卡)就是了。
#防火牆ip
EXTIP=140.11x.xx.xxx
#內部ip
innet=192.168.69.0/24
#網站伺服器ip(當然是在內網中)是 192.168.69.138
#這二行都要有才行
/sbin/iptables -t nat -A PREROUTING -d $EXTIP -p tcp --dport 80 -j DNAT --to 192.168.69.138
/sbin/iptables -t nat -A POSTROUTING -s $innet -d 192.168.69.138 -p tcp --dport 80 -j MASQUERADE

#很怪的是,我本來是透過下面這一行,做到上面那二行的第一行的功能,但是這樣子沒辦法和上面的第二行搭配…
/sbin/iptables -t nat -A PREROUTING -i $EXTIF -p tcp --dport 80 -j DNAT --to 192.168.69.138