Linux知識點小結_Linux

來源:互聯網
上載者:User

1 我的Linux需求

這裡討論的是我對線上的Linux機器的需求,所以只討論穩定發行版,且是比較保守的版本。比如CentOS 7的xfs不予討論,並不是說xfs不好,而是以目前我的Linux水平需要更新很多xfs的知識,駕馭需要時間。CentOS 7將ifconfig,netstat等原來常用的命令也幹掉了。下面我們以CentOS 6作為基礎,談一談我對Linux的基本需求。

1.1 迷你安裝

CentOS有一個minimal版本,相對於標準版去掉了很多Service,比如Network Manger,安裝最小版本以後的網路設定是需要admin進行全手工設定檔配置的。我個人認為這樣是比較好的,因為可以更好的理解Linux核心是如何看待這些設定檔的,那些是核心真正需要的,那些是修改以後可以直接改動到核心的效能。對於一些必要的監控工具,完全可以通過yum install來完成。標準版更加適合平時的練習,作為線上機器,還是迷你安裝,做到能不開的服務就不開,能關掉的連接埠就關掉,這樣既能將寶貴的硬體資源留下來給應用程式,也能夠做到更加的安全,因為攻擊的入口就是通過網路。

1.2 足夠安全

除了將能關的連接埠關掉,能不用的服務關掉以外,安全還需要做到特定的服務只能訪問特定的內容。哪怕是root賬戶,不能訪問的檔案和檔案夾還是不能訪問,更加不能操作。因為極有可能攻擊者擷取到root許可權,這個時候就基本是無所欲為了。開啟SELinux以後,能夠做到在不修改SELinux的情況下,指定的服務只能訪問指定的資源。

1.3 資源按需調度

我們經常會遇到這樣一個問題,假設將磁碟sda掛載到/var目錄,但是由於log太多或者上傳的檔案等等其他因素將硬碟吃光了,再建立一塊sdb磁碟就無法掛載到/var目錄了,其實Linux內建的lvm已經解決了這個問題,並且CentOS預設就是用lvm來管理磁碟的。我們需要學會如何格式化一塊硬碟為lvm,然後掛載到對應目錄,在空間被吃光前能夠添加一塊硬碟就自動擴容。

1.4 網路監控

說白了就是在Linux本地利用好iptables,來規劃服務哪些網路流量,拋棄哪些網路流量。以及在進行組網的時候需要用router來進行網關的建立,在遇到網路問題的時候通過netstat來查看網路訪問異常。網路這塊內容很多很雜,各種參數,TCP/IP協議棧等等,但是往往問題還就是出在網路這塊,所以要給與高度的關注。

2 Linux的理念與基礎

對Linux敬仰如滔滔江水^_^,小談幾點我對Linux的認識。

2.1 Linux的檔案系統

Linux將所有的事物都看成檔案,這一點人盡皆知。我想說的是,除了傳統的ext檔案系統,Linux在抽象不同的資源的時候其實有各種不同的檔案系統,都是從需求和使用出發,怎麼方便怎麼來,比如proc檔案系統就是針對進程的抽象,使得修改對應進程的值就可以直接改變進程的行為。再比如,對於遠程ssh登入的pts裝置,Linux有對應的devpts檔案系統。

2.2 Linux的許可權管理

Linux的-rwxrwxrwx許可權管理也可謂人盡皆知,其實Linux自己也意識到了這樣的許可權管理所帶來的一些局限性。首先rwx的許可權管理是基於使用者和組的,並且只是大致的分為owner|group|other這三類,無法再作更加細粒度的劃分。有鑒於此,Linux目前預設是有ACL(Access Control List)管理的,所謂ACL就是能夠提供更加細粒度的使用者和組管理,比如可以明確哪個user可以有什麼樣的許可權。如下樣本

getfacl abc# file: abc# owner: someone# group: someoneuser::rw-user:johny:r-xgroup::r--mask::r-xother::r--

而SELinux提供了不基於使用者與組的許可權管理,SELinux是基於應用程式的,什麼樣的應用程式可以使用什麼資源,對於這些資源這個應用程式能幹嘛,這個就是SELinux的管理方式。

2.3 Linux上的Service

Linux上的Service組織得非常清晰,當然也是傳統所致。/etc/init.d/裡麵包含了所有的Service啟動指令碼,對應的二進位檔案在/usr/bin 、 /usr/sbin 、 /usr/local/bin等目錄下,一般而言設定檔在/etc/app_name下,還有一個chkconfig的工具來管理各個runlevel下需要啟動的Service。這樣的約定俗成使得管理員在配置和使用的時候非常方便。Linux標準的Service都會將log記錄到/var/log/messages中,使得系統管理員不需要翻閱各種log,直接在/var/log/messages中就可以找到絕大部分的log來判斷當前系統是否正常。更甚的,syslogd被rsyslogd替換以後,可以將/var/log/messages中的內容通過UDP發送到遠端用專業的log分析工具進行分析。我們需要學習Linux上Service的這些優秀的編程習慣和技巧。

3 磁碟

根據$1中的需求,主要是建立Linux下的LVM,以及一些基本的磁碟操作。

  • df -lah 查看磁碟的使用方式
  • fdisk -l 查看插入到磁碟機中的硬碟; sd(a,b,c)(1,2,3),其中a是第一塊磁碟,b是第二塊磁碟,1,2,3表示磁碟上的主要磁碟分割,最多4個。用fdisk從磁碟建立分區並且格式化。
  • LVM(logical volume manager),主要就是滿足加硬碟就能直接寫資料的功能,而不會出現磁碟滿了,然後掛了。lvm有幾個概念,VG, PV, LVM,將磁碟lvm格式化,建立PV, 建立VG,將建立的PV加入VG,然後在VG中建立lvm,然後就可以動態增加大小了。注意,將磁碟格式化為lvm,但是lv的格式化需要用ext,然後才能mount上去。參考這篇文章CentOS 6 卷組掛載硬碟教程
  • mount -t type(ext4|nfs) /dev/sdxn /path/dir 來掛載。如果要重啟生效,必須將掛載資訊寫入到/etc/fstab
  • 磁碟IO效率(IOPS)需要用vmstat, top等工具來查看。

4 網路

網路的坑很多,需要把網路搞通沒個3,4年很難。下面從網路的基本設定檔著手,簡單理一下網路方面的內容。網路最難的方面應該是如何搭建一個合理的高效的區域網路或者城域網,這個需要有專業的網路知識。

4.1 設定檔

/etc/hosts私人IP對應主機名稱
/etc/resolv.confnameserver DNS的IP
/etc/sysconfig/network其中NETWORKING=要不要有網路,HOSTNAME=主機名稱,NETWORKING_IPV6=支援ipv6否
/etc/sysconfig/network-scripts/ifcfg-xxx其中DEVICE=網卡代號,BOOTPROTO=是否使用dhcp,HWADDR,IPADDR,NETMASK,ONBOOT,GATEWAY
4.2 網路設計到的一些命令

router -n查看路由的命令,特別是要看帶G的,表示gateway,而帶U的表示up。
netstat -anp查看所有啟動的tcp,udp,unix stream的應用程式,以及他們的狀態,具體可以參考TCP/IP,JavaSocket簡單分析一文。
5 安全

5.1 PAM

PAM總體來講只需要簡單瞭解就行,是一個可插拔的認證模組。按照我的說法,是開發Linux的極客們搞出來的可複用的一個組件。舉個例子,現在有一個app,想要驗證當前的登入使用者是否有許可權操作某個目錄,那麼在PAM裡面有現成的模組,app只需要include這個模組,給出一個設定檔,就可以了。有一個非常好的關於PAM的視頻教程,請看這裡

  • PAM是應用程式用來進行身分識別驗證的。早期的身分識別驗證和應用程式本身耦合,後來把身分識別驗證單獨抽出來,通過PAM來進行管理
  • /etc/pam.d/xxx 是能用pam來進行管理的應用程式PAM設定,在安裝應用程式的時候安裝。/etc/security/mmm, /lib/security/pam_mmm是一套。
  • 總體來說PAM是利用Linux系統本身提供的機制,來進行驗證

5.2 SELinux

關於SELinux也有一個非常好的視頻教程,請看這裡

  • getenforce來查看SELinux是否被啟用
  • /etc/sysconfig/selinux enforcing啟用SELinux
  • SELinux對“運行程式”配置和檢查其是否有許可權操作“對象”(檔案系統),而普通的ACL(rwx)就是根據檔案所屬owner及其組來判斷。SELinux是看bin的type和目錄檔案的type是否相容,來決定bin是否能操作資源

5.3 防火牆

對於iptables也是一知半解,所以下面只是學習時候的一些摘錄。特別一點,要開啟核心參數net.ipv4.ip_forward=1,在/etc/sysctl.conf檔案中,用sysctl -p來儲存。所謂ip_forward指的是核心提供的從一個iface到另外一個iface的IP包轉寄,比如將IP包從192.168.1.10的eth0轉寄到10.0.0.123的eth1上。專業的防火牆配置是需要專業技能的。

tcp_wrapper需要libwrap.so的支援,所有凡是ldd出來沒有的bin,都不能用tcp_wrapper
iptables是按照規則進行短路判斷的,即 滿足條件1->執行action1->結束
iptables-save來更加清晰的查看
先刪掉全部規則,然後添加,比較簡單。添加的時候,先添加策略,再添加細部規則。一般來講,我們需要關注的是filter這個表的INPUT與OUTPUT
iptables -A(I) INPUT(OUTPUT,FORWARD) -i(o) iface -p tcp(ump,imp,all) -s (!)source -d dest -j ACCEPT(REJECT,DROP), 還支援的參數 —dport —sport
6 工具

一個好的Linux命令參考網站

6.1 CPU

  • top 特別注意load
  • ps aux和ps -ef 特別注意進程狀態
  • vmstat 1表示每秒採集一次
  • sar -u 1 查看所有cpu相關的已耗用時間

6.2 Memory

  • free
  • vmstat 1 注意其中的swap ram block之間的關係
  • sar -r 1 記憶體使用量率
  • sar -W 1 查看swap,查詢是否由於記憶體不足產生大量記憶體交換

6.3 IO

  • lsof -i:port 查詢哪個進程佔用了這個連接埠號碼
  • lsof -u username 使用者開啟的檔案
  • lsof -p pid 進程開啟的檔案

雜項

關於安裝好系統之後的運行指令碼,這邊有一個參考

#!/bin/bashflagFile="/root/centos6-init.executed"precheck(){  if [[ "$(whoami)" != "root" ]]; then  echo "please run this script as root ." >&2  exit 1  fi  if [ -f "$flagFile" ]; then  echo "this script had been executed, please do not execute again!!" >&2  exit 1  fi  echo -e "\033[31m WARNING! THIS SCRIPT WILL \033[0m\n"  echo -e "\033[31m *1 update the system; \033[0m\n"  echo -e "\033[31m *2 setup security permissions; \033[0m\n"  echo -e "\033[31m *3 stop irrelevant services; \033[0m\n"  echo -e "\033[31m *4 reconfig kernel parameters; \033[0m\n"  echo -e "\033[31m *5 setup timezone and sync time periodically; \033[0m\n"  echo -e "\033[31m *6 setup tcp_wrapper and netfilter firewall; \033[0m\n"  echo -e "\033[31m *7 setup vsftpd; \033[0m\n"  sleep 5  }yum_update(){  yum -y update  #update system at 5:40pm daily  echo "40 3 * * * root yum -y update && yum clean packages" >> /etc/crontab}permission_config(){  #chattr +i /etc/shadow  #chattr +i /etc/passwd}selinux(){  sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' /etc/sysconfig/selinux  setenforce 1}stop_services(){  for server in `chkconfig --list |grep 3:on|awk '{print $1}'`  do    chkconfig --level 3 $server off  done     for server in crond network rsyslog sshd iptables  do    chkconfig --level 3 $server on  done}limits_config(){cat >> /etc/security/limits.conf <<EOF* soft nproc 65535* hard nproc 65535* soft nofile 65535* hard nofile 65535EOFecho "ulimit -SH 65535" >> /etc/rc.local}sysctl_config(){sed -i 's/net.ipv4.tcp_syncookies.*$/net.ipv4.tcp_syncookies = 1/g' /etc/sysctl.confsed -i 's/net.ipv4.ip_forward.*$/net.ipv4.ip_forward = 1/g' /etc/sysctl.confcat >> /etc/sysctl.conf <<EOFnet.ipv4.tcp_max_syn_backlog = 65536net.core.netdev_max_backlog = 32768net.core.somaxconn = 32768net.core.wmem_default = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_timestamps = 0net.ipv4.tcp_synack_retries = 2net.ipv4.tcp_syn_retries = 2net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_mem = 94500000 915000000 927000000net.ipv4.tcp_max_orphans = 3276800net.ipv4.ip_local_port_range = 1024 65535EOFsysctl -p}sshd_config(){  if [ ! -f "/root/.ssh/id_rsa.pub" ]; then  ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa  cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys  chmod 600 /root/.ssh/authorized_keys  fi  #sed -i '/^#Port/s/#Port 22/Port 65535/g' /etc/ssh/sshd_config  sed -i '/^#UseDNS/s/#UseDNS no/UseDNS yes/g' /etc/ssh/sshd_config  #sed -i 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config  sed -i 's/#PermitEmptyPasswords yes/PermitEmptyPasswords no/g' /etc/ssh/sshd_config  sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config  /etc/init.d/sshd restart}time_config(){  #timezone  echo "TZ='Asia/Shanghai'; export TZ" >> /etc/profile  # Update time  if [! -f "/usr/sbin/ntpdate"]; then    yum -y install ntpdate  fi    /usr/sbin/ntpdate pool.ntp.org  echo "30 3 * * * root (/usr/sbin/ntpdate pool.ntp.org && /sbin/hwclock -w) &> /dev/null" >> /etc/crontab  /sbin/service crond restart}iptables(){cat > /etc/sysconfig/iptables << EOF# Firewall configuration written by system-config-securitylevel# Manual customization of this file is not recommended.*filter:INPUT DROP [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [0:0]:syn-flood - [0:0]-A INPUT -i lo -j ACCEPT-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT-A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT-A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood-A INPUT -j REJECT --reject-with icmp-host-prohibited-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN-A syn-flood -j REJECT --reject-with icmp-port-unreachableCOMMITEOF/sbin/service iptables restartsource /etc/profile}other(){  # initdefault  sed -i 's/^id:.*$/id:3:initdefault:/' /etc/inittab  /sbin/init q    # PS1  #echo 'PS1="\[\e[32m\][\[\e[35m\]\u\[\e[m\]@\[\e[36m\]\h \[\e[31m\]\w\[\e[32m\]]\[\e[36m\]$\[\e[m\]"' >> /etc/profile     # Wrong password five times locked 180s  sed -i '4a auth    required   pam_tally2.so deny=5 unlock_time=180' /etc/pam.d/system-auth}vsftpd_setup(){  yum -y install vsftpd  mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak  touch /etc/vsftpd/chroot_list  setsebool -P ftp_home_dir=1cat >> /etc/vsftpd/vsftpd.conf <<EOF# normal user settingslocal_enable=YESwrite_enable=YESlocal_umask=022chroot_local_user=YESchroot_list_enable=YESchroot_list_file=/etc/vsftpd/chroot_listlocal_max_rate=10000000# anonymous settingsanonymous_enable=YESno_anon_password=YESanon_max_rate=1000000data_connection_timeout=60idle_session_timeout=600# ssl settings#ssl_enable=YES       #allow_anon_ssl=NO      #force_local_data_ssl=YES  #force_local_logins_ssl=YES #ssl_tlsv1=YES        #ssl_sslv2=NO#ssl_sslv3=NO#rsa_cert_file=/etc/vsftpd/vsftpd.pem # server settingsmax_clients=50max_per_ip=5use_localtime=YESdirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=YESpam_service_name=vsftpdtcp_wrappers=YES#banner_file=/etc/vsftpd/welcome.txtdual_log_enable=YESpasv_min_port=65400pasv_max_port=65410EOF  chkconfig --level 3 vsftpd on  service vsftpd restart} main(){  precheck    printf "\033[32m================%40s================\033[0m\n" "updating the system      "  yum_update  printf "\033[32m================%40s================\033[0m\n" "re-config permission      "  permission_config  printf "\033[32m================%40s================\033[0m\n" "enabling selinux        "  selinux  printf "\033[32m================%40s================\033[0m\n" "stopping irrelevant services  "  stop_services    printf "\033[32m================%40s================\033[0m\n" "/etc/security/limits.config  "  limits_config    printf "\033[32m================%40s================\033[0m\n" "/etc/sysctl.conf        "  sysctl_config  printf "\033[32m================%40s================\033[0m\n" "sshd re-configuring      "  sshd_config    printf "\033[32m================%40s================\033[0m\n" "configuring time        "  time_config    printf "\033[32m================%40s================\033[0m\n" "configuring firewall      "#  iptables    printf "\033[32m================%40s================\033[0m\n" "someother stuff        "  other  printf "\033[32m================%40s================\033[0m\n" "done! rebooting        "  touch "$flagFile"  sleep 5  reboot}main

以上就是針對linux知識點進行的詳細匯總,希望對大家的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.