Linux知识点⼩结
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: someone
user::rw-
user:johny:r-x
group::r--
mask::r-x
other::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对应主机名
/fnameserver 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,
在/f⽂件中,⽤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/bash
flagFile="/uted"
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
周记500字}
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/f <<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/p_syncookies.*$/p_syncookies = 1/g' /f
sed -i 's/net.ipv4.ip_forward.*$/net.ipv4.ip_forward = 1/g' /f
cat >> /f <<EOF
p_max_syn_backlog = 65536
p_timestamps = 0
p_synack_retries = 2
p_syn_retries = 2
p_tw_recycle = 1
p_tw_reuse = 1
p_mem = 94500000 915000000 927000000
p_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/p.org
echo "30 3 * * * root (/usr/sbin/p.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/f /etc/f.bak
touch /etc/vsftpd/chroot_list
setsebool -P ftp_home_dir=1
cat >> /etc/f <<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
发布评论