--- title: linux 常用命令-网络应用 date: 2018/02/27 categories: - linux tags: - linux - command --- - [linux 常用命令-网络应用](#linux-常用命令-网络应用) - [curl](#curl) - [补充说明](#补充说明) - [语法](#语法) - [选项](#选项) - [实例](#实例) - [wget](#wget) - [补充说明](#补充说明-1) - [语法](#语法-1) - [选项](#选项-1) - [参数](#参数) - [实例](#实例-1) - [telnet](#telnet) - [补充说明](#补充说明-2) - [语法](#语法-2) - [选项](#选项-2) - [参数](#参数-1) - [实例](#实例-2) - [ip](#ip) - [补充说明](#补充说明-3) - [语法](#语法-3) - [选项](#选项-3) - [参数](#参数-2) - [实例](#实例-3) - [iptables](#iptables) - [补充说明](#补充说明-4) - [语法](#语法-4) - [选项](#选项-4) - [基本参数](#基本参数) - [命令选项输入顺序](#命令选项输入顺序) - [工作机制](#工作机制) - [防火墙的策略](#防火墙的策略) - [防火墙的策略](#防火墙的策略-1) - [实例](#实例-4) - [空当前的所有规则和计数](#空当前的所有规则和计数) - [配置允许ssh端口连接](#配置允许ssh端口连接) - [允许本地回环地址可以正常使用](#允许本地回环地址可以正常使用) - [设置默认的规则](#设置默认的规则) - [配置白名单](#配置白名单) - [开启相应的服务端口](#开启相应的服务端口) - [保存规则到配置文件中](#保存规则到配置文件中) - [列出已设置的规则](#列出已设置的规则) - [清除已有规则](#清除已有规则) - [删除已添加的规则](#删除已添加的规则) - [开放指定的端口](#开放指定的端口) - [屏蔽IP](#屏蔽ip) - [指定数据包出去的网络接口](#指定数据包出去的网络接口) - [查看已添加的规则](#查看已添加的规则) - [启动网络转发规则](#启动网络转发规则) - [端口映射](#端口映射) - [字符串匹配](#字符串匹配) - [阻止Windows蠕虫的攻击](#阻止windows蠕虫的攻击) - [防止SYN洪水攻击](#防止syn洪水攻击) # 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请求** ```bash 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请求** ```bash curl -d "param1=value1¶m2=value2" "http://www.wangchujiang.com" ``` **json格式的post请求** ```bash 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支持HTTP,HTTPS和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地址是否正确? 1. 确认ip地址对应的主机是否已经开机? 1. 如果主机已经启动,确认路由设置是否设置正确?(使用route命令查看) 1. 如果主机已经启动,确认主机上是否开启了telnet服务?(使用netstat命令查看,TCP的23端口是否有LISTEN状态的行) 1. 如果主机已经启动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:显示网络对象支持的操作命令的帮助信息。 ``` ### 实例 ```bash 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: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff 3: eth1: 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: 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: 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: 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}' ``` ## iptables Linux上常用的防火墙软件 ### 补充说明 **iptables命令** 是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。 ### 语法 ``` iptables(选项)(参数) ``` ### 选项 ```bash -t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 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 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。 -o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。 # 查看管理命令 -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 num:Replays替换/修改第几条规则 # 链管理命令(这都是立即生效的) -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|ACCEPT) | | -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个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING 我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。 小扩展: - 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT - 对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING - 而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。 iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。 注意:规则的次序非常关键,`谁的规则越严格,应该放的越靠前`,而检查规则的时候,是按照从上往下的方式进行检查的。 #### 防火墙的策略 防火墙策略一般分为两种,一种叫`通`策略,一种叫`堵`策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进,`所以通,是要全通,而堵,则是要选择`。 表名包括: - **raw** :高级功能,如:网址过滤。 - **mangle** :数据包修改(QOS),用于实现服务质量。 - **net** :地址转换,用于网关路由器。 - **filter** :包过滤,用于防火墙规则。 动作包括: - **ACCEPT** :接收数据包。 - **DROP** :丢弃数据包。 - **REDIRECT** :重定向、映射、透明代理。 - **SNAT** :源地址转换。 - **DNAT** :目标地址转换。 - **MASQUERADE** :IP伪装(NAT),用于ADSL。 - **LOG** :日志记录。 ```bash ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓ ┌───────────────┐ ┃ 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 ┃ ┗━━━━━━━━━━━━━━━┛ ``` ### 实例 #### 空当前的所有规则和计数 ```bash iptables -F # 清空所有的防火墙规则 iptables -X # 删除用户自定义的空链 iptables -Z # 清空计数 ``` #### 配置允许ssh端口连接 ```bash 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表示接受这样的请求 ``` #### 允许本地回环地址可以正常使用 ```bash iptables -A INPUT -i lo -j ACCEPT #本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许 iptables -A OUTPUT -o lo -j ACCEPT ``` #### 设置默认的规则 ```bash iptables -P INPUT DROP # 配置默认的不让进 iptables -P FORWARD DROP # 默认的不允许转发 iptables -P OUTPUT ACCEPT # 默认的可以出去 ``` #### 配置白名单 ```bash 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端口 ``` #### 开启相应的服务端口 ```bash 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 # 已经建立的连接得让它进来 ``` #### 保存规则到配置文件中 ```bash cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯 iptables-save > /etc/sysconfig/iptables cat /etc/sysconfig/iptables ``` #### 列出已设置的规则 > iptables -L [-t 表名] [链名] - 四个表名 `raw`,`nat`,`filter`,`mangle` - 五个规则链名 `INPUT`、`OUTPUT`、`FORWARD`、`PREROUTING`、`POSTROUTING` - filter表包含`INPUT`、`OUTPUT`、`FORWARD`三个规则链 ```bash iptables -L -t nat # 列出 nat 上面的所有规则 # ^ -t 参数指定,必须是 raw, nat,filter,mangle 中的一个 iptables -L -t nat --line-numbers # 规则带编号 iptables -L INPUT iptables -L -nv # 查看,这个列表看起来更详细 ``` #### 清除已有规则 ```bash iptables -F INPUT # 清空指定链 INPUT 上面的所有规则 iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。 # 如果没有指定链名,则会删除该表中所有非内置的链。 iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零。 ``` #### 删除已添加的规则 ```bash # 添加一条规则 iptables -A INPUT -s 192.168.1.5 -j DROP ``` 将所有iptables以序号标记显示,执行: ``` iptables -L -n --line-numbers ``` 比如要删除INPUT里序号为8的规则,执行: ```bash 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的命令是 ``` #### 指定数据包出去的网络接口 只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。 ```bash 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`上网 ```bash iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127 ``` #### 端口映射 本机的 2222 端口映射到内网 虚拟机的22 端口 ```bash 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`,一旦出现它我们就终止这个连接,我们可以这么做: ```bash 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蠕虫的攻击 ```bash iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe" ``` #### 防止SYN洪水攻击 ```bash iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT ```