Linux基础服务 ·

iptables命令详解

当数据包经过防火墙,iptables 就会对一个个数据包进行规制匹配,而规则又是呈现堆栈的方式,也就是又上到下,逐条匹配了,一旦匹配成功就会执行预先定义的处理动作,若是全部规则都没能匹配上,那么将根据定义的 iptables 默认白名单或黑名单模式处理了 。

四表:raw, mangle, nat, filter

五链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

  • 而 iptables 的规则就是:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
  • 其匹配条件可以分为两大类(注意:多重条件之间的隐含逻辑为“与”操作):
  • 基本匹配条件:源地址,目标地址,传输层协议;
  • 扩展匹配条件:需要借助于扩展模块进行指定的匹配条件,扩展匹配条件又有以下两种分类;

1.隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;

2.显式扩展:隐式扩展之外的其它扩展匹配条件;

  • 一旦匹配成功后,其处理动作又可分为两类:
  • 基本动作:ACCEPT,DROP,...
  • 扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;

添加规则时的考量

(1) 报文流经的位置:用于判断将规则添加至哪个链;

(2) 实现的功能:用于判断将规则添加至哪个表;

(3) 报文的方向:用于判断哪个为“源”,哪个为“目标”;

(4) 匹配条件:用于编写能够正确匹配目标报文的规则;

iptabls命令的使用格式:

iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

rule-specification = [matches...] [target]

match = -m matchname [per-match-options]

target = -j targetname [per-target-options]

规则管理格式:

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]

-t table:指明要管理的表; 默认为 filter;

COMMANDS:

链管理:

-P:iptables [-t table] -P chain target,定义链的默认策略;其 target 一般可使用 ACCEPT 或 DROP;

-N:iptables [-t table] -N chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;

-X:iptables [-t table] -X [chain],删除自定义的空的引用计数为 0 的链;

-F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ;

-E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为 0 的链;

-Z:iptables [-t table] -Z [chain [rulenum]] [options...]

规则管理:

-A:append, iptables [-t table] -A chain rule-specification,追加规则到指定的链尾部;

-I:insert, iptables [-t table] -I chain [rulenum] rule-specification,插入规则到指定的链中的指定位置,默认为链首;

-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,删除指定的链上的指定规则;

-R:replace,iptables [-t table] -R chain rulenum rule-specification,将指定的链上的指定规则替换为新的规则;

查看:

-L:list, iptables [-t table] -L [chain [rulenum]] [options...]

-n:数字格式;

-v:verbose,详细格式信息;

-vv, -vvv

--line-numbers:显示链上的规则的编号;

-x:exactly,显示计数器的精确值;

计数器:

每条规则以及链的默认策略分别有各自的两个计数器:

(1) 匹配到的报文的个数:pkts

(2) 匹配到的所有报文的大小之积:bytes

基本匹配条件:

[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围;

[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围;

[!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";

[!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ;

[!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;

-m, --match match:显式指明要使用的扩展模块;

-j, --jump target:跳转目标;

扩展匹配条件:

隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用 -p {tcp|udp|icmp} 给定协议后可直接对给定的协议所进行的扩展;

-p tcp:可直接使用 tcp 协议对应的扩展选项;

[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;

[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

[!] --tcp-flags mask comp

SYN,ACK,FIN,RST,URG,PSH;

mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST

comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;

--tcp-flags SYN,ACK,FIN,RST SYN

[!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN

-p udp:可直接使用udp协议对应的扩展选项;

[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;

[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

-p icmp:可直接使用cimp协议对应的扩展选项;

[!] --icmp-type {type[/code]|typename}

--icmp-type 0/0:匹配对ping请求的响应报文

--icmp-type 8/0:匹配ping请求报文

显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;

1、multiport:以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified.

[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;

[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

[!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;

2、iprange:以连续的ip地址范围指明多地址匹配条件;

[!] --src-range from[-to]

[!] --dst-range from[-to]

3、string:对报文中的应用层数据做字符串匹配检测;

[!] --string pattern

[!] --hex-string pattern

--algo {bm|kmp}:字符串匹配检查算法;

--from offset

--to offset

4、time:根据报文到达的时间与指定的时间范围进行匹配度检测;

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!] --monthdays day[,day...]

[!] --weekdays day[,day...]

5、connlimit :根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;

--connlimit-upto n:连接数小于等于阈值;

--connlimit-above n:连接数超出阈值;

示例: iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

6、limit :基于收发报文的速率进行匹配;

--limit rate[/second|/minute|/hour|/day]

--limit-burst number

示例: iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT

7、state :状态检测:连接追踪机制(conntrack)

[!] --state state

NEW:新连接

ESTABLISHED:已建立的连接

RELATED:相关联的连接

INVALID:无法识别的连接

UNTRACKED:未被追踪连接;

相关的内核模块:nf_conntrack、nf_conntrack_ipv4、nf_conntrack_ftp

追踪到的连接:/proc/net/nf_conntrack文件中;能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max 建议调整至足够大;

不同的协议的连接追踪时长:/proc/sys/net/netfilter/

如何开放被动模式的ftp服务:

(1) 装载追踪ftp协议的模块:# modprobe nf_conntrack_ftp

(2) 放行入站命令连接#:iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

(3) 放行入站数据连接:# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

(4) 放行出站的ESTABLISHED连接:# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT

处理动作(跳转目标):

-j tagetname [per-target-options]

简单 target:

ACCEPT,DROP

扩展 target:

REJECT:

--reject-with type

icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为 icmp-port-unreachable;

LOG:

Turn on kernel logging of matching packets.

--log-level level

--log-prefix prefix:日志信息的前导信息;

 

保存和载入规则:

保存:iptables-save > /PATH/TO/SOME_RULE_FILE

重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE

-n, --noflush:不清除原有规则

-t, --test:仅分析生成规则集,但不予提交;

注意:重载文件中的规则,会清除已有规则;

CentOS 6:

保存规则:service iptables save

保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;

重载规则:server iptables restart

默认重载/etc/sysconfig/iptables文件中的规则

脚本配置文件:/etc/sysconfig/iptables-config;用于指明要装载的模块;

CentOS 7开机自动生效规则:

(1) firewalld服务;

(2) shell脚本,直接记录iptables命令;

(3) 自定义unit file或init script;

规则优化的思路:

(1) 优先放行双方向状态为ESTABLISHED的报文;

(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;

(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;

(4) 设置默认策略:白名单机制

(a) 可使用iptables -P设定默认策略;

(b) 建议在规则链的最后定义规则做为默认策略;

NAT: Network Address Translation

请求报文:由管理员定义;

响应报文:由NAT的conntrack机制自动实现;


请求报文:

改源地址:SNAT

改目标地址:DNAT


NAT定义在nat表;

PREROUTING,INPUT,OUTPUT,POSTROUTING

 

SNAT:POSTROUTING

DNAT:PREROUTING

PAT:

target:

SNAT:

This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.

--to-source [ipaddr[-ipaddr]]

DNAT:

This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

--to-destination [ipaddr[-ipaddr]][:port[-port]]

MASQUERADE

This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.

SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target;

REDIRECT

This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

--to-ports port[-port]

参与评论