linux-tutorial/docs/linux/commands/网络管理/网络应用.md
2018-02-28 16:48:00 +08:00

75 KiB
Raw Blame History

title date categories tags
linux 常用命令-网络应用 2018/02/27
linux
linux
command

linux 常用命令-网络应用

curl

利用URL规则在命令行下工作的文件传输工具

补充说明

curl命令 是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载所以是综合传输工具但按传统习惯称curl为下载工具。作为一款强力工具curl支持包括HTTP、HTTPS、ftp等众多协议还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化curl可以祝一臂之力。

语法

curl(选项)(参数)

选项

-a/--append上传文件时,附加到目标文件
-A/--user-agent 设置用户代理发送给服务器
-anyauth可以使用“任何”身份验证方法
-b/--cookie cookie字符串或文件读取位置
     --basic使用HTTP基本验证
-B/--use-ascii使用ASCII /文本传输
-c/--cookie-jar 操作结束后把cookie写入到这个文件中
-C/--continue-at 断点续传
-d/--data HTTP POST方式传送数据
     --data-ascii 以ascii的方式post数据
     --data-binary 以二进制的方式post数据
     --negotiate使用HTTP身份验证
     --digest使用数字身份验证
     --disable-eprt禁止使用EPRT或LPRT
     --disable-epsv禁止使用EPSV
-D/--dump-header 把header信息写入到该文件中
     --egd-file 为随机数据(SSL)设置EGD socket路径
     --tcp-nodelay使用TCP_NODELAY选项
-e/--referer来源网址
-E/--cert 客户端证书文件和密码 (SSL)
     --cert-type 证书文件类型 (DER/PEM/ENG) (SSL)
     --key 私钥文件名 (SSL)
     --key-type 私钥文件类型 (DER/PEM/ENG) (SSL)
     --pass 私钥密码 (SSL)
     --engine 加密引擎使用 (SSL). "--engine list" for list
     --cacert CA证书 (SSL)
     --capath CA目录 (made using c_rehash) to verify peer against (SSL)
     --ciphers SSL密码
     --compressed要求返回是压缩的形势 (using deflate or gzip)
     --connect-timeout 设置最大请求时间
     --create-dirs建立本地目录的目录层次结构
     --crlf上传是把LF转变成CRLF
-f/--fail连接失败时不显示http错误
     --ftp-create-dirs如果远程目录不存在,创建远程目录
     --ftp-method [multicwd/nocwd/singlecwd]控制CWD的使用
     --ftp-pasv使用 PASV/EPSV 代替端口
     --ftp-skip-pasv-ip使用PASV的时候,忽略该IP地址
     --ftp-ssl尝试用 SSL/TLS 来进行ftp数据传输
     --ftp-ssl-reqd要求用 SSL/TLS 来进行ftp数据传输
-F/--form 模拟http表单提交数据
     --form-string 模拟http表单提交数据
-g/--globoff禁用网址序列和范围使用{}和[]
-G/--get以get的方式来发送数据
-H/--header 自定义头信息传递给服务器
     --ignore-content-length忽略的HTTP头信息的长度
-i/--include输出时包括protocol头信息
-I/--head只显示请求头信息
-j/--junk-session-cookies读取文件进忽略session cookie
     --interface 使用指定网络接口/地址
     --krb4 使用指定安全级别的krb4
-k/--insecure允许不使用证书到SSL站点
-K/--config指定的配置文件读取
-l/--list-only列出ftp目录下的文件名称
     --limit-rate 设置传输速度
     --local-port强制使用本地端口号
-m/--max-time 设置最大传输时间
     --max-redirs 设置最大读取的目录数
     --max-filesize 设置最大下载的文件总量
-M/--manual显示全手动
-n/--netrc从netrc文件中读取用户名和密码
     --netrc-optional使用 .netrc 或者 URL来覆盖-n
     --ntlm使用 HTTP NTLM 身份验证
-N/--no-buffer禁用缓冲输出
-o/--output把输出写到该文件中
-O/--remote-name把输出写到该文件中,保留远程文件的文件名
-p/--proxytunnel使用HTTP代理
     --proxy-anyauth选择任一代理身份验证方法
     --proxy-basic在代理上使用基本身份验证
     --proxy-digest在代理上使用数字身份验证
     --proxy-ntlm在代理上使用ntlm身份验证
-P/--ftp-port 使用端口地址而不是使用PASV
-q作为第一个参数,关闭 .curlrc
-Q/--quote 文件传输前,发送命令到服务器
-r/--range 检索来自HTTP/1.1或FTP服务器字节范围
--range-file读取SSL的随机文件
-R/--remote-time在本地生成文件时,保留远程文件时间
     --retry 传输出现问题时,重试的次数
     --retry-delay 传输出现问题时,设置重试间隔时间
     --retry-max-time 传输出现问题时,设置最大重试时间
-s/--silent静默模式。不输出任何东西
-S/--show-error显示错误
     --socks4 用socks4代理给定主机和端口
     --socks5 用socks5代理给定主机和端口
     --stderr  
-t/--telnet-option Telnet选项设置
     --trace 对指定文件进行debug
     --trace-ascii Like --跟踪但没有hex输出
     --trace-time跟踪/详细输出时,添加时间戳
-T/--upload-file 上传文件
     --url Spet URL to work with
-u/--user 设置服务器的用户和密码
-U/--proxy-user 设置代理用户名和密码
-w/--write-out [format]什么输出完成后
-x/--proxy 在给定的端口上使用HTTP代理
-X/--request 指定什么命令
-y/--speed-time放弃限速所要的时间默认为30
-Y/--speed-limit停止传输速度的限制,速度时间

实例

文件下载

curl命令可以用来执行下载、发送各种HTTP请求指定HTTP头部等操作。如果系统没有curl可以使用yum install curl安装也可以下载安装。curl是将下载文件输出到stdout将进度信息输出到stderr不显示进度信息使用--silent选项。

curl URL --silent

这条命令是将下载文件输出到终端所有下载的数据都被写入到stdout。

使用选项-O将下载的数据写入到文件,必须使用文件的绝对地址:

curl http://man.linuxde.net/text.iso --silent -O

选项-o将下载数据写入到指定名称的文件中,并使用--progress显示进度条:

curl http://man.linuxde.net/test.iso -o filename.iso --progress
######################################### 100.0%

断点续传

curl能够从特定的文件偏移处继续下载它可以通过指定一个便宜量来下载部分文件

curl URL/File -C 偏移量

#偏移量是以字节为单位的整数如果让curl自动推断出正确的续传位置使用-C -
curl -C -URL

使用curl设置参照页字符串

参照页是位于HTTP头部中的一个字符串用来表示用户是从哪个页面到达当前页面的如果用户点击网页A中的某个连接那么用户就会跳转到B网页网页B头部的参照页字符串就包含网页A的URL。

使用--referer选项指定参照页字符串:

curl --referer http://www.google.com http://man.linuxde.net

用curl设置cookies

使用--cookie "COKKIES"选项来指定cookie多个cookie使用分号分隔

curl http://man.linuxde.net --cookie "user=root;pass=123456"

将cookie另存为一个文件使用--cookie-jar选项:

curl URL --cookie-jar cookie_file

用curl设置用户代理字符串

有些网站访问会提示只能使用IE浏览器来访问这是因为这些网站设置了检查用户代理可以使用curl把用户代理设置为IE这样就可以访问了。使用--user-agent或者-A选项:

curl URL --user-agent "Mozilla/5.0"
curl URL -A "Mozilla/5.0"

其他HTTP头部信息也可以使用curl来发送使用-H"头部信息" 传递多个头部信息,例如:

curl -H "Host:man.linuxde.net" -H "accept-language:zh-cn" URL

curl的带宽控制和下载配额

使用--limit-rate限制curl的下载速度

curl URL --limit-rate 50k

命令中用k千字节和m兆字节指定下载速度限制。

使用--max-filesize指定可下载的最大文件大小:

curl URL --max-filesize bytes

如果文件大小超出限制命令则返回一个非0退出码如果命令正常则返回0。

用curl进行认证

使用curl选项 -u 可以完成HTTP或者FTP的认证可以指定密码也可以不指定密码在后续操作中输入密码

curl -u user:pwd http://man.linuxde.net
curl -u user http://man.linuxde.net

只打印响应头部信息

通过-I或者-head可以只打印出HTTP头部信息

[root@localhost text]# curl -I http://man.linuxde.net
HTTP/1.1 200 OK
Server: nginx/1.2.5
date: Mon, 10 Dec 2012 09:24:34 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Pingback: http://man.linuxde.net/xmlrpc.php

get请求

curl "http://www.wangchujiang.com"    # 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地
curl -i "http://www.wangchujiang.com" # 显示全部信息
curl -l "http://www.wangchujiang.com" # 只显示头部信息
curl -v "http://www.wangchujiang.com" # 显示get请求全过程解析

post请求

curl -d "param1=value1&param2=value2" "http://www.wangchujiang.com"

json格式的post请求

curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13521389587","password":"test"}' http://wangchujiang.com/apis/users.json

wget

Linux系统下载文件工具

补充说明

wget命令 用来从指定的URL下载文件。wget非常稳定它在带宽很窄的情况下和不稳定网络中有很强的适应性如果是由于网络的原因下载失败wget会不断的尝试直到整个文件下载完毕。如果是服务器打断下载过程它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

wget支持HTTPHTTPS和FTP协议可以使用HTTP代理。所谓的自动下载是指wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统启动一个wget下载任务然后退出系统wget将在后台执行直到任务完成相对于其它大部分浏览器在下载大量数据时需要用户一直的参与这省去了极大的麻烦。

用于从网络上下载资源没有指定目录下载资源回默认为当前目录。wget虽然功能强大但是使用起来还是比较简单

  1. 支持断点下传功能 这一点也是网络蚂蚁和FlashGet当年最大的卖点现在Wget也可以使用此功能那些网络不是太好的用户可以放心了
  2. 同时支持FTP和HTTP下载方式 尽管现在大部分软件可以使用HTTP方式下载但是有些时候仍然需要使用FTP方式下载软件
  3. 支持代理服务器 对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;
  4. 设置方便简单 可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;
  5. 程序小,完全免费 程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的。

语法

wget [参数] [URL地址]

选项

启动参数:

-V, -version 显示wget的版本后退出
-h, -help 打印语法帮助
-b, -background 启动后转入后台执行
-e, -execute=COMMAND 执行`.wgetrc格式的命令wgetrc格式参见/etc/wgetrc或~/.wgetrc

记录和输入文件参数:

-o, -output-file=FILE 把记录写到FILE文件中
-a, -append-output=FILE 把记录追加到FILE文件中
-d, -debug 打印调试输出
-q, -quiet 安静模式(没有输出)
-v, -verbose 冗长模式(这是缺省设置)
-nv, -non-verbose 关掉冗长模式,但不是安静模式
-i, -input-file=FILE 下载在FILE文件中出现的URLs
-F, -force-html 把输入文件当作HTML格式文件对待
-B, -base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
-sslcertfile=FILE 可选客户端证书
-sslcertkey=KEYFILE 可选客户端证书的KEYFILE
-egd-file=FILE 指定EGD socket的文件名

下载参数:

-bind-address=ADDRESS 指定本地使用地址(主机名或IP当本地有多个IP或名字时使用)
-t, -tries=NUMBER 设定最大尝试链接次数(0 表示无限制).
-O -output-document=FILE 把文档写到FILE文件中
-nc, -no-clobber 不要覆盖存在的文件或使用.#前缀
-c, -continue 接着下载没下载完的文件
progress=TYPE 设定进程条标记
-N, -timestamping 不要重新下载文件除非比本地文件新
-S, -server-response 打印服务器的回应
-spider 不下载任何东西
-T, -timeout=SECONDS 设定响应超时的秒数
-w, -wait=SECONDS 两次尝试之间间隔SECONDS秒
waitretry=SECONDS 在重新链接之间等待1…SECONDS秒
random-wait 在下载之间等待0…2*WAIT秒
-Y, -proxy=on/off 打开或关闭代理
-Q, -quota=NUMBER 设置下载的容量限制
limit-rate=RATE 限定下载输率

目录参数:

-nd -no-directories 不创建目录
-x, -force-directories 强制创建目录
-nH, -no-host-directories 不创建主机目录
-P, -directory-prefix=PREFIX 将文件保存到目录 PREFIX/…
cut-dirs=NUMBER 忽略 NUMBER层远程目录

HTTP 选项参数:

-http-user=USER 设定HTTP用户名为 USER.
-http-passwd=PASS 设定http密码为 PASS
-C, -cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许)
-E, -html-extension 将所有text/html文档以.html扩展名保存
-ignore-length 忽略 `Content-Length头域
-header=STRING 在headers中插入字符串 STRING
-proxy-user=USER 设定代理的用户名为 USER
-proxy-passwd=PASS 设定代理的密码为 PASS
-referer=URL 在HTTP请求中包含 `Referer: URL头
-s, -save-headers 保存HTTP头到文件
-U, -user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION
-no-http-keep-alive 关闭 HTTP活动链接 (永远链接)
-cookies=off 不使用 cookies
-load-cookies=FILE 在开始会话前从文件 FILE中加载cookie
-save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中

FTP 选项参数:

-nr, -dont-remove-listing 不移走 `.listing文件
-g, -glob=on/off 打开或关闭文件名的 globbing机制
-passive-ftp 使用被动传输模式 (缺省值).
-active-ftp 使用主动传输模式
-retr-symlinks 在递归的时候,将链接指向文件(而不是目录)

递归下载参数:

-r, -recursive 递归下载--慎用!
-l, -level=NUMBER 最大递归深度 (inf 或 0 代表无穷)
-delete-after 在现在完毕后局部删除文件
-k, -convert-links 转换非相对链接为相对链接
-K, -backup-converted 在转换文件X之前将之备份为 X.orig
-m, -mirror 等价于 -r -N -l inf -nr
-p, -page-requisites 下载显示HTML文件的所有图片

递归下载中的包含和不包含(accept/reject)

-A, -accept=LIST 分号分隔的被接受扩展名的列表
-R, -reject=LIST 分号分隔的不被接受的扩展名的列表
-D, -domains=LIST 分号分隔的被接受域的列表
-exclude-domains=LIST 分号分隔的不被接受的域的列表
-follow-ftp 跟踪HTML文档中的FTP链接
-follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
-G, -ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
-H, -span-hosts 当递归时转到外部主机
-L, -relative 仅仅跟踪相对链接
-I, -include-directories=LIST 允许目录的列表
-X, -exclude-directories=LIST 不被包含目录的列表
-np, -no-parent 不要追溯到父目录
wget -S -spider url 不下载只显示过程

参数

URL下载指定的URL地址。

实例

使用wget下载单个文件

wget http://www.jsdig.com/testfile.zip

以下的例子是从网络下载一个文件并保存在当前目录,在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

下载并以不同的文件名保存

wget -O wordpress.zip http://www.jsdig.com/download.aspx?id=1080

wget默认会以最后一个符合/的后面的字符来命令,对于动态链接的下载通常文件名会不正确。

错误:下面的例子会下载一个文件并以名称download.aspx?id=1080保存:

wget http://www.jsdig.com/download?id=1

即使下载的文件是zip格式它仍然以download.php?id=1080命令。

正确:为了解决这个问题,我们可以使用参数-O来指定一个文件名:

wget -O wordpress.zip http://www.jsdig.com/download.aspx?id=1080

wget限速下载

wget --limit-rate=300k http://www.jsdig.com/testfile.zip

当你执行wget的时候它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件而你还需要下载其它文件时就有必要限速了。

使用wget断点续传

wget -c http://www.jsdig.com/testfile.zip

使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。

使用wget后台下载

wget -b http://www.jsdig.com/testfile.zip

Continuing in background, pid 1840.
Output will be written to `wget-log'.

对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载,你可以使用以下命令来察看下载进度:

tail -f wget-log

伪装代理名称下载

wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.jsdig.com/testfile.zip

有些网站能通过根据判断代理名称不是浏览器而拒绝你的下载请求。不过你可以通过--user-agent参数伪装。

测试下载链接

当你打算进行定时下载,你应该在预定时间测试下载链接是否有效。我们可以增加--spider参数进行检查。

wget --spider URL

如果下载链接正确,将会显示:

Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.

这保证了下载能在预定的时间进行,但当你给错了一个链接,将会显示如下错误:

wget --spider url
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!

你可以在以下几种情况下使用--spider参数:

  • 定时下载之前进行检查
  • 间隔检测网站是否可用
  • 检查网站页面的死链接

增加重试次数

wget --tries=40 URL

如果网络有问题或下载一个大文件也有可能失败。wget默认重试20次连接下载文件。如果需要你可以使用--tries增加重试次数。

下载多个文件

wget -i filelist.txt

首先,保存一份下载链接文件:

cat > filelist.txt
url1
url2
url3
url4

接着使用这个文件和参数-i下载。

镜像网站

wget --mirror -p --convert-links -P ./LOCAL URL

下载整个网站到本地。

  • --miror开户镜像下载。
  • -p下载所有为了html页面显示正常的文件。
  • --convert-links下载后,转换成本地的链接。
  • -P ./LOCAL保存所有文件和目录到本地指定目录。

过滤指定格式下载

wget --reject=gif ur

下载一个网站,但你不希望下载图片,可以使用这条命令。

把下载信息存入日志文件

wget -o download.log URL

不希望下载信息直接显示在终端而是在一个日志文件,可以使用。

限制总下载文件大小

wget -Q5m -i filelist.txt

当你想要下载的文件超过5M而退出下载你可以使用。注意这个参数对单个文件下载不起作用只能递归下载时才有效。

下载指定格式文件

wget -r -A.pdf url

可以在以下情况使用该功能:

  • 下载一个网站的所有图片。
  • 下载一个网站的所有视频。
  • 下载一个网站的所有PDF文件。

FTP下载

wget ftp-url
wget --ftp-user=USERNAME --ftp-password=PASSWORD url

可以使用wget来完成ftp链接的下载。

使用wget匿名ftp下载

wget ftp-url

使用wget用户名和密码认证的ftp下载

wget --ftp-user=USERNAME --ftp-password=PASSWORD url

telnet

登录远程主机和管理

补充说明

telnet命令 用于登录远程主机对远程主机进行管理。telnet因为采用明文传送报文安全性不好很多Linux服务器都不开放telnet服务而改用更安全的ssh方式了。但仍然有很多别的系统可能采用了telnet方式来提供远程登录因此弄清楚telnet客户端的使用方式仍是很有必要的。

语法

telnet(选项)(参数)

选项

-8允许使用8位字符资料包括输入与输出
-a尝试自动登入远端系统
-b<主机别名>:使用别名指定远端主机名称;
-c不读取用户专属目录里的.telnetrc文件
-d启动排错模式
-e<脱离字符>:设置脱离字符;
-E滤除脱离字符
-f此参数的效果和指定"-F"参数相同;
-F使用Kerberos V5认证时加上此参数可把本地主机的认证数据上传到远端主机
-k<域名>使用Kerberos认证时加上此参数让远端主机采用指定的领域名而非该主机的域名
-K不自动登入远端主机
-l<用户名称>:指定要登入远端主机的用户名称;
-L允许输出8位字符资料
-n<记录文件>:指定文件记录相关信息;
-r使用类似rlogin指令的用户界面
-S<服务类型>设置telnet连线所需的ip TOS信息
-x假设主机有支持数据加密的功能就使用它
-X<认证形态>:关闭指定的认证形态。

参数

  • 远程主机:指定要登录进行管理的远程主机;
  • 端口指定TELNET协议使用的端口号。

实例

$ telnet 192.168.2.10
Trying 192.168.2.10...
Connected to 192.168.2.10 (192.168.2.10).
Escape character is '^]'.

    localhost (Linux release 2.6.18-274.18.1.el5 #1 SMP Thu Feb 9 12:45:44 EST 2012) (1)

login: root
Password: 
Login incorrect

一般情况下不允许root从远程登录可以先用普通账号登录然后再用su -切到root用户。

$ telnet 192.168.188.132
Trying 192.168.188.132...
telnet: connect to address 192.168.188.132: Connection refused
telnet: Unable to connect to remote host

处理这种情况方法:

  1. 确认ip地址是否正确
  2. 确认ip地址对应的主机是否已经开机
  3. 如果主机已经启动确认路由设置是否设置正确使用route命令查看
  4. 如果主机已经启动确认主机上是否开启了telnet服务使用netstat命令查看TCP的23端口是否有LISTEN状态的行
  5. 如果主机已经启动telnet服务确认防火墙是否放开了23端口的访问使用iptables-save查看

启动telnet服务

service xinetd restart

配置参数,通常的配置如下:

service telnet 
{ 
    disable = no #启用 
    flags = REUSE #socket可重用 
    socket_type = stream #连接方式为TCP 
    wait = no #为每个请求启动一个进程 
    user = root #启动服务的用户为root 
    server = /usr/sbin/in.telnetd #要激活的进程 
    log_on_failure += USERID #登录失败时记录登录用户名 
} 

如果要配置允许登录的客户端列表,加入

only_from = 192.168.0.2 #只允许192.168.0.2登录 

如果要配置禁止登录的客户端列表,加入

no_access = 192.168.0.{2,3,4} #禁止192.168.0.2、192.168.0.3、192.168.0.4登录 

如果要设置开放时段,加入

access_times = 9:00-12:00 13:00-17:00 # 每天只有这两个时段开放服务我们的上班时间P 

如果你有两个IP地址一个是私网的IP地址如192.168.0.2一个是公网的IP地址如218.75.74.83如果你希望用户只能从私网来登录telnet服务那么加入

bind = 192.168.0.2 

各配置项具体的含义和语法可参考xined配置文件属性说明man xinetd.conf

配置端口修改services文件

# vi /etc/services 

找到以下两句

telnet 23/tcp 
telnet 23/udp 

如果前面有#字符就去掉它。telnet的默认端口是23这个端口也是黑客端口扫描的主要对象因此最好将这个端口修改掉修改的方法很简单就是将23这个数字修改掉改成大一点的数字比如61123。注意1024以下的端口号是internet保留的端口号因此最好不要用还应该注意不要与其它服务的端口冲突。

启动服务:

service xinetd restart 

ip

网络配置工具

补充说明

ip命令 用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道是Linux下较新的功能强大的网络配置工具。

语法

ip(选项)(参数)
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename

选项

OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
       tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
       netns | l2tp | macsec | tcp_metrics | token }
       
-V显示指令版本信息
-s输出更详细的信息
-f强制使用指定的协议族
-4指定使用的网络层协议是IPv4协议
-6指定使用的网络层协议是IPv6协议
-0输出信息每条记录输出一行即使内容较多也不换行显示
-r显示主机时不使用IP地址而使用主机的域名。

参数

OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
        -h[uman-readable] | -iec |
        -f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
        -4 | -6 | -I | -D | -B | -0 |
        -l[oops] { maximum-addr-flush-attempts } |
        -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
        -rc[vbuf] [size] | -n[etns] name | -a[ll] }
        
网络对象:指定要管理的网络对象;
具体操作:对指定的网络对象完成具体操作;
help显示网络对象支持的操作命令的帮助信息。

实例

ip link show                     # 显示网络接口信息
ip link set eth0 upi             # 开启网卡
ip link set eth0 down            # 关闭网卡
ip link set eth0 promisc on      # 开启网卡的混合模式
ip link set eth0 promisc offi    # 关闭网卡的混个模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400        # 设置网卡最大传输单元
ip addr show     # 显示网卡IP信息
ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址

ip route show # 显示系统路由
ip route add default via 192.168.1.254   # 设置系统默认路由
ip route list                 # 查看路由信息
ip route add 192.168.4.0/24  via  192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
ip route add default via  192.168.0.254  dev eth0        # 设置默认网关为192.168.0.254
ip route del 192.168.4.0/24   # 删除192.168.4.0网段的网关
ip route del default          # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由

用ip命令显示网络设备的运行状态

[root@localhost ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff

显示更加详细的设备信息

[root@localhost ~]# ip -s link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast   
    5082831    56145    0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns
    5082831    56145    0       0       0       0      
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    3641655380 62027099 0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns
    6155236    89160    0       0       0       0      
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    2562136822 488237847 0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns
    3486617396 9691081  0       0       0       0     

显示核心路由表

[root@localhost ~]# ip route list 
112.124.12.0/22 dev eth1  proto kernel  scope link  src 112.124.15.130
10.160.0.0/20 dev eth0  proto kernel  scope link  src 10.160.7.81
192.168.0.0/16 via 10.160.15.247 dev eth0
172.16.0.0/12 via 10.160.15.247 dev eth0
10.0.0.0/8 via 10.160.15.247 dev eth0
default via 112.124.15.247 dev eth1

显示邻居表

[root@localhost ~]# ip neigh list
112.124.15.247 dev eth1 lladdr 00:00:0c:9f:f3:88 REACHABLE
10.160.15.247 dev eth0 lladdr 00:00:0c:9f:f2:c0 STALE

获取主机所有网络接口

ip link | grep ^[0-9] | awk -F: '{print $2}'

hostname

显示和设置系统的主机名

补充说明

hostname命令 用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后系统并不会永久保存新的主机名重新启动机器之后还是原来的主机名。如果需要永久修改主机名需要同时修改/etc/hosts/etc/sysconfig/network的相关内容。

语法

hostname(选项)(参数)

选项

-v详细信息模式
-a显示主机别名
-d显示DNS域名
-f显示FQDN名称
-i显示主机的ip地址
-s显示短主机名称在第一个点处截断
-y显示NIS域名。

参数

主机名:指定要设置的主机名。

实例

[root@AY1307311912260196fcZ ~]# hostname
AY1307311912260196fcZ

ifconfig

配置和显示Linux系统网卡的网络参数

补充说明

ifconfig命令 被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息在网卡重启后机器重启后配置就不存在。要想将上述的配置信息永远的存的电脑里那就要修改网卡的配置文件了。

语法

ifconfig(参数)

参数

add<地址>设置网络设备IPv6的ip地址
del<地址>删除网络设备IPv6的IP地址
down关闭指定的网络设备
<hw<网络设备类型><硬件地址>:设置网络设备的类型与硬件地址;
io_addr<I/O地址>设置网络设备的I/O地址
irq<IRQ地址>设置网络设备的IRQ
media<网络媒介类型>:设置网络设备的媒介类型;
mem_start<内存地址>:设置网络设备在主内存所占用的起始地址;
metric<数目>:指定在计算数据包的转送次数时,所要加上的数目;
mtu<字节>设置网络设备的MTU
netmask<子网掩码>:设置网络设备的子网掩码;
tunnel<地址>建立IPv4与IPv6之间的隧道通信地址
up启动指定的网络设备
-broadcast<地址>:将要送往指定地址的数据包当成广播数据包来处理;
-pointopoint<地址>:与指定地址的网络设备建立直接连线,此模式具有保密功能;
-promisc关闭或启动指定网络设备的promiscuous模式
IP地址指定网络设备的IP地址
网络设备:指定网络设备的名称。

实例

显示网络设备信息(激活状态的):

[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3E:00:1E:51  
          inet addr:10.160.7.81  Bcast:10.160.15.255  Mask:255.255.240.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:61430830 errors:0 dropped:0 overruns:0 frame:0
          TX packets:88534 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3607197869 (3.3 GiB)  TX bytes:6115042 (5.8 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:56103 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:5079451 (4.8 MiB)  TX bytes:5079451 (4.8 MiB)

说明:

eth0 表示第一块网卡,其中HWaddr表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址00:16:3E:00:1E:51

inet addr 用来表示网卡的IP地址此网卡的IP地址是10.160.7.81,广播地址Bcast:10.160.15.255,掩码地址Mask:255.255.240.0

lo 是表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 httpd服务器的指定到回坏地址在浏览器输入127.0.0.1就能看到你所架WEB网站了。但只是您能看得到局域网的其它主机或用户无从知道。

  • 第一行连接类型Ethernet以太网HWaddr硬件mac地址
  • 第二行网卡的IP地址、子网、掩码。
  • 第三行UP代表网卡开启状态RUNNING代表网卡的网线被接上MULTICAST支持组播MTU:1500最大传输单元1500字节。
  • 第四、五行:接收、发送数据包情况统计。
  • 第七行:接收、发送数据字节数统计信息。

启动关闭指定网卡:

ifconfig eth0 up
ifconfig eth0 down

ifconfig eth0 up为启动网卡eth0ifconfig eth0 down为关闭网卡eth0。ssh登陆linux服务器操作要小心关闭了就不能开启了除非你有多网卡。

为网卡配置和删除IPv6地址

ifconfig eth0 add 33ffe:3240:800:1005::2/64    #为网卡eth0配置IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/64    #为网卡eth0删除IPv6地址

用ifconfig修改MAC地址

ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE

配置IP地址

[root@localhost ~]# ifconfig eth0 192.168.2.10
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255

启用和关闭arp协议

ifconfig eth0 arp    #开启网卡eth0 的arp协议
ifconfig eth0 -arp   #关闭网卡eth0 的arp协议

设置最大传输单元:

ifconfig eth0 mtu 1500    #设置能通过的最大数据包大小为 1500 bytes

route

显示并设置Linux中静态路由表

补充说明

route命令 用来显示并设置Linux内核中的网络路由表route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信需要一台连接两个网络的路由器或者同时位于两个网络的网关来实现。

在Linux系统中设置路由通常是为了解决以下问题该Linux系统在一个局域网中局域网中有一个网关能够让机器访问Internet那么就需要将这台机器的ip地址设置为Linux机器的默认路由。要注意的是直接在命令行下执行route命令来添加路由不会永久保存当网卡重启或者机器重启之后该路由就失效了可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。

语法

route(选项)(参数)

选项

-A设置地址类型
-C打印将Linux核心的路由缓存
-v详细信息模式
-n不执行DNS反向查找直接显示数字形式的IP地址
-enetstat格式显示路由表
-net到一个网络的路由表
-host到一个主机的路由表。

参数

Add增加指定的路由记录
Del删除指定的路由记录
Target目的网络或目的主机
gw设置默认网关
mss设置TCP的最大区块长度MSS单位MB
window指定通过路由表的TCP连接的TCP窗口大小
dev路由记录所表示的网络接口。

实例

显示当前路由:

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
112.124.12.0    *               255.255.252.0   U     0      0        0 eth1
10.160.0.0      *               255.255.240.0   U     0      0        0 eth0
192.168.0.0     10.160.15.247   255.255.0.0     UG    0      0        0 eth0
172.16.0.0      10.160.15.247   255.240.0.0     UG    0      0        0 eth0
10.0.0.0        10.160.15.247   255.0.0.0       UG    0      0        0 eth0
default         112.124.15.247  0.0.0.0         UG    0      0        0 eth1

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
112.124.12.0    0.0.0.0         255.255.252.0   U     0      0        0 eth1
10.160.0.0      0.0.0.0         255.255.240.0   U     0      0        0 eth0
192.168.0.0     10.160.15.247   255.255.0.0     UG    0      0        0 eth0
172.16.0.0      10.160.15.247   255.240.0.0     UG    0      0        0 eth0
10.0.0.0        10.160.15.247   255.0.0.0       UG    0      0        0 eth0
0.0.0.0         112.124.15.247  0.0.0.0         UG    0      0        0 eth1

其中Flags为路由标志标记当前网络节点的状态Flags标志说明

  • U Up表示此路由当前为启动状态。
  • H Host表示此网关为一主机。
  • G Gateway表示此网关为一路由器。
  • R Reinstate Route使用动态路由重新初始化的路由。
  • D Dynamically,此路由是动态性地写入。
  • M Modified此路由是由路由守护程序或导向器动态修改。
  • ! 表示此路由当前为关闭状态。

添加网关/设置网关:

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0    #增加一条到达244.0.0.0的路由。

屏蔽一条路由:

route add -net 224.0.0.0 netmask 240.0.0.0 reject     #增加一条屏蔽的路由目的地址为224.x.x.x将被拒绝。

删除路由记录:

route del -net 224.0.0.0 netmask 240.0.0.0
route del -net 224.0.0.0 netmask 240.0.0.0 reject

删除和添加设置默认网关:

route del default gw 192.168.120.240
route add default gw 192.168.120.240

ssh

openssh套件中的客户端连接工具

补充说明

ssh命令 是openssh套件中的客户端连接工具可以给予ssh加密协议实现安全的远程登录服务器。

语法

ssh(选项)(参数)

选项

-1强制使用ssh协议版本1
-2强制使用ssh协议版本2
-4强制使用IPv4地址
-6强制使用IPv6地址
-A开启认证代理连接转发功能
-a关闭认证代理连接转发功能
-b使用本机指定地址作为对应连接的源ip地址
-C请求压缩所有数据
-F指定ssh指令的配置文件
-f后台执行ssh指令
-g允许远程主机连接主机的转发端口
-i指定身份文件
-l指定连接远程服务器登录用户名
-N不执行远程指令
-o指定配置选项
-p指定远程服务器上的端口
-q静默模式
-X开启X11转发功能
-x关闭X11转发功能
-y开启信任X11转发功能。

参数

  • 远程主机指定要连接的远程ssh服务器
  • 指令要在远程ssh服务器上执行的指令。

实例

# ssh 用户名@远程服务器地址
ssh user1@172.24.210.101
# 指定端口
ssh -p 2211 root@140.206.185.170

背后故事

英文Tatu Ylonen 编译Linux中国/kenxx
来源:https://linux.cn/article-8476-1.html

为什么 SSH安全终端的端口号是 22 呢这不是一个巧合这其中有个我Tatu YlonenSSH 协议的设计者)未曾诉说的故事。

将 SSH 协议端口号设为 22 的故事

1995 年春我编写了 SSH 协议的最初版本,那时候 telnet 和 FTP 正被广泛使用。

当时我设计 SSH 协议想着是为了替代 telnet端口 23和 ftp端口21两个协议的而端口 22 是空闲的。我想当然地就选择了夹在 telnet 和 ftp 的端口中间的数字。我觉得端口号虽然是个小事但似乎又存在着某种信念。但我到底要怎么拿到那个端口号呢?我未曾拥有过任何一个端口号,但我却认识几个拥有端口号的人!

在那时取得端口号的事情其实说来挺简单的。毕竟当时的因特网Internet并不是很大是因特网爆炸的早期。端口号分配的活儿是 IANAInternet Assigned Numbers Authority互联网数字分配机构干的。在那时这机构可相当于是因特网先驱 Jon PostelJoyce K. Reynolds 一般的存在。Jon 参与编写了多项主要的协议标准,例如 IPRFC 791、ICMPRFC 792和 TCPRFC 793等一些你应该早有耳闻的协议。

我可以说是敬畏 Jon 先生的他参与编写了几乎所有主要的因特网标准文档Internet RFC

1995 年 7 月,就在我发布 ssh-1.0 前,我发送了一封邮件给 IANA

From ylo Mon Jul 10 11:45:48 +0300 1995
From: Tatu Ylonen
To: Internet Assigned Numbers Authority
Subject: 请求取得一个端口号
Organization: 芬兰赫尔辛基理工大学

亲爱的机构成员:

我写了个可以在不安全的网络环境中安全地从一台机器登录到另一台机器的程序。它主要是对现有的 telnet 协议以及 rlogin 协议的功能性提升和安全性改进。说的具体些,就是可以防御 IP、DNS > 或路由等欺骗行为。我打算将我的软件免费地发布在因特网上,以得到广泛地使用。

我希望为该软件注册一个特权端口号,要是这个端口号在 1 到 255 > 之间就更好了,这样它就可以用在名字服务器的 WKS 字段中了。

我在附件中附上了协议标准的草案。这个软件已经在本地运行了几个月了,我已准备在获得端口号后就发布。如果端口号分配一事安排的及时,我希望这周就将要发布的软件准备好。我目前在 beta 版测试时使用的端口号是 > 22如果要是能够分配到这个端口我就不用做什么更改了目前这个端口在列表中还是空闲的

软件中服务的名称叫 ssh系 Secure Shell 的缩写)。

您最真诚的,
Tatu Ylonen

LCTT 译注DNS 协议中的 WKS 记录类型意即“众所周知的业务描述”,是类似于 A、MX 这样的 DNS 记录类型,用于描述某个 IP 所提供的服务,目前鲜见使用。参见: https://docs.oracle.com/cd/E19683-01/806-4077/dnsintro-154/index.html 。)

第二天,我就收到了 Joyce 发来的邮件:

Date: Mon, 10 Jul 1995 15:35:33 -0700
From: jkrey@ISI.EDU
To: ylo@cs.hut.fi
Subject: 回复:请求取得一个端口号
Cc: iana@ISI.EDU
Tatu,
我们将端口号 22 分配给 ssh 服务了,你目前是该服务的主要联系人。
Joyce

这就搞定了SSH 的端口正式使用 22

1995 年 7 月 12 日上午 2 点 21 分,我给我在赫尔辛基理工大学的测试者们宣布了 SSH 的最后 beta 版本。当日下午 5 点 23 分,我给测试者们宣布了 ssh-1.0.0 版本。1995 年 7 月 12 日,下午 5 点 51 分,我将一份 SSH安全终端的宣告发给了 cypherpunks@toad.com 的邮件列表,此外我还将其发给了一些新闻组、邮件列表和一些在因特网上讨论相关话题的人们。

如何更改 SSH 服务的端口号

SSH 服务器是默认运行在 22 号端口上的。然而,由于某些原因需要,它也可以运行在别的端口上。比如为了方便测试使用,又比如在同一个宿主机上运行多个不同的配置。当然,极少情况下,不使用 root 权限运行它也可以,比如某些必须运行在非特权的端口的情况(端口号大于等于 1024

端口号可以在配置文件 /etc/ssh/sshd_config 中将 Port 22 更改。也可以使用 -p 选项运行 sshd。SSH 客户端和 sftp 程序也可以使用 -p 选项。

配置 SSH 协议穿越防火墙

SSH 是少数通常被许可穿越防火墙的协议之一。通常的做法是不限制出站的 SSH 连接,尤其常见于一些较小的或者比较技术型的组织中,而入站的 SSH 连接通常会限制到一台或者是少数几台服务器上。

出站的 SSH 连接

在防火墙中配置出站的 SSH 连接十分简单。如果完全限制了外发连接,那么只需要创建一个允许 TCP 端口 22 可以外发的规则即可。如果你想限制目标地址,你可以限制该规则仅允许访问你的组织放在云端的外部服务器或保护该云端的跳板服务器即可。

反向通道是有风险的

其实不限制出站的 SSH 连接虽然是可以的但是是存在风险的SSH 协议是支持 通道访问 的。最初的想法是在外部服务器搭建一个 SSH 服务监听来自各处的连接,将进入的连接转发到组织,并让这个连接可以访问某个内部服务器。

在某些场景下这当然非常的方便。开发者和系统管理员经常使用它打开一个通道以便于他们可以远程访问,比如在家里或者在旅行中使用笔记本电脑等场景。

然而通常来讲这些做法是违背安全策略的,跳过了防火墙管理员和安全团队保护的控制无疑是违背安全策略的,比如这些: PCI、HIPAA、NIST SP 800-53 等。它可以被黑客和外国情报机构用来在组织内留下后门。

CryptoAuditor 是一款可以控制通道穿过防火墙或者一组云端服务器入口的产品。该款产品可以配合 通用 SSH 密钥管理器Universal SSH Key Manager 来获得对 主机密钥host keys的访问以在启用防火墙并阻挡未授权转发的场景中解密 SSH 会话。

入站的 SSH 访问

对于入站访问而言,这里有几点需要说一下:

配置防火墙,并转发所有去往 22 端口的连接只能流向到一个特定的内部网络 IP 地址或者一个 DMZ 主机。在该 IP 上运行 CryptoAuditor 或者跳板机来控制和审查所有访问该组织的连接。 在防火墙上使用不同的端口访问不同的服务器。 只允许使用 IPsec 协议这样的 VPN虚拟专用网登录后连接 SSH 服务。

通过 iptables 服务限制 SSH 访问

iptables 是一款内建在 Linux 内核的宿主防火墙。通常配置用于保护服务器以防止被访问那些未明确开启的端口。

如果服务器上启用了 iptables使用下面的命令将可以允许进入的 SSH 访问,当然命令需要以 root 身份运行。

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果你想将上述命令创建的规则持久地保存,在某些系统版本中,可使用如下命令:

service iptables save

ssh-keygen

为ssh生成、管理和转换认证密钥

补充说明

ssh-keygen命令 用于为“ssh”生成、管理和转换认证密钥它支持RSA和DSA两种认证密钥。

语法

ssh-keygen(选项)

选项

-b指定密钥长度
-e读取openssh的私钥或者公钥文件
-C添加注释
-f指定用来保存密钥的文件名
-i读取未加密的ssh-v2兼容的私钥/公钥文件然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l显示公钥文件的指纹数据
-N提供一个新密语
-P提供密语
-q静默模式
-t指定要创建的密钥类型。

iptables

Linux上常用的防火墙软件

补充说明

iptables命令 是Linux上常用的防火墙软件是netfilter项目的一部分。可以直接配置也可以通过许多前端和图形界面配置。

语法

iptables(选项)(参数)

选项

-t, --table table 对指定的表 table 进行操作, table 必须是 raw natfiltermangle 中的一个。如果不指定此选项,默认的是 filter 表。

# 通用匹配:源地址目标地址的匹配
-p指定要匹配的数据包协议类型
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时address 是一个地址比如192.168.1.1;当 mask 指定时可以表示一组范围内的地址比如192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUTFORWARDPREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUTFORWARDPOSTROUTING 三个链起作用。

# 查看管理命令
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。

# 规则管理命令
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1则在链的头部插入。这也是默认的情况如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R numReplays替换/修改第几条规则

# 链管理命令(这都是立即生效的)
-P, --policy chain target :为指定的链 chain 设置策略 target。注意只有内置的链才允许有策略用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。

-j, --jump target <指定目标> 即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT也可以是用户自定义的链。
-h显示帮助信息

基本参数

参数 作用
-P 设置默认策略:iptables -P INPUT (DROP
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK加叹号"!"表示除这个IP外。
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号

命令选项输入顺序

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

工作机制

规则链名包括(也被称为五个钩子函数hook functions)

  • INPUT链 :处理输入数据包。
  • OUTPUT链 :处理输出数据包。
  • PORWARD链 :处理转发数据包。
  • PREROUTING链 用于目标地址转换DNAT
  • POSTOUTING链 用于源地址转换SNAT

防火墙的策略

防火墙策略一般分为两种,一种叫策略,一种叫策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候要分别定义多条功能其中定义数据包中允许或者不允许的策略filter过滤的功能而定义地址转换的功能的则是nat选项。为了让这些功能交替工作我们制定出了“表”这个定义来定义、区分各种不同的工作功能和处理方式。

我们现在用的比较多个功能有3个

  1. filter 定义允许或者不允许的只能做在3个链上INPUT FORWARD OUTPUT
  2. nat 定义地址转换的也只能做在3个链上PREROUTING OUTPUT POSTROUTING
  3. mangle功能:修改报文原数据是5个链都可以做PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开在里面做标记/修改内容的。而防火墙标记其实就是靠mangle来实现的。

小扩展:

  • 对于filter来讲一般只能做在3个链上INPUT FORWARD OUTPUT
  • 对于nat来讲一般也只能做在3个链上PREROUTING OUTPUT POSTROUTING
  • 而mangle则是5个链都可以做PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

iptables/netfilter这款软件是工作在用户空间的它可以让规则进行生效的本身不是一种服务而且规则是立即生效的。而我们iptables现在被做成了一个服务可以进行启动停止的。启动则将规则直接生效停止则将规则撤销。

iptables还支持自己定义链。但是自己定义的链必须是跟某种特定的链关联起来的。在一个关卡设定指定当有数据的时候专门去找某个特定的链来处理当那个链处理完之后再返回。接着在特定的链中继续检查。

注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

防火墙的策略

防火墙策略一般分为两种,一种叫策略,一种叫策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进,所以通,是要全通,而堵,则是要选择

表名包括:

  • raw :高级功能,如:网址过滤。
  • mangle 数据包修改QOS用于实现服务质量。
  • net :地址转换,用于网关路由器。
  • filter :包过滤,用于防火墙规则。

动作包括:

  • ACCEPT :接收数据包。
  • DROP :丢弃数据包。
  • REDIRECT :重定向、映射、透明代理。
  • SNAT :源地址转换。
  • DNAT :目标地址转换。
  • MASQUERADE IP伪装NAT用于ADSL。
  • LOG :日志记录。
                             ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓                         
 ┌───────────────┐           ┃    Network    ┃                         
 │ table: filter │           ┗━━━━━━━┳━━━━━━━┛                         
 │ chain: INPUT  │◀────┐             │                                 
 └───────┬───────┘     │             ▼                                 
         │             │   ┌───────────────────┐                       
  ┌      ▼      ┐      │   │ table: nat        │                       
  │local process│      │   │ chain: PREROUTING │                       
  └             ┘      │   └─────────┬─────────┘                       
         │             │             │                                 
         ▼             │             ▼              ┌─────────────────┐
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅    │     ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅      │table: nat       │
 Routing decision      └───── outing decision ─────▶│chain: PREROUTING│
┅┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅┅          ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅      └────────┬────────┘
         │                                                   │         
         ▼                                                   │         
 ┌───────────────┐                                           │         
 │ table: nat    │           ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅               │         
 │ chain: OUTPUT │    ┌─────▶ outing decision ◀──────────────┘         
 └───────┬───────┘    │      ┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅                         
         │            │              │                                 
         ▼            │              ▼                                 
 ┌───────────────┐    │   ┌────────────────────┐                       
 │ table: filter │    │   │ chain: POSTROUTING │                       
 │ chain: OUTPUT ├────┘   └──────────┬─────────┘                       
 └───────────────┘                   │                                 
                                     ▼                                 
                             ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓                         
                             ┃    Network    ┃                         
                             ┗━━━━━━━━━━━━━━━┛                         

实例

空当前的所有规则和计数

iptables -F  # 清空所有的防火墙规则
iptables -X  # 删除用户自定义的空链
iptables -Z  # 清空计数

配置允许ssh端口连接

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT  
# 22为你的ssh端口 -s 192.168.1.0/24表示允许这个网段的机器来连接其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求

允许本地回环地址可以正常使用

iptables -A INPUT -i lo -j ACCEPT  
#本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A OUTPUT -o lo -j ACCEPT

设置默认的规则

iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去

配置白名单

iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT  # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT  # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口

开启相应的服务端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口因为web对外都是这个端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来

保存规则到配置文件中

cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯
iptables-save > /etc/sysconfig/iptables 
cat /etc/sysconfig/iptables

列出已设置的规则

iptables -L [-t 表名] [链名]

  • 四个表名 rawnatfiltermangle
  • 五个规则链名 INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING
  • filter表包含INPUTOUTPUTFORWARD三个规则链
iptables -L -t nat                  # 列出 nat 上面的所有规则
#            ^ -t 参数指定,必须是 raw natfiltermangle 中的一个
iptables -L -t nat  --line-numbers  # 规则带编号
iptables -L INPUT

iptables -L -nv  # 查看,这个列表看起来更详细

清除已有规则

iptables -F INPUT  # 清空指定链 INPUT 上面的所有规则
iptables -X INPUT  # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。
                   # 如果没有指定链名,则会删除该表中所有非内置的链。
iptables -Z INPUT  # 把指定链,或者表中的所有链上的所有计数器清零。

删除已添加的规则

# 添加一条规则
iptables -A INPUT -s 192.168.1.5 -j DROP

将所有iptables以序号标记显示执行

iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则执行

iptables -D INPUT 8

开放指定的端口

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT    #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT         #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT    #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT    #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT    #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT    #允许FTP服务的20端口
iptables -A INPUT -j reject       #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT     #禁止其他未允许的规则访问

屏蔽IP

iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP  # 屏蔽恶意主机比如192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP       #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP      #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP    #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP    #封IP段即从123.45.6.1到123.45.6.254的命令是

指定数据包出去的网络接口

只对 OUTPUTFORWARDPOSTROUTING 三个链起作用。

iptables -A FORWARD -o eth0

查看已添加的规则

iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 5075  589K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 191K   90M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
1499K  133M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
4364K 6351M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
 6256  327K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 5075  589K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0  

启动网络转发规则

公网210.14.67.7让内网192.168.188.0/24上网

iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127

端口映射

本机的 2222 端口映射到内网 虚拟机的22 端口

iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22

字符串匹配

比如我们要过滤所有TCP连接中的字符串test,一旦出现它我们就终止这个连接,我们可以这么做:

iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
iptables -L

# Chain INPUT (policy ACCEPT)
# target     prot opt source               destination        
# REJECT     tcp  --  anywhere             anywhere            STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
#  
# Chain FORWARD (policy ACCEPT)
# target     prot opt source               destination        
#  
# Chain OUTPUT (policy ACCEPT)
# target     prot opt source               destination  

阻止Windows蠕虫的攻击

iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"

防止SYN洪水攻击

iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT