LINUX运维常用命令详解三

2022-12-02 15:15:04 浏览数 (2)

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链缺省操作丢弃所有数据包,只要不符合规则的数据包都丢弃。注意要在最后设置,以免把自己关在外面!

0 人点赞