109、printf
功能:格式化打印数据。默认打印字符串不换行。 格式:printf format[arguments] 常用选项: format: %.ns 输出字符串,n是输出几个字符 %ni 输出整数,n是输出几个数字 %m.nf 输出浮点数,m是输出的整数位数,n是输出的小数位数 %x 不带正负号的十六进制值,使用a至f表示10至15 %X 不带正负号的十六进制,使用A至F表示10至15 %% 输出单个% 一些常用的空白符: n 换行 r 回车 t 水平制表符 对齐方式: %-5s 对参数每个字段左对齐,宽度为5 %-4.2f 左对齐,宽度为4,保留两位小数 不加横线"-"表示右对齐。
示例:
代码语言:javascript复制输出一个字符:
# printf "%.1s" abc
a
保留一个小数点:
# printf "%.1f" 1.333
1.3
输出换行:
# printf "%.1fn" 1.333
1.3
格式化输出:
# printf "user: %stpass: %dn" abc 123
user: abc pass: 1
左对齐宽度10:
# printf "%-10s %-10s %-10sn" ID Name Number
ID Name Number
右对齐宽度10:
# printf "s s sn" ID Name Number
ID Name Number
每段对齐:
# printf "sn" ID Name Number
ID
Name
Number
# printf "%-10sn" ID Name Number
ID
Name
Number
110、cat
功能:连接文件和标准输出打印 常用选项: -A 查看所有内容 -b 显示非空行行号 -n 显示所有行行号 -T 显示tab,用^I表示 -E 显示以$结尾
示例:
代码语言:javascript复制连接两个文件:
# cat a b
# cat << EOF
> 123
> abc
> EOF
123
abc
将eof标准输入作为cat标准输出再写到a.txt:
# cat > a.txt << eof
> 123
> abc
> eof
111 、rename
功能:重命名文件,支持通配符
常用选项:
示例:批量命名文件
代码语言:javascript复制将foo1-foo9替换为foo01-foo09:
# rename foo foo0 foo?
将以.htm后缀的文件替换为.html:
# rename .htm .html *.htm
112 dirname
功能:去除路径的最后一个名字
常用选项:
示例:
代码语言:javascript复制# dirname /usr/bin/
/usr
# dirname dir1/str
dir1
dir2
# dirname stdio.h
113、basename
功能:打印路径的最后一个名字
常用选项:
-a 支持多个参数
-s 删除后面的后缀
示例:
代码语言:javascript复制# basename /usr/bin/sort
sort
# basename include/stdio.h .h
stdio
# basename -s .h include/stdio.h
stdio
# basename -a any/str1 any/str2
str1
str2
114、stat
功能:显示文件或文件系统状态
常用选项:
-Z 显示selinux安全上下文
-f 显示文件系统状态
-c 指定格式输出内容
-t 以简洁的形式打印
示例:
代码语言:javascript复制显示文件信息:
# stat file
只显示文件修改时间:
# stat -c %y file
115、join
功能:连接两个文件
常用选项:
-a <1或2> 除显示原来输出的内容外,还显示指定文件中没有相同的栏位,默认不显示
-i 忽略大小写
-o 按照指定文件栏位显示
-t 使用字符作为输入和输出字段分隔符
-1 连接文件1的指定栏位
-2 连接文件2的指定栏位
示例:
代码语言:javascript复制将两个文件相同字段合并一行,其余不输出:
# join file1 file2
打印file1第一个列,第file2第二列:
# join -o 1.1 2.2 file1 file2
同时打印file1没有的相同字段:
# join -a1 file1 file2
116、 paste
功能:合并文件
常用选项:
-d 指定分隔符,默认是tab键
-s 将文件内容平行,tab键分隔
示例:
代码语言:javascript复制两个文件合并,以tab键分隔:
# paste a.txt b.txt
两个文件合并, 号分隔:
# paste a.txt b.txt -s -d " "
文件内容平行显示,tab键分隔:
# paste -s a.txt
117、nl
功能:打印文件行号
常用选项:
-b <a|t> 指定行号显示方式,a表示所有行都打印行号,b表示空行不显示行号,默认是a
-n <ln|rn|rz> 行号显示方法,ln左对齐,rn右对齐,rz右边显示,左边空白用0填充。
-w 行号栏位在左边占用的宽度
示例:
代码语言:javascript复制打印行号,空行不显示:
# nl a.txt
左对齐打印行号:
# nl -n ln a.txt
行号右移动五个空格:
# nl -w 5 a.txt
118、 date
功能:打印或设置系统日期和时间
常用选项:
-d string 显示时间所描述的字符串
-f datefile 读取文件的每一行
-I 输出ISO 8601格式的日期和时间
-r 显示文件的最后修改时间
-R 输出RFC 2822格式的日期和时间
-s string 设置时间所描述的字符串
-u 打印或设置UTC时间
控制输出格式:
%n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区 %a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期与时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以Sunday为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以Monday为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)
示例:
代码语言:javascript复制设置系统日期和时间:
# date -s "2016-12-15 00:00:00"
查看当前系统时间戳:
# date %s
查看当前系统时间:
# date '%F %T'
把日期和时间转换成时间戳:
# date -d "2016-12-15 18:00:00" %s
把时间戳转成时间:
# date -d '@1481842800' ' %F %T'
时间加减:
显示前一分钟:date -d '-1 minute' '%F %T'
显示上一周:date -d '-1 week' '%F %T'
显示前一天日期:date %F -d ' 1 day'
显示后一天日期:date %F -d '-1 day'
显示上一个月日期:date %F -d ' 1 month'
显示下一个月日期:date %F -d '-1 month'
显示上一年日期:date %F -d ' 1 year'
显示下一年日期:date %F -d '-1 year'
或
显示前一天日期:date -d yesterday %F
显示后一天日期:date -d tomorrow %F
天为单位,显示前一天现在时间:date -d '1 day ago' '%F %T'
秒为单位,显示一小时前现在时间:date -d '3600 second ago' '%F %T'
时间比较:
NOW_DATE=$(date '%F %T')
AGO_DATE=$(date -d "2016-12-15 18:00:00" %s)
[ $NOW_DATE -gt $AGO_DATE ] && echo yes || echo no
119、wget
功能:非交互式网络下载,类似于HTTP客户端
常用选项:
-b, --background 后台运行
日志记录和输入文件:
-o, --output-file=FILE 日志写到文件
-a, --append-output=FILE 日志追加到文件
-d, --debug 打印debug信息,会包含头信息
-q, --quiet 退出,不输出
-i, --input-file=FILE 从文件中读取URL下载
下载选项:
-t, --tries=NUMBER 设置链接重试次数
-O, --output-document=FILE 写入内容到文件
-nc, --no-clobber 跳过下载现有的文件
-c, --continue 断点续传
--progress=TYPE 设置进度条(dot和bar)
-S, --server-response 打印服务器响应头信息
--spider 不下载任何内容
-T, --timeout=SECONDS 设置相应超时时间(还有--dns-timeout、--connect-timeout和--read-timeout)
-w, --wait=SECONDS 两次重试间隔等待时间
--bind-address=ADDRESS 设置绑定地址
--limit-rate=RATE 限制下载速度
--user=USER 设置ftp和http用户名
--password=PASS 设置ftp和http密码
目录:
-P, --directory-prefix=PREFIX 保存文件目录
HTTP选项:
--http-user=USER 设置http用户名
--http-password=PASS 设置http密码
--proxy-user=USER 设置代理用户名
--proxy-password=PASS 设置代理密码
--referer=URL 设置Referer
--save-headers 保存头到文件
--default-page=NAME 改变默认页面名字,默认index.html
-U,--user-agent=AGENT 设置客户端信息
--no-http-keep-alive 禁用HTTP keep-alive(长连接)
--load-cookies=FILE 从文件加载cookies
--save-cookies=FILE 保存cookies到文件
--post-data=STRING 使用POST方法,发送数据
FTP选项:
--ftp-user=USER 设置ftp用户名
--ftp-password=PASS 设置ftp密码
--no-passive-ftp 禁用被动传输模式
递归下载:
-r, --recursive 指定递归下载
-l, --level=NUMBER 最大递归深度
-A, --accept=LIST 逗号分隔下载的扩展列表
-R, --reject=LIST 逗号分隔不被下载的扩展列表
-D, --domains=LIST 逗号分隔被下载域的列表
--exclude-domains=LIST 排除不被下载域的列表
示例:
代码语言:javascript复制下载单个文件到当前目录:
# wget http://nginx.org/download/nginx-1.11.7.tar.gz
放到后台下载:
# wget -b http://nginx.org/download/nginx-1.11.7.tar.gz
对于网络不稳定的用户使用-c和--tries参数,保证下载完成,并下载到指定目录:
# wget -t 3 -c http://nginx.org/download/nginx-1.11.7.tar.gz -P down
不下载任何内容,判断URL是否可以访问:
# wget --spider http://nginx.org/download/nginx-1.11.7.tar.gz
下载内容写到文件:
# wget http://www.baidu.com/index.html -O index.html
从文件中读取URL下载:
# wget -i url.list
下载ftp文件:
# wget --ftp-user=admin --ftp-password=admin ftp://192.168.1.10/ISO/CentOS-6.5-i386-minimal.iso
伪装客户端,指定user-agent和referer下载:
# wget -U "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --referer "http://nginx.org/en/download.html" http://nginx.org/download/nginx-1.11.7.tar.gz
查看HTTP头信息:
# wget -S http://nginx.org/download/nginx-1.11.7.tar.gz
# wget --debug http://nginx.org/download/nginx-1.11.7.tar.gz
120、curl
功能:发送数据到URL,类似于HTTP客户端
常用选项:
-C, --continue-at 断点续传
-b, --cookie STRING/FILE 从文件中读取cookie
-c, --cookie-jar 把cookie保存到文件
-d, --data 使用POST方式发送数据
--data-urlencode POST的数据URL编码
-F, --form 指定POST数据的表单
-D, --dump-header 保存头信息到文件
--ftp-pasv 指定FTP连接模式PASV/EPSV
-P, --ftp-port 指定FTP端口
-L, --location 遵循URL重定向,默认不处理
-l, --list-only 指列出FTP目录名
-H, --header 自定义头信息发送给服务器
-I, --head 查看HTTP头信息
-o, --output FILE 输出到文件
-#, --progress-bar 显示bar进度条
-x, --proxy[PROTOCOL://]HOST[:PORT] 使用代理
-U, --proxy-userUSER[:PASSWORD] 代理用户名和密码
-e, --referer 指定引用地址referer
-O, --remote-name 使用远程服务器上名字写到本地
--connect-timeout 连接超时时间,单位秒
--retry NUM 连接重试次数
--retry-delay 两次重试间隔等待时间
-s, --silent 静默模式,不输出任何内容
-Y, --speed-limit 限制下载速率
-u, --user USER[:PASSWORD] 指定http和ftp用户名和密码
-T, --upload-file 上传文件
-A, --user-agent 指定客户端信息
示例:
代码语言:javascript复制下载页面:
# curl -o badu.html http://www.baidu.com
不输出下载信息:
# curl -s -o baidu.html http://www.baidu.com
伪装客户端,指定user-agent和referer下载:
# curl -A "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" -e "baike.baidu.com" http://127.0.0.1
模拟用户登录,并保存cookies到文件:
# curl -c ./cookies.txt -F NAME=user -F PWD=123 http://www.example.com/login.html
使用cookie访问:
# curl -b cookies.txt http://www.baidu.com
访问HTTP认证页面:
# curl -u user:pass http://www.example.com
FTP上传文件:
# curl -T filename ftp://user:pass@ip/a.txt
# curl ftp://ip -u user:pass-T filename
FTP下载文件:
# curl -O ftp://user:pass@ip/a.txt
# curl ftp://ip/filename -u user:pass -o filename
FTP下载多个文件:
# curl ftp://ip/img/[1,3,5].jpg
查看HTTP头信息:
# curl -I http://www.baidu.com
121、rsync
功能:远程或本地文件同步工具
常用选项:
-v 显示复制信息
-q 不输出错误信息
-c 跳过基础效验,不判断修改时间和大小
-a 归档模式,等效-rlptgoD,保留权限、属组等
-r 递归目录
-l 拷贝软连接
-z 压缩传输数据
-e 指定远程shell,比如ssh、rsh
--progress 进度条,等同-P
--bwlimit=KB/s 限制速率,0为没有限制
--delete 删除那些DST中SRC没有的文件
--exclude=PATTERN 排除匹配的文件或目录
--exclude-from=FILE 从文件中读取要排除的文件或目录
--password-file=FILE 从文件读取远程主机密码
--port=PORT 监听端口
示例:
代码语言:javascript复制本地复制目录:
# rsync -avz abc /opt
本地目录推送到远程主机:
# rsync -avz SRC root@192.168.1.120:DST
远程主机目录拉取到本地:
# rsync -avz root@192.168.1.10:SRC DST
保持远程主机目录与本地一样:
# rsync -avz --delete SRC root@192.168.1.120:DST
排除某个目录:
# rsync -avz --exclude=no_dir SRC root@192.168.1.120:DST
指定SSH端口:
# rsync -avz /etc/hosts -e "ssh -p22" root@192.168.1.120:/opt
122、 nohup
功能:运行命令,忽略所有挂起信号
常用选项:
示例:
代码语言:javascript复制后台运行程序,终端关闭不影响:
# nohup bash test.sh &>test.log &
123、iconv
功能:将文件内容字符集转成其他字符集
常用选项:
-l 列出所有已知的编码字符集
-f 编码原始文本
-t 输出的编码格式
-o 输出到文件
-s 不输出警告
示例:
代码语言:javascript复制将文件内容转换UTF8:
# iconv -f gbk -t utf8 old.txt -o new.txt
将csv文件转换GBK:
# iconv -f utf8 -t gbk old.txt -o new.txt
解决邮件乱码:
# echo $(echo "content" | iconv -f utf8 -t gbk) | mail -s "$(echo "title" | iconv -f utf8 -t gbk)" dst@163.com
124、sshpass
功能:非交互SSH登录(需要安装)
常用选项:
-f 从文件中获取密码
-d 用数字文件描述符获取密码
-p 密码作为参数
-e 密码作为环境变量传递,变量名是SSHPASS
示例:
代码语言:javascript复制免交互SSH登录:
# sshpass -p 123456 ssh root@192.168.1.10
免交互传输文件:
# sshpass -p 123456 scp a.txt 192.168.1.10:/root
密码传入系统变量:
# SSHPASS=123456 rsync -avz /etc/hosts -e "sshpass -e ssh" root@192.168.1.221:/opt
125、logger
功能:系统日志的shell命令行接口
常用选项:
-i 每行记录进程ID
-f 指定输出日志到文件
-p 设置记录的优先级
-t 添加标签
示例:
1 | # logger -i -t "my_test" -p local3.notice "test_info" |
---|
126、 netstat
功能:打印网络连接、路由表、接口统计信息、伪装连接和多播成员
常用选项:
-r 显示路由表
-i 显示接口表
-n 不解析名字
-p 显示程序名 PID/Program
-l 显示监听的socket
-a 显示所有socket
-o 显示计时器
-Z 显示上下文
-t 只显示tcp连接
-u 只显示udp连接
-s 显示每个协议统计信息
示例:
代码语言:javascript复制显示所有监听:
# netstat -anltu
显示所有TCP连接:
# netstat -antp
显示所有UDP连接:
# netstat -anup
显示路由表:
# netstat -r
127、ss
功能:比netstat更强大的socket查看工具
格式:ss [options] [ FILTER ]
常用选项:
-n 不解析名字
-a 显示所有socket
-l 显示所有监听的socket
-o 显示计时器
-e 显示socket详细信息
-m 显示socket内存使用
-p 显示进程使用的socket
-i 显示内部TCP信息
-s 显示socket使用汇总
-4 只显示IPV4的socket
-0 显示包socket
-t 只显示TCP socket
-u 只显示UDP socket
-d 只显示DCCP socket
-w 只显示RAW socket
-x 只显示Unix域socket
-f FAMILY 只显示socket族类型( unix, inet,inet6, link, netlink)
-A 查询socket{all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D 将原始的TCP socket转储到文件
-F 从文件中读取过滤信息
过滤:
-o state 显示TCP连接状态信息
示例:
代码语言:javascript复制显示所有TCP连接:
# ss -t -a
显示所有UDP连接:
# ss -u –a
显示socket使用汇总:
# ss -s
显示所有建立的连接:
# ss -o state established
显示所有的TIME-WAIT状态:
# ss -o state TIME-WAIT
搜索所有本地进程连接到X Server:
# ss -x src /tmp/.X11-unix/*
128、 lsof
功能:列出打开的文件
常用选项:
-i [i] 监听的网络地址,如果没有指定,默认列出所有。[i] 来自[46][protocol][@hostname|hostaddr][:service|port]
-U 列出Unix域socket文件
-p 指定PID
-u 指定用户名或UID所有打开的文件
D 递归搜索
示例:
列出所有打开的文件: # lsof 查看哪个进程占用文件: # lsof /etc/passwd 列出所有打开的监听地址和unix域socket文件: # lsof -i -U 列出80端口监听的进程: # lsof -i:80 列出端口1-1024之间的所有进程: # lsof -i:1-1024 列出所有TCP网络连接: # lsof -i tcp 列出所有UDP网络连接: # lsof -i udp 根据文件描述符列出打开的文件: # lsof -d 1 列出某个目录被打开的文件: # lsof D /var/log 列出进程ID打开的文件: # lsof -p 5373 打开所有登录用户名abc或user id 1234,或PID 123或PID 456: # lsof -p 123,456 -u 123,abc 列出COMMAND列中包含字符串sshd: # lsof -c sshd | |
---|---|
129、ps
功能:报告当前进程的快照
常用选项:
-a 显示所有进程
-u 选择有效的用户ID或名称
-x 显示无控制终端的进程
-e 显示所有进程
-f 全格式
-r 只显示运行的进程
-T 这个终端的所有进程
-p 指定进程ID
--sort 对某列排序
-m 线程
-L 格式化代码列表
-o 用户自定义格式
CODE NORMAL HEADER
%C pcpu %CPU
%G group GROUP
%P ppid PPID
%U user USER
%a args COMMAND
%c comm COMMAND
%g rgroup RGROUP
%n nice NI
%p pid PID
%r pgid PGID
%t etime ELAPSED
%u ruser RUSER
%x time TIME
%y tty TTY
%z vsz VSZ
示例:
打印系统上所有进程标准语法: # ps -ef 打印系统上所有进程BSD语法: # ps aux 打印进程树: # ps axjf 或 ps -ejH 查看进程启动的线程: # ps -Lfp PID 查看当前用户的进程数: # ps uxm 或 ps -U root -u root u 自定义格式显示并对CPU排序: # ps -eo user,pid,pcpu,pmem,nice,lstart,time,args --sort=-pcpu 或 ps -eo "%U %p %C %n %x %a" |
---|
130、vmstat
功能:报告虚拟内存、swap、io、上下文和CPU统计信息。
分析了这些文件:
/proc/meminfo
/proc/stat
/proc/*/stat
常用选项:
-a 打印活跃和不活跃的内存页
-d 打印硬盘统计信息
-D 打印硬盘表
-p 打印硬盘分区统计信息
-s 打印虚拟内存表
-m 打印内存分配(slab)信息
-t 添加时间戳到输出
-S 显示单位,默认k、KB、m、M,大写是*1024
示例:
分析系统性能: # vmstat 每秒刷新一次,统计五次: # vmstat -t 1 5 11.49 iostat |
---|
功能:报告CPU利用率和磁盘I/O
常用选项:
-c 显示CPU使用率
-d 只显示磁盘使用率
-k 单位KB/s代替Block/s
-m 单位MB/s代替Block/s
-N 显示所有映射设备名字
-t 打印报告时间
-x 显示扩展统计信息
示例:
显示CPU使用率: # iostat -c 1 3 显示I/O磁盘统计信息: # iostat -d -x -k 1 3 # 间隔1秒,输出3次 |
---|
131、 sar
功能:查看系统资源综合方面利用率
常用选项:
-u, CPU
-r, memory
-b, disk
-n DEV, NIC traffic
-q, systemload
-b, TPS(Transaction Per Second,每秒事务处理量)
-o, output to file
示例:
# sar -u 2 3 #每两秒执行一次,采集三次 # sar -u 2 3 -o cpu.out # sar -f cpu.out #读取文件 |
---|
132、 dstat
功能:查看系统资源综合方面利用率
常用选项:
-c, CPU
-d, disk
-m, memory(实际内存使用)
-n, net
-s, swap
-l, systemload
--tcp, tcp stats
--udp, udp stats
plugins:
--list 查看支持的插件
--disk-util
--disk-tps
--top-bio 查看最高block I/O进程
--top-bio-adv 查看最高block I/O进程,包括pid、r、w
--top-io
--top-io-adv
--top-cpu 查看最高使用CPU进程
--top-cpu-adv 查看最高CPU进程
--top-mem 查看最高使用内存进程
示例:
查看CPU利用率: # dstat –c 查看TCP连接状态: # dstat --tcp |
---|
134、nc
功能:TCP和UDP连接和监听
常用选项:
-i interval 指定间隔时间发送和接受行文本
-l 监听模式,管理传入的连接
-n 不解析域名
-p 指定本地源端口
-r 指定本地和远程主机端口
-s 指定本地源IP地址
-u 使用udp协议,默认是tcp
-v 执行过程输出
-w timeout 连接超时时间
-x proxy_address[:port] 请求连接主机使用代理地址和端口
-z 指定扫描监听端口,不发送任何数据
示例:
端口扫描: # nc -z 192.168.1.10 1-65535 TCP协议连接到目标端口: # nc -p 31337 -w 5 192.168.1.10 22 UDP协议连接到目的端口: # nc -u 192.168.1.10 53 指定本地IP连接: # nc -s 192.168.1.9 192.168.1.10 22 探测端口是否开启: # nc -z -w 2 192.168.1.10 22 创建监听Unix域Socket: # nc -lU /var/tmp/ncsocket 通过HTTP代理连接主机: # nc -x10.2.3.4:8080 -Xconnect 10.0.0.10 22 监听端口捕获输出到文件: # nc -l 1234 > filename.out 从文件读入到指定端口: # nc host.example.com 1234 < filename.in 收发信息: # nc -l 1234 # nc 127.0.0.1 1234 执行memcahced命令:printf "statsn" |nc 127.0.0.1 11211 发送邮件: # nc [-C] localhost 25 << EOF HELO host.example.com MAIL FROM: <user@host.example.com> RCPT TO: <user2@host.example.com> DATA Body of email. . QUIT EOF # echo -n "GET / HTTP/1.0rnrn" | nc host.example.com 80 |
---|
135 time
功能:执行脚本时间
常用选项:
示例:
查看执行ls所需的时间: # time ls |
---|
136 iptables
常见几种类型防火墙?
包过滤防火墙:包过滤是IP层实现,包过滤根据数据包的源IP、目的IP、协议类型(TCP/UDP/ICMP)、源端口、目的端口等包头信息及数据包传输方向灯信息来判断是否允许数据包通过。
应用层防火墙:也称为应用层代理防火墙,基于应用层协议的信息流检测,可以拦截某应用程序的所有封包,提取包内容进行分析。有效防止SQL注入或者XSS(跨站脚本攻击)之类的恶意代码。
状态检测防火墙:结合包过滤和应用层防火墙优点,基于连接状态检测机制,将属于同一连接的所有包作为一个整体的数据流看待,构成连接状态表(通信信息,应用程序信息等),通过规则表与状态表共同配合,对表中的各个连接状态判断。
iptables是Linux下的配置防火墙的工具,用于配置Linux内核集成的IP信息包过滤系统,使增删改查信息包过滤表中的规则更加简单。
iptables分为四表五链,表是链的容器,链是规则的容器,规则指定动作。
四表:
filter | 用于包过滤 |
---|---|
nat | 网络地址转发 |
mangle | 对特定数据包修改 |
raw | 不做数据包链接跟踪 |
五链:
INPUT | 本机数据包入口 |
---|---|
OUTPUT | 本机数据包出口 |
FORWARD | 经过本机转发的数据包 |
PREROUTING | 防火墙之前,修改目的地址(DNAT) |
POSTROUTING | 防火墙之后,修改源地址(SNAT) |
表中的链:
表 | 链 |
---|---|
filter | INPUT、OUTPUT和FORWARD |
nat | PREROUTING、POSTROUTING和OUTPUT |
mangle | PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD |
raw | PREROUTING和OUTPUT |
命令格式:iptables [-t table] 命令 [chain] 匹配条件 动作
命令 | 描述 |
---|---|
-A,append | 追加一条规则 |
-I,insert | 插入一条规则,默认链头,后跟编号,指定第几条 |
-D,delete | 删除一条规则 |
-F,flush | 清空规则 |
-L,list | 列出规则 |
-P,policy | 设置链缺省规则 |
-m,module | 模块,比如state、multiport |
匹配条件 | 描述 |
---|---|
-i | 入口网卡 |
-o | 出口网卡 |
-s | 源地址 |
-d | 目的地址 |
-p | 协议类型 |
--sport | 源端口 |
--dport | 目的端口 |
动作 | 描述 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 丢弃数据包不做处理 |
REJECT | 拒绝数据包,并返回报错信息 |
SNAT | 一般用于nat表的POSTROUTING链,进行源地址转换 |
DNAT | 一般用于nat表的PREROUTING链,进行目的地址转换 |
MASQUERADE | 动态源地址转换,动态IP时使用 |
模块 | 描述 |
---|---|
state | 包状态,有四个:NEW、RELATED、ESTABLISHED和INVALID |
mac | 源MAC地址 |
limit | 包速率限制 |
multiport | 多端口,以逗号分隔 |
iprange | 端口范围,以逗号分隔 |
示例:常用的规则配置方法
iptables -F # 清空表规则,默认filter表 iptables -t nat -F # 清空nat表 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许TCP的22端口访问 iptables -I INPUT -p udp --dport 53 -j ACCEPT # 允许UDP的53端口访问,插入在第一条 iptables -A INPUT -p tcp --dport 22:25 -j ACCEPT # 允许端口范围访问 iptables -D INPUT -p tcp --dport 22:25 -j ACCEPT # 删除这条规则 # 允许多个TCP端口访问 iptables -A INPUT -p tcp -m multiport --dports 22,80,8080 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允许192.168.1.0段IP访问 iptables -A INPUT -s 192.168.1.10 -j DROP # 对1.10数据包丢弃 iptables -A INPUT -i eth0 -p icmp -j DROP # eth0网卡ICMP数据包丢弃,也就是禁ping # 允许来自lo接口,如果没有这条规则,将不能通过127.0.0.1访问本地服务 iptables -A INPUT -i lo -j ACCEPT # 限制并发连接数,超过30个拒绝 iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j REJECT # 限制每个IP每秒并发连接数最大3个 iptables -I INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT # iptables服务器作为网关时,内网访问公网 iptables –t nat -A POSTROUTING -s [内网IP或网段] -j SNAT --to [公网IP] # 访问iptables公网IP端口,转发到内网服务器端口 iptables –t nat -A PREROUTING -d [对外IP] -p tcp --dport [对外端口] -j DNAT --to [内网IP:内网端口] # 本地80端口转发到本地8080端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 # 允许已建立及该链接相关联的数据包通过 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ASDL拨号上网 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o pppo -j MASQUERADE iptables -P INPUT DROP # 设置INPUT链缺省操作丢弃所有数据包,只要不符合规则的数据包都丢弃。注意要在最后设置,以免把自己关在外面! |
---|