Linux iptables 备忘

iptables主要经过存储在linux内核中的一个个表来控制IP包的。能够想象成excel表格。你能够自定义所需的iptables表。不过已经内置了三张队列表。html

  • filter 这是默认的表,包含了内建的链INPUT(处理进入的包),FORWORD(处理经过的包)和OUTPUT(处理本地生成的包)
  • nat 这个表被查询时表示遇到了产生新的链接的包,由三个内建的链构成:PREROUTING (修改到来的包)、OUTPUT(修改路由以前本地的包)、POSTROUTING(修改准备出去的包)。
  • mangle 这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由以前进入的包)和OUTPUT(修改路由以前本地的包)。

iptables包含4个表,5个链。其中表是按照对数据包的操做区分的,链是按照不一样的Hook点来区分的,表和链其实是netfilter的两个维度。linux

  4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filterweb

filter:通常的过滤功能算法

nat:用于nat功能(端口映射,地址映射等)安全

mangle:用于对特定数据包的修改bash

raw:有限级最高,设置raw时通常是为了避免再让iptables作数据包的连接跟踪处理,提升性能服务器

  5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。网络

PREROUTING:数据包进入路由表以前app

INPUT:经过路由表后目的地为本机ssh

FORWARDING:经过路由表后,目的地不为本机

OUTPUT:由本机产生,向外转发

POSTROUTIONG:发送到网卡接口以前。

iptables执行规则时,是从从规则表中从上至下顺序执行的,若是没遇到匹配的规则,就一条一条往下执行,若是遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动做(accept, reject, log等),决定下一步执行的状况。

用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改

iptables - [RI] chain rule num rule-specification[option]
用iptables - RI 经过规则的顺序指定

iptables -D chain rule num[option]
删除指定规则
iptables -[LFZ] [chain][option]
用iptables -LFZ 链名 [选项]

iptables -[NX] chain
用 -NX 指定链

iptables -P chain target[options]
指定链的默认目标

iptables -E old-chain-name new-chain-name
-E 旧的链名 新的链名 
用新的链名取代旧的链名
说明
Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。 
能够定义不一样的表,每一个表都包含几个内部的链,也能包含用户定义的链。每一个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称做'target'(目标),也能够跳向同一个表内的用户定义的链。

TARGETS
防火墙的规则指定所检查包的特征,和目标。若是包不匹配,将送往该链中下一条规则检查;若是匹配,那么下一条规则由目标值肯定.该目标值能够是用户定义的链名,或是某个专用值,如ACCEPT[经过], DROP[删除], QUEUE[排队], 或者 RETURN[返回]。
ACCEPT 表示让这个包经过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示中止这条链的匹配,到前一个链的规则从新开始。若是到达了一个内建的链(的末端),或者遇到内建链的规则是RETURN,包的命运将由链准则指定的目标决定。

TABLES
当前有三个表(哪一个表是当前表取决于内核配置选项和当前模块)。
-t table
这个选项指定命令要操做的匹配包的表。若是内核被配置为自动加载模块,这时若模块没有加载,(系统)将尝试(为该表)加载适合的模块。这些表以下:filter,这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理经过的包)和OUTPUT(处理本地生成的包)。nat,这个表被查询时表示遇到了产生新的链接的包,由三个内建的链构成:PREROUTING (修改到来的包)、OUTPUT(修改路由以前本地的包)、POSTROUTING(修改准备出去的包)。mangle 这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由以前进入的包)和OUTPUT(修改路由以前本地的包)。
OPTIONS
这些可被iptables识别的选项能够区分不一样的种类。

COMMANDS
这些选项指定执行明确的动做:若指令行下没有其余规定,该行只能指定一个选项.对于长格式的命令和选项名,所用字母长度只要保证iptables能从其余选项中区分出该指令就好了。
-A -append
在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换为多个地址时,这条规则会加到全部可能的地址(组合)后面。

-D -delete
从所选链中删除一条或更多规则。这条命令能够有两种方法:能够把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。

-R -replace
从选中的链中取代一条规则。若是源(地址)或者/与 目的(地址)被转换为多地址,该命令会失败。规则序号从1开始。

-I -insert
根据给出的规则序号向所选链中插入一条或更多规则。因此,若是规则序号为1,规则会被插入链的头部。这也是不指定规则序号时的默认方式。

-L -list
显示所选链的全部规则。若是没有选择链,全部链将被显示。也能够和z选项一块儿使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。

-F -flush
清空所选链。这等于把全部规则一个个的删除。

--Z -zero
把全部链的包及字节的计数器清空。它能够和 -L配合使用,在清空前察看计数器,请参见前文。

-N -new-chain
根据给出的名称创建一个新的用户定义链。这必须保证没有同名的链存在。

-X -delete-chain
删除指定的用户自定义链。这个链必须没有被引用,若是被引用,在删除以前你必须删除或者替换与之有关的规则。若是没有给出参数,这条命令将试着删除每一个非内建的链。


-P -policy
设置链的目标规则。

-E -rename-chain
根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可使用规则,并且内建链和用户自定义链都不能是规则的目标。

-h Help.
帮助。给出当前命令语法很是简短的说明。

PARAMETERS
参数
如下参数构成规则详述,如用于add、delete、replace、append 和 check命令。

-p -protocal [!]protocol
规则或者包检查(待检查包)的协议。指定协议能够是tcp、udp、icmp中的一个或者所有,也能够是数值,表明这些协议中的某一个。固然也可使用在/etc/protocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0至关于全部all。Protocol all会匹配全部协议,并且这是缺省时的选项。在和check命令结合时,all能够不被使用。
-s -source [!] address[/mask]
指定源地址,能够是主机名、网络名和清楚的IP地址。mask说明能够是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边"1"的个数,所以,mask值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志 --src 是这个选项的简写。

-d --destination [!] address[/mask]
指定目标地址,要获取详细说明请参见 -s标志的说明。标志 --dst 是这个选项的简写。

-j --jump target
-j 目标跳转
指定规则的目标;也就是说,若是包匹配应当作什么。目标能够是用户自定义链(不是这条规则所在的),某个会当即决定包的命运的专用内建目标,或者一个扩展(参见下面的EXTENSIONS)。若是规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增长。

-i -in-interface [!] [name]
i -进入的(网络)接口 [!][名称]
这是包经由该接口接收的可选的入口名称,包经过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名前使用"!"说明后,指的是相反的名称。若是接口名后面加上"+",则全部以此接口名开头的接口都会被匹配。若是这个选项被忽略,会假设为"+",那么将匹配任意接口。

-o --out-interface [!][name]
-o --输出接口[名称]
这是包经由该接口送出的可选的出口名称,包经过该口输出(在链FORWARD、OUTPUT和POSTROUTING中送出的包)。当在接口名前使用"!"说明后,指的是相反的名称。若是接口名后面加上"+",则全部以此接口名开头的接口都会被匹配。若是这个选项被忽略,会假设为"+",那么将匹配全部任意接口。

[!] -f, --fragment
[!] -f --分片
这意味着在分片的包中,规则只询问第二及之后的片。自那之后因为没法判断这种把包的源端口或目标端口(或者是ICMP类型的),这类包将不能匹配任何指定对他们进行匹配的规则。若是"!"说明用在了"-f"标志以前,表示相反的意思。

OTHER OPTIONS
其余选项
还能够指定下列附加选项:

-v --verbose
-v --详细
详细输出。这个选项让list命令显示接口地址、规则选项(若是有)和TOS(Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。

-n --numeric
-n --数字
数字输出。IP地址和端口会以数字的形式打印。默认状况下,程序试显示主机名、网络名或者服务(只要可用)。

-x -exact
-x -精确
扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。这个选项仅能用于 -L 命令。

--line-numbers
当列表显示规则时,在每一个规则的前面加上行号,与该规则在链中的位置相对应。

MATCH EXTENSIONS
对应的扩展
iptables可以使用一些与模块匹配的扩展包。如下就是含于基本包内的扩展包,并且他们大多数均可以经过在前面加上!来表示相反的意思。

tcp
当 --protocol tcp 被指定,且其余匹配的扩展未被指定时,这些扩展被装载。它提供如下选项:

--source-port [!] [port[:port]]
源端口或端口范围指定。这能够是服务名或端口号。使用格式端口:端口也能够指定包含的(端口)范围。若是首端口号被忽略,默认是"0",若是末端口号被忽略,默认是"65535",若是第二个端口号大于第一个,那么它们会被交换。这个选项可使用 --sport的别名。

--destionation-port [!] [port:[port]]
目标端口或端口范围指定。这个选项可使用 --dport别名来代替。

--tcp-flags [!] mask comp
匹配指定的TCP标记。第一个参数是咱们要检查的标记,一个用逗号分开的列表,第二个参数是用逗号分开的标记表,是必须被设置的。标记以下:SYN ACK FIN RST URG PSH ALL NONE。所以这条命令:iptables -A FORWARD -p tcp --tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN标记被设置而ACK、FIN和RST标记没有设置的包。

[!] --syn
只匹配那些设置了SYN位而清除了ACK和FIN位的TCP包。这些包用于TCP链接初始化时发出请求;例如,大量的这种包进入一个接口发生堵塞时会阻止进入的TCP链接,而出去的TCP链接不会受到影响。这等于 --tcp-flags SYN, RST, ACK SYN。若是"--syn"前面有"!"标记,表示相反的意思。

--tcp-option [!] number
匹配设置了TCP选项的。

udp
当protocol udp 被指定,且其余匹配的扩展未被指定时,这些扩展被装载,它提供如下选项:

--source-port [!] [port:[port]]
源端口或端口范围指定。详见 TCP扩展的--source-port选项说明。

--destination-port [!] [port:[port]]
目标端口或端口范围指定。详见 TCP扩展的--destination-port选项说明。

icmp
当protocol icmp被指定,且其余匹配的扩展未被指定时,该扩展被装载。它提供如下选项:
--icmp-type [!] typename
这个选项容许指定ICMP类型,能够是一个数值型的ICMP类型,或者是某个由命令iptables -p icmp -h所显示的ICMP类型名。

mac
--mac-source [!] address
匹配物理地址。必须是XX:XX:XX:XX:XX这样的格式。注意它只对来自以太设备并进入PREROUTING、FORWORD和INPUT链的包有效。

limit
这个模块匹配标志用一个标记桶过滤器一必定速度进行匹配,它和LOG目标结合使用来给出有限的登录数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了"!"标记)

--limit rate
最大平均匹配速率:可赋的值有'/second', '/minute', '/hour', or '/day'这样的单位,默认是3/hour。

--limit-burst number
待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5

multiport
这个模块匹配一组源端口或目标端口,最多能够指定15个端口。只能和-p tcp 或者 -p udp 连着使用。

--source-port [port[, port]]
若是源端口是其中一个给定端口则匹配

--destination-port [port[, port]]
若是目标端口是其中一个给定端口则匹配

--port [port[, port]]
若源端口和目的端口相等并与某个给定端口相等,则匹配。
mark
这个模块和与netfilter过滤器标记字段匹配(就能够在下面设置为使用MARK标记)。

--mark value [/mask]
匹配那些无符号标记值的包(若是指定mask,在比较以前会给掩码加上逻辑的标记)。

owner
此模块试为本地生成包匹配包建立者的不一样特征。只能用于OUTPUT链,并且即便这样一些包(如ICMP ping应答)还可能没有全部者,所以永远不会匹配。

--uid-owner userid
若是给出有效的user id,那么匹配它的进程产生的包。

--gid-owner groupid
若是给出有效的group id,那么匹配它的进程产生的包。

--sid-owner seessionid
根据给出的会话组匹配该进程产生的包。

state
此模块,当与链接跟踪结合使用时,容许访问包的链接跟踪状态。

--state state
这里state是一个逗号分割的匹配链接状态列表。可能的状态是:INVALID表示包是未知链接,ESTABLISHED表示是双向传送的链接,NEW表示包为新的链接,不然是非双向传送的,而RELATED表示包由新链接开始,可是和一个已存在的链接在一块儿,如FTP数据传送,或者一个ICMP错误。

unclean
此模块没有可选项,不过它试着匹配那些奇怪的、不常见的包。处在实验中。

tos
此模块匹配IP包首部的8位tos(服务类型)字段(也就是说,包含在优先位中)。

--tos tos
这个参数能够是一个标准名称,(用iptables -m tos -h 察看该列表),或者数值。

TARGET EXTENSIONS
iptables可使用扩展目标模块:如下都包含在标准版中。

LOG
为匹配的包开启内核记录。当在规则中设置了这一选项后,linux内核会经过printk()打印一些关于所有匹配包的信息(诸如IP包头字段等)。
--log-level level
记录级别(数字或参看 syslog.conf(5))。
--log-prefix prefix
在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其余信息区别。

--log-tcp-sequence
记录TCP序列号。若是记录能被用户读取那么这将存在安全隐患。

--log-tcp-options
记录来自TCP包头部的选项。
--log-ip-options
记录来自IP包头部的选项。

MARK
用来设置包的netfilter标记值。只适用于mangle表。

--set-mark mark

REJECT
做为对匹配的包的响应,返回一个错误的包:其余状况下和DROP相同。

此目标只适用于INPUT、FORWARD和OUTPUT链,和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性:

--reject-with type
Type能够是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited,该类型会返回相应的ICMP错误信息(默认是port-unreachable)。选项 echo-reply也是容许的;它只能用于指定ICMP ping包的规则中,生成ping的回应。最后,选项tcp-reset能够用于在INPUT链中,或自INPUT链调用的规则,只匹配TCP协议:将回应一个TCP RST包。
TOS
用来设置IP包的首部八位tos。只能用于mangle表。

--set-tos tos
你可使用一个数值型的TOS 值,或者用iptables -j TOS -h 来查看有效TOS名列表。
MIRROR
这是一个试验示范目标,可用于转换IP首部字段中的源地址和目标地址,再传送该包,并只适用于INPUT、FORWARD和OUTPUT链,以及只调用它们的用户自定义链。

SNAT
这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址(此链接之后全部的包都会被影响),中止对规则的检查,它包含选项:

--to-source [-][:port-port]
能够指定一个单一的新的IP地址,一个IP地址范围,也能够附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。若是未指定端口范围,源端口中512如下的(端口)会被安置为其余的512如下的端口;512到1024之间的端口会被安置为1024如下的,其余端口会被安置为1024或以上。若是可能,端口不会被修改。

--to-destiontion [-][:port-port]
能够指定一个单一的新的IP地址,一个IP地址范围,也能够附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。若是未指定端口范围,目标端口不会被修改。

MASQUERADE
只用于nat表的POSTROUTING链。只能用于动态获取IP(拨号)链接:若是你拥有静态IP地址,你要用SNAT。假装至关于给包发出时所通过接口的IP地址设置一个映像,当接口关闭链接会终止。这是由于当下一次拨号时未必是相同的接口地址(之后全部创建的链接都将关闭)。它有一个选项:

--to-ports [-port>]
指定使用的源端口范围,覆盖默认的SNAT源地址选择(见上面)。这个选项只适用于指定了-p tcp或者-p udp的规则。

REDIRECT
只适用于nat表的PREROUTING和OUTPUT链,和只调用它们的用户自定义链。它修改包的目标IP地址来发送包到机器自身(本地生成的包被安置为地址127.0.0.1)。它包含一个选项:

--to-ports [ ]
指定使用的目的端口或端口范围:不指定的话,目标端口不会被修改。只能用于指定了-p tcp 或 -p udp的规则。

DIAGNOSTICS
诊断
不一样的错误信息会打印成标准错误:退出代码0表示正确。相似于不对的或者滥用的命令行参数错误会返回错误代码2,其余错误返回代码为1。

与ipchains的兼容性
iptables和Rusty Russell的ipchains很是类似。主要区别是INPUT 链只用于进入本地主机的包,而OUTPUT只用于自本地主机生成的包。所以每一个包只通过三个链的一个;之前转发的包会通过全部三个链。其余主要区别是 -i 引用进入接口;-o引用输出接口,二者都适用于进入FORWARD链的包。当和可选扩展模块一块儿使用默认过滤器表时,iptables是一个纯粹的包过滤器。这能大大减小之前对IP假装和包过滤结合使用的混淆,因此如下选项做了不一样的处理:
-j MASQ
-M -S
-M -L
在iptables中有几个不一样的链。
命令参数
ACCEPT 将封包放行,进行完此处理动做后,将再也不比对其它规则,直接跳往下一个规则炼(nat:postrouting)。 
 REJECT 拦阻该封包,并传送封包通知对方,能够传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动做后,将再也不比对其它规则,直接 中断过滤程序。 范例以下: 
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset 
 DROP 丢弃封包不予处理,进行完此处理动做后,将再也不比对其它规则,直接中断过滤程序。 
 REDIRECT 将封包从新导向到另外一个端口(PNAT),进行完此处理动做后,将 会继续比对其它规则。 这个功能能够用来实做通透式 porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 
 MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,能够指定 port 对应的范围,进行完此处理动做后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不一样,当进行 IP 假装时,不需指定要假装成哪一个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 一般是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例以下:  
 iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动做后,将会继续比对其它规则。例如: 
  iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,能够指定 port 对应的范围,进行完此处理动做后,将直接跳往下一个规则炼(mangle:postrouting)。范例以下: 
  iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,能够指定 port 对应的范围,进行完此处理动做后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例以下: 
  iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR 镜射封包,也就是未来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动做后,将会中断过滤程序。 
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,能够进行其它应用,例如:计算联机费用.......等。 
RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,若是把自订规则炼当作是一个子程序,那么这个动做,就至关于提前结束子程序并返回到主程序中。 
MARK 将封包标上某个代号,以便提供做为后续过滤的条件判断依据,进行完此处理动做后,将会继续比对其它规则。范例以下: 
  iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
处理动做
iptables 匹配规则
1.    源地址匹配:
    a.    ip地址匹配        
        iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP

        用“,”分隔多个源地址,地址与“,”之间不能有空格

    b.    网段匹配
        iptables -t filter -I INPUT -s 192.168.1.0/24 -j DROP

    c.    反向匹配
        iptables -t filter -I INPUT ! -s 192.168.1.10 -j ACCEPT

        当源地址不是192.168.1.10时ACCEPT,注意!当源地址是192.168.1.10时,此规则匹配不上,不会由于此规则而拒绝!



2.    目的地址匹配:
    参数 -d ,使用方法与源地址匹配一致



3.    协议匹配:
    参数 -p :protocol

    iptables -t filter -A INPUT -p tcp -j ACCEPT

    -p支持的协议有:tcp, udp, udplite, icmp, icmpv6, ah, sctp等

     其中ping属于icmp协议,ssh属于tcp协议



4.    网卡匹配
     iptables -t filter -I INPUT -i eth0 -j ACCEPT

    参数 -i, -o, 其中-i表示入网卡,-o表示出网卡。-i参数可用于prerouting,forward,input。3个链。-o参数可用于forward,output,postrouting。3个链。也可用使用“!”表示反向匹配

 

5.    扩展匹配
    端口匹配:
    上述4种匹配规则都属于基本匹配,端口匹配属于扩展匹配,须要导入扩展模块而且须要指定匹配协议

    例:    iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j ACCEPT

    其中 -p 指定协议,-m 指定扩展模块,--dport/--sport 指定目的端口/源端口(注意双中横线),-m可缺省,默认使用与-p相同的模块

    其余用法:

        反向匹配: ! --dport 22       目的端口不等于22

        区间匹配:  --dport 22:25      目的端口在[22,25]之间

                           --dport 22:          目的端口在[22:65535]之间

                           --dport :80          目的端口在[0:80]之间

        离散端口匹配:   iptables -t filter -I INPUT -p tcp -m multiport --dport 1,2,3,4



    连续ip匹配:
    例:    iptables -t filter -I INPUT -m iprange --src-range 1.1.1.1-1.1.1.4 -j DROP

    也可使用!来取反,如:iptables -t filter -I INPUT -m iprange ! --src-range 1.1.1.1-1.1.1.4 -j DROP



    报文内容匹配:
    例:    iptables -t filter -I INPUT -m string --algo bm --string "XXOO" -j ACCEPT
               含义:当报文中含有“XXOO”时,经过报文。字符串匹配算法使用 bm

               其中: --algo 指定匹配算法。包括bm与kmp。

                          --string 须要匹配的字符串



    时间段匹配:
    例:    iptables -t filter -I INPUT -m time --timestart 09:00:00 --timestop 19:00:00 -p tcp --dport 80 -j ACCEPT
               含义:在09到19点时间内,拒绝全部从80端口进入的tcp请求

                time 模块参数

                --timestart    起始时间

                --timeend    结束时间

                --weekdays    星期n,可选值有1到7,也有Mon,Tue,Wed,Thu,Fri,Sat,Sun。可使用!取反

                --monthdays    一个月的第几天。可使用!取反

                --datestart    一个月的起始天数

                --dateend  一个月的结束天数

    例:    iptables -t filter -I INPUT -m time ! --weekdays 6,7 ! --monthdays 22.23 --timestart 09:00:00 --timestop 19:00:00 --datestart 2018-10-10 --datestop 2018-12-12 -p tcp --dport 80 -j ACCEPT

                  含义:当(今天不是星期6或星期7)且(今天不本月的22或23好)且(当前时间在09到19点之间)且(今天的日志在2018-10-10到2018-12-12号之间)且(是TCP协议)且(目标端口是80)则接受请求

             
    链接数匹配:
    例:iptables -I INPUT -m connlimit --connlimit-above 2 --connlimit-mask 24 -j ACCEPT
    含义: 当ip地址是24位掩码,且链接数超过2则接受请求
             --connlimit-above    链接数超过n时

             --connlimit-upto    等价于 !--connlimit-above 当链接数未达到之低昂链接数时


    报文速率限制:
    例:iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
    含义:当每分钟收到包数量在10之内,则接受请求
    可是当每分钟数量超过10个时,没有相应逻辑,当想要完成超过10请求每分钟则拒绝请求的逻辑须要配合一条拒绝逻辑使用。如:

    

    参数:

            --limit-brust   表示“令牌桶”算法中令牌的数量,默认为5

            --limit  结合令牌桶算法,能够理解为生成令牌的速率。白话可粗略理解为放过包的速率

                可选速率限制参数:

                    /second,/minute,/hour,/day表示n个请求每秒/分/小时/天

            其中:令牌桶逻辑为:每创建一个请求须要消耗一个令牌,请求释放时销毁令牌。当没有可用令牌时,请求被拒绝。在默认5令牌的状况下,10/minute 不是每6秒接受一个请求,而是每6秒生成一个令牌到令牌桶。只要桶中有令牌请求就能够经过。limit-brust表示令牌桶中的令牌最大值

    icmp协议限制:
    常见的使用icmp协议的操做就是ping,能够经过此模块限制ping的接收与发送
    例:iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT

           含义:不接受ping请求,可是能够执行ping操做

    --icmp-type表示 icmp请求类型,8/0分别表示type/code。细节见下图(来自朱双印先生的博客http://www.zsythink.net/archives/1588)



    请求state限制:
    请求有5种状态:NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED五种
    若是咱们的机器不但愿被别人主动链接,只但愿接接受别人对咱们的请求作出的相应,可这样作

    iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    表示接受ESTABLISHED和RELATED的请求,固然想要达到不响应别人的请求,须要在此以后加一条拒绝全部请求
匹配规则

 

 

 

 

  • 查看某个表中的iptables规则,默认的是filter表

      iptables -t [table] -L     


 首先开启IP转发功能,默认是关闭的

临时修改:修改事后就立刻生效,但若是系统重启后则又恢复为默认值0。
# echo 1 >/proc/sys/net/ipv4/ip_forward
永久修改方法1:
vi /etc/sysctl.conf
# 找到下面的值并将0改为1  默认值是禁止ip转发,修改成即开启ip转发功能。
net.ipv4.ip_forward = 1
# sysctl –p(使之当即生效)
01

#永久修改方法2: 
echo 'net.ipv4.ip_forword=1' >> /etc/sysctl.conf sysctl -p

 


 配置端口转发

假设用户访问172.16.4.247:728时我想让它转发到172.16.4.97:80:

# iptables -t nat -A PREROUTING  -p tcp -d 113.108.110.61 --dport 728 -j DNAT --to-destination 172.16.4.97:80           PREROUTING (修改到来的包)DNAT 改写封包目的地
# iptables -t nat -A POSTROUTING -p tcp -s 172.16.4.97 --sport 80 -j SNAT --to-source 172.16.4.247             POSTROUTING(修改准备出去的包)SNAT 改写封包来源
# service iptables save                                                          (将当前规则保存到 /etc/sysconfig/iptables)

或者,你也能够直接修改文件:/etc/sysconfig/iptables

  -A PREROUTING -d 172.16.4.247/32 -p tcp -m tcp --dport 728 -j DNAT --to-destination 172.16.4.97:80
  -A POSTROUTING -s 172.16.4.97/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 172.16.4.247

最后不要忘了开放728端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 728 -j ACCEPT

配置完成后,记得重启防火墙:
# service iptables restart
tcp 端口范围映射
# iptables -t nat -A PREROUTING -p tcp --dport 2000:2500 -j DNAT --to 192.168.66.2:2000-2500

 


端口转发匹配验证 nat内机器输出源端口是9999  

  tcpdump -i eth0 -tnn  port 9999

nat外机器:发出的数据包源端口是9999, 目的端口是5500-5555

  sudo nc -v -u -p 9999 172.16.20.183 5500-5555


端口转发双向通讯验证:

  nat里面的机器打开监听:

  [root@CentOS ~]# nc -l -u 5555

  nat外面的机器向nat 发送数据

  nc -u 172.16.20.183 5555

 


 

 Iptables 指南 1.1.19

相关文章
相关标签/搜索