Linux知識(shí)點(diǎn)小結(jié)
1 我的Linux需求
這里討論的是我對(duì)線(xiàn)上的Linux機(jī)器的需求,所以只討論穩(wěn)定發(fā)行版,且是比較保守的版本。比如CentOS 7的xfs不予討論,并不是說(shuō)xfs不好,而是以目前我的Linux水平需要更新很多xfs的知識(shí),駕馭需要時(shí)間。CentOS 7將ifconfig,netstat等原來(lái)常用的命令也干掉了。下面我們以CentOS 6作為基礎(chǔ),談一談我對(duì)Linux的基本需求。
1.1 最小化安裝
CentOS有一個(gè)minimal版本,相對(duì)于標(biāo)準(zhǔn)版去掉了很多Service,比如Network Manger,安裝最小版本以后的網(wǎng)絡(luò)配置是需要admin進(jìn)行全手工配置文件配置的。我個(gè)人認(rèn)為這樣是比較好的,因?yàn)榭梢愿玫睦斫釲inux內(nèi)核是如何看待這些配置文件的,那些是內(nèi)核真正需要的,那些是修改以后可以直接改動(dòng)到內(nèi)核的性能。對(duì)于一些必要的監(jiān)控工具,完全可以通過(guò)yum install來(lái)完成。標(biāo)準(zhǔn)版更加適合平時(shí)的練習(xí),作為線(xiàn)上機(jī)器,還是最小化安裝,做到能不開(kāi)的服務(wù)就不開(kāi),能關(guān)掉的端口就關(guān)掉,這樣既能將寶貴的硬件資源留下來(lái)給應(yīng)用程序,也能夠做到更加的安全,因?yàn)楣舻娜肟诰褪峭ㄟ^(guò)網(wǎng)絡(luò)。
1.2 足夠安全
除了將能關(guān)的端口關(guān)掉,能不用的服務(wù)關(guān)掉以外,安全還需要做到特定的服務(wù)只能訪問(wèn)特定的內(nèi)容。哪怕是root賬戶(hù),不能訪問(wèn)的文件和文件夾還是不能訪問(wèn),更加不能操作。因?yàn)闃O有可能攻擊者獲取到root權(quán)限,這個(gè)時(shí)候就基本是無(wú)所欲為了。開(kāi)啟SELinux以后,能夠做到在不修改SELinux的情況下,指定的服務(wù)只能訪問(wèn)指定的資源。
1.3 資源按需調(diào)度
我們經(jīng)常會(huì)遇到這樣一個(gè)問(wèn)題,假設(shè)將磁盤(pán)sda掛載到/var目錄,但是由于log太多或者上傳的文件等等其他因素將硬盤(pán)吃光了,再創(chuàng)建一塊sdb磁盤(pán)就無(wú)法掛載到/var目錄了,其實(shí)Linux自帶的lvm已經(jīng)解決了這個(gè)問(wèn)題,并且CentOS默認(rèn)就是用lvm來(lái)管理磁盤(pán)的。我們需要學(xué)會(huì)如何格式化一塊硬盤(pán)為lvm,然后掛載到對(duì)應(yīng)目錄,在空間被吃光前能夠添加一塊硬盤(pán)就自動(dòng)擴(kuò)容。
1.4 網(wǎng)絡(luò)監(jiān)控
說(shuō)白了就是在Linux本地利用好iptables,來(lái)規(guī)劃服務(wù)哪些網(wǎng)絡(luò)流量,拋棄哪些網(wǎng)絡(luò)流量。以及在進(jìn)行組網(wǎng)的時(shí)候需要用router來(lái)進(jìn)行網(wǎng)關(guān)的創(chuàng)建,在遇到網(wǎng)絡(luò)問(wèn)題的時(shí)候通過(guò)netstat來(lái)查看網(wǎng)絡(luò)訪問(wèn)異常。網(wǎng)絡(luò)這塊內(nèi)容很多很雜,各種參數(shù),TCP/IP協(xié)議棧等等,但是往往問(wèn)題還就是出在網(wǎng)絡(luò)這塊,所以要給與高度的關(guān)注。
2 Linux的理念與基礎(chǔ)
對(duì)Linux敬仰如滔滔江水^_^,小談幾點(diǎn)我對(duì)Linux的認(rèn)識(shí)。
2.1 Linux的文件系統(tǒng)
Linux將所有的事物都看成文件,這一點(diǎn)人盡皆知。我想說(shuō)的是,除了傳統(tǒng)的ext文件系統(tǒng),Linux在抽象不同的資源的時(shí)候其實(shí)有各種不同的文件系統(tǒng),都是從需求和使用出發(fā),怎么方便怎么來(lái),比如proc文件系統(tǒng)就是針對(duì)進(jìn)程的抽象,使得修改對(duì)應(yīng)進(jìn)程的值就可以直接改變進(jìn)程的行為。再比如,對(duì)于遠(yuǎn)程ssh登錄的pts設(shè)備,Linux有對(duì)應(yīng)的devpts文件系統(tǒng)。
2.2 Linux的權(quán)限管理
Linux的-rwxrwxrwx權(quán)限管理也可謂人盡皆知,其實(shí)Linux自己也意識(shí)到了這樣的權(quán)限管理所帶來(lái)的一些局限性。首先rwx的權(quán)限管理是基于用戶(hù)和組的,并且只是大致的分為owner|group|other這三類(lèi),無(wú)法再作更加細(xì)粒度的劃分。有鑒于此,Linux目前默認(rèn)是有ACL(Access Control List)管理的,所謂ACL就是能夠提供更加細(xì)粒度的用戶(hù)和組管理,比如可以明確哪個(gè)user可以有什么樣的權(quán)限。如下示例
getfacl abc # file: abc # owner: someone # group: someone user::rw- user:johny:r-x group::r-- mask::r-x other::r--
而SELinux提供了不基于用戶(hù)與組的權(quán)限管理,SELinux是基于應(yīng)用程序的,什么樣的應(yīng)用程序可以使用什么資源,對(duì)于這些資源這個(gè)應(yīng)用程序能干嘛,這個(gè)就是SELinux的管理方式。
2.3 Linux上的Service
Linux上的Service組織得非常清晰,當(dāng)然也是傳統(tǒng)所致。/etc/init.d/里面包含了所有的Service啟動(dòng)腳本,對(duì)應(yīng)的二進(jìn)制文件在/usr/bin 、 /usr/sbin 、 /usr/local/bin等目錄下,一般而言配置文件在/etc/app_name下,還有一個(gè)chkconfig的工具來(lái)管理各個(gè)runlevel下需要啟動(dòng)的Service。這樣的約定俗成使得管理員在配置和使用的時(shí)候非常方便。Linux標(biāo)準(zhǔn)的Service都會(huì)將log記錄到/var/log/messages中,使得系統(tǒng)管理員不需要翻閱各種log,直接在/var/log/messages中就可以找到絕大部分的log來(lái)判斷當(dāng)前系統(tǒng)是否正常。更甚的,syslogd被rsyslogd替換以后,可以將/var/log/messages中的內(nèi)容通過(guò)UDP發(fā)送到遠(yuǎn)端用專(zhuān)業(yè)的log分析工具進(jìn)行分析。我們需要學(xué)習(xí)Linux上Service的這些優(yōu)秀的編程習(xí)慣和技巧。
3 磁盤(pán)
根據(jù)$1中的需求,主要是創(chuàng)建Linux下的LVM,以及一些基本的磁盤(pán)操作。
- df -lah 查看磁盤(pán)的使用情況
- fdisk -l 查看插入到磁盤(pán)驅(qū)動(dòng)器中的硬盤(pán); sd(a,b,c)(1,2,3),其中a是第一塊磁盤(pán),b是第二塊磁盤(pán),1,2,3表示磁盤(pán)上的主分區(qū),最多4個(gè)。用fdisk從磁盤(pán)創(chuàng)建分區(qū)并且格式化。
- LVM(logical volume manager),主要就是滿(mǎn)足加硬盤(pán)就能直接寫(xiě)數(shù)據(jù)的功能,而不會(huì)出現(xiàn)磁盤(pán)滿(mǎn)了,然后掛了。lvm有幾個(gè)概念,VG, PV, LVM,將磁盤(pán)lvm格式化,創(chuàng)建PV, 創(chuàng)建VG,將創(chuàng)建的PV加入VG,然后在VG中創(chuàng)建lvm,然后就可以動(dòng)態(tài)增加大小了。注意,將磁盤(pán)格式化為lvm,但是lv的格式化需要用ext,然后才能mount上去。參考這篇文章CentOS 6 卷組掛載硬盤(pán)教程
- mount -t type(ext4|nfs) /dev/sdxn /path/dir 來(lái)掛載。如果要重啟生效,必須將掛載信息寫(xiě)入到/etc/fstab
- 磁盤(pán)IO效率(IOPS)需要用vmstat, top等工具來(lái)查看。
4 網(wǎng)絡(luò)
網(wǎng)絡(luò)的坑很多,需要把網(wǎng)絡(luò)搞通沒(méi)個(gè)3,4年很難。下面從網(wǎng)絡(luò)的基本配置文件著手,簡(jiǎn)單理一下網(wǎng)絡(luò)方面的內(nèi)容。網(wǎng)絡(luò)最難的方面應(yīng)該是如何搭建一個(gè)合理的高效的局域網(wǎng)或者城域網(wǎng),這個(gè)需要有專(zhuān)業(yè)的網(wǎng)絡(luò)知識(shí)。
4.1 配置文件
/etc/hosts私有IP對(duì)應(yīng)主機(jī)名
/etc/resolv.confnameserver DNS的IP
/etc/sysconfig/network其中NETWORKING=要不要有網(wǎng)絡(luò),HOSTNAME=主機(jī)名,NETWORKING_IPV6=支持ipv6否
/etc/sysconfig/network-scripts/ifcfg-xxx其中DEVICE=網(wǎng)卡代號(hào),BOOTPROTO=是否使用dhcp,HWADDR,IPADDR,NETMASK,ONBOOT,GATEWAY
4.2 網(wǎng)絡(luò)設(shè)計(jì)到的一些命令
router -n查看路由的命令,特別是要看帶G的,表示gateway,而帶U的表示up。
netstat -anp查看所有啟動(dòng)的tcp,udp,unix stream的應(yīng)用程序,以及他們的狀態(tài),具體可以參考TCP/IP,JavaSocket簡(jiǎn)單分析一文。
5 安全
5.1 PAM
PAM總體來(lái)講只需要簡(jiǎn)單了解就行,是一個(gè)可插拔的認(rèn)證模塊。按照我的說(shuō)法,是開(kāi)發(fā)Linux的極客們搞出來(lái)的可復(fù)用的一個(gè)組件。舉個(gè)例子,現(xiàn)在有一個(gè)app,想要驗(yàn)證當(dāng)前的登錄用戶(hù)是否有權(quán)限操作某個(gè)目錄,那么在PAM里面有現(xiàn)成的模塊,app只需要include這個(gè)模塊,給出一個(gè)配置文件,就可以了。有一個(gè)非常好的關(guān)于PAM的視頻教程,請(qǐng)看這里
- PAM是應(yīng)用程序用來(lái)進(jìn)行身份驗(yàn)證的。早期的身份驗(yàn)證和應(yīng)用程序本身耦合,后來(lái)把身份驗(yàn)證單獨(dú)抽出來(lái),通過(guò)PAM來(lái)進(jìn)行管理
- /etc/pam.d/xxx 是能用pam來(lái)進(jìn)行管理的應(yīng)用程序PAM設(shè)置,在安裝應(yīng)用程序的時(shí)候安裝。/etc/security/mmm, /lib/security/pam_mmm是一套。
- 總體來(lái)說(shuō)PAM是利用Linux系統(tǒng)本身提供的機(jī)制,來(lái)進(jìn)行驗(yàn)證
5.2 SELinux
關(guān)于SELinux也有一個(gè)非常好的視頻教程,請(qǐng)看這里
- getenforce來(lái)查看SELinux是否被啟用
- /etc/sysconfig/selinux enforcing啟用SELinux
- SELinux對(duì)“運(yùn)行程序”配置和檢查其是否有權(quán)限操作“對(duì)象”(文件系統(tǒng)),而普通的ACL(rwx)就是根據(jù)文件所屬owner及其組來(lái)判斷。SELinux是看bin的type和目錄文件的type是否兼容,來(lái)決定bin是否能操作資源
5.3 防火墻
對(duì)于iptables也是一知半解,所以下面只是學(xué)習(xí)時(shí)候的一些摘錄。特別一點(diǎn),要開(kāi)啟內(nèi)核參數(shù)net.ipv4.ip_forward=1,在/etc/sysctl.conf文件中,用sysctl -p來(lái)保存。所謂ip_forward指的是內(nèi)核提供的從一個(gè)iface到另外一個(gè)iface的IP包轉(zhuǎn)發(fā),比如將IP包從192.168.1.10的eth0轉(zhuǎn)發(fā)到10.0.0.123的eth1上。專(zhuān)業(yè)的防火墻配置是需要專(zhuān)業(yè)技能的。
tcp_wrapper需要libwrap.so的支持,所有凡是ldd出來(lái)沒(méi)有的bin,都不能用tcp_wrapper
iptables是按照規(guī)則進(jìn)行短路判斷的,即 滿(mǎn)足條件1->執(zhí)行action1->結(jié)束
iptables-save來(lái)更加清晰的查看
先刪掉全部規(guī)則,然后添加,比較簡(jiǎn)單。添加的時(shí)候,先添加策略,再添加細(xì)部規(guī)則。一般來(lái)講,我們需要關(guān)注的是filter這個(gè)表的INPUT與OUTPUT
iptables -A(I) INPUT(OUTPUT,FORWARD) -i(o) iface -p tcp(ump,imp,all) -s (!)source -d dest -j ACCEPT(REJECT,DROP), 還支持的參數(shù) —dport —sport
6 工具
一個(gè)好的Linux命令參考網(wǎng)站
6.1 CPU
- top 特別注意load
- ps aux和ps -ef 特別注意進(jìn)程狀態(tài)
- vmstat 1表示每秒采集一次
- sar -u 1 查看所有cpu相關(guān)的運(yùn)行時(shí)間
6.2 Memory
- free
- vmstat 1 注意其中的swap ram block之間的關(guān)系
- sar -r 1 內(nèi)存使用率
- sar -W 1 查看swap,查詢(xún)是否由于內(nèi)存不足產(chǎn)生大量?jī)?nèi)存交換
6.3 IO
- lsof -i:port 查詢(xún)哪個(gè)進(jìn)程占用了這個(gè)端口號(hào)
- lsof -u username 用戶(hù)打開(kāi)的文件
- lsof -p pid 進(jìn)程打開(kāi)的文件
雜項(xiàng)
關(guān)于安裝好系統(tǒng)之后的運(yùn)行腳本,這邊有一個(gè)參考
#!/bin/bash flagFile="/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 65535 EOF echo "ulimit -SH 65535" >> /etc/rc.local } sysctl_config(){ sed -i 's/net.ipv4.tcp_syncookies.*$/net.ipv4.tcp_syncookies = 1/g' /etc/sysctl.conf sed -i 's/net.ipv4.ip_forward.*$/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf cat >> /etc/sysctl.conf <<EOF net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.ip_local_port_range = 1024 65535 EOF sysctl -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-unreachable COMMIT EOF /sbin/service iptables restart source /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=1 cat >> /etc/vsftpd/vsftpd.conf <<EOF # normal user settings local_enable=YES write_enable=YES local_umask=022 chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list local_max_rate=10000000 # anonymous settings anonymous_enable=YES no_anon_password=YES anon_max_rate=1000000 data_connection_timeout=60 idle_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 settings max_clients=50 max_per_ip=5 use_localtime=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd tcp_wrappers=YES #banner_file=/etc/vsftpd/welcome.txt dual_log_enable=YES pasv_min_port=65400 pasv_max_port=65410 EOF 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
以上就是針對(duì)linux知識(shí)點(diǎn)進(jìn)行的詳細(xì)匯總,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
Linux自動(dòng)化構(gòu)建工具make和Makefile詳解
這篇文章主要介紹了Linux如何自動(dòng)化構(gòu)建工具make和makefile,文章中有詳細(xì)的圖片示例,對(duì)學(xué)習(xí)有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2023-04-04如何linux環(huán)境下配置環(huán)境變量過(guò)程圖解
這篇文章主要介紹了如何linux環(huán)境下配置環(huán)境變量過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05在Linux下修改和重置root密碼的方法(超簡(jiǎn)單)
對(duì)于linux新手來(lái)說(shuō),很容易把root的密碼忘記,今天腳本之家小編給大家?guī)?lái)了在Linux下修改和重置root密碼的方法,感興趣的朋友一起看看吧2018-05-05apache中使用mod_log_slow分析響應(yīng)慢的請(qǐng)求
這篇文章主要介紹了apache中使用mod_log_slow分析響應(yīng)慢的請(qǐng)求,使用mod_log_slow可以定位到響應(yīng)慢的PHP代碼位置,需要的朋友可以參考下2014-06-06