我的Linux運維筆記
最近幫實驗室裝了兩臺伺服器,計算用的伺服器放在內網,通過一臺堡壘機與外界相連。碰到很多小問題,在這裡記錄一下。
組建內網
這一部分沒有太多好說的,堡壘機需要有兩塊網絡卡,一塊對外一塊對內,內網伺服器一塊就夠了。組網的時候根據情況可以手工指定IP也可以DHCP。如果內網只有一臺機器的話可以找一根網線直連兩臺機器,如果機器多的話還是買個路由器吧,最好找高階一點的,可定製的功能多一點,否則會很坑。
埠轉發
從外面訪問內網伺服器的時候有三種方法:
- 最簡單的辦法是先ssh到堡壘機,再ssh到內網的伺服器。這樣做的問題是需要同時在堡壘機和內網伺服器上建立賬號,而有的時候我們並不希望使用者訪問堡壘機,堡壘機對使用者應該是透明的。
- 第二種辦法是ssh隧道,我們可以通過堡壘機建立隧道,把外面的請求轉發到內網。但建立隧道本身也比較麻煩。這篇部落格對於ssh隧道講得非常清楚。
- 最方便解決辦法就是埠轉發:將堡壘機上的埠與內網伺服器需要訪問的埠建立對映關係,例如將堡壘機的1234埠對映到內網伺服器的22埠,這時
ssh -p 1234 <bastion server IP>
實際登入到的就是內網伺服器。埠轉發的本質是把堡壘機當成了路由器。這篇部落格對於埠對映講得非常清楚。
時間校準
一個與世隔絕的伺服器時間往往不準,有時候是設定問題,有時候是BIOS上的時鐘本來就不準。想要校準的話,最方便的當然是手工設定,但這樣無法保證精度,而且過一段時間可能又會產生偏差。比較好的辦法是用NTP線上校準時間,但是內網無法訪問公共NTP伺服器。這時可以把堡壘機配置成一個NTP server,然後讓內網的伺服器都跟堡壘機校準。
當然我們也可以給內網伺服器指定一個閘道器(堡壘機),然後開啟堡壘機的轉發功能,這樣內網伺服器就可以直接上網了。但有時候我們並不想這麼做。
使用者管理
使用者管理涉及到批量新增/刪除使用者,使用者分組,許可權控制,磁碟限額,限時登入等等。
批量新增/刪除使用者
下面是我寫的一個小指令碼,需要讀取一個記載了使用者名稱和登入密碼的文字檔案,然後依次建立每一個使用者。
#!/bin/bash
filename=$1
cat $filename | while read line
do
# cut string
arr=($line)
username=${arr[0]}
password=${arr[1]}
# add user
useradd -g student -p `openssl passwd -crypt $password` $username
chmod 700 /home/${username}
# copy certain files to setup develop environment
cp -r -f /home/vasys/home/students/example/* /home/${username}/
cp -f /home/vasys/.bashrc /home/${username}/
# change owner
chown -R ${username}:student /home/${username}
# disk quota
xfs_quota -x -c "limit bsoft=40G bhard=50G ${username}" /home
done
需要注意,通過useradd
的-p
引數指定密碼時候一定要給出crypt加密後的密碼,不是原始密碼。在CentOS 7上,crypt加密後的密碼可以由openssl passwd -crypt $password
生成,$password
代表原始密碼。mkpasswd
這個命令似乎也可以。
限制使用者磁碟空間
在前面的腳本里也看到了,可以通過quota
命令限制每個使用者(或每個使用者組)使用的磁碟空間。但如果你的檔案系統是xfs,就需要用xfs_quota
。為了支援磁碟限額,首先核心要足夠新(Linux 2.4以上),其次分割槽掛載的時候需要加上usrquota
和grpquota
兩個引數(在/etc/fstab
裡)。
限制使用者登入時間
我們的伺服器是教學用的,學生可以通過預約獲得使用許可權。我們需要控制學生只能在預約的時間段登入,這個時間段之外,不僅不能登入,如果有這個使用者的程序還要殺掉。限制使用者登入時間有很多辦法,例如寫一個crontab,預約時間結束就用passwd
或者usermod
把使用者賬戶置為鎖定狀態,到下一次預約時間再解鎖。但這樣相當於一次預約要寫兩行crontab,對於我這種懶人很不友好。
我選擇的辦法是用PAM裡的時間模組,這種辦法首先要編輯/etc/security/time.conf
,在裡面寫入允許(或禁止)使用者登入的時間,然後再編輯/etc/pam.d/login
在auth
條目後加入account required pam_time.so
。這種辦法有一個侷限,只能指定周幾,不能指定具體的日期。不過我們的預約正好也是以周為單位,所以無所謂了。
殺死某個使用者的所有程序
有兩個方便的命令killall
和pkill
。當然也可以用ps
、grep
、kill
等命令組合起來,實現更復雜的功能。