iptables
-
包过滤型的防火墙
-
Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件;
-
主机防火墙
网络防火墙 -
软件防火墙(软件逻辑)
硬件防火墙(硬件和软件逻辑)
-
-
版本
- ipfw (firewall framework):命令行工具,生成规则并送往内核
- ipchains (firewall framework):生成规则
-
iptables(netfilter)
- iptables:rules until,位于用户空间的通用规则编写工工具
-
netfilter:工作在kernel
-
hook function(钩子函数)
input
output
forward
prerouting
postrouting
-
hook function(钩子函数)
-
iptables的链:内置链和自定义链
-
内置链:对应于hook function
-
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
-
PREROUTING
- 自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制;被内置链调用
-
内置链:对应于hook function
-
功能:
-
filter:过滤,防火墙;
nat:network address translation;用于修改源IP或目标IP,也可以改端口;
mangle:拆解报文,做出修改,并重新封装起来;修改除源地址、目标地址以外的其他属性;LVS会使用到;
raw:关闭nat表上启用的连接追踪机制;
-
filter:过滤,防火墙;
-
功能<–>链:
- 在同一链上的不同功能生效的顺序,由其功能的优先级决定:raw > mangle > ant > filter
-
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
-
报文流向:
-
流入本机:PREROUTING –> INPUT
由本机流出:OUTPUT –> POSTROUTING
转发:PREROUTING –> FORWARD –> POSTROUTING
-
流入本机:PREROUTING –> INPUT
-
路由功能发生的时刻:
-
报文进入本机后:PREROUTING之后;
判断目标主机是?
报文离开本机之前:POSTROUTING之前
判断经由哪个接口送往下一站?
-
报文进入本机后:PREROUTING之后;
-
规则:
-
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
-
匹配条件:
-
基本匹配条件
扩展匹配条件
-
基本匹配条件
-
处理动作:
-
基本处理动作
扩展处理动作
自定义处理机制
-
基本处理动作
-
匹配条件:
-
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
-
添加规则时的考量点:
- 通过要实现哪种功能:判断添加到哪个表上;
-
通过报文流经的路径:判断添加到哪个链上;
-
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
- 同类规则(访问同一应用),匹配范围小的放上面;
- 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
- 将那些可由一条规则描述的多个规则合并起来;
-
设置默认策略;使用白名单机制;
- 不建议使用:iptables -P
- 在规则的最后定义规则作为默认策略;
- 同为放行规则时,允许的规则,匹配范围大的放上面
- 同为放行规则时,拒绝的规则,把匹配范围小的放上面
iptables
-
iptables启动与配置
-
CentOS 6:
-
service iptables {start|stop|restart|status}
-
start:读取事先保存的规则,并应用到netfilter上;
stop:清空netfilter上的规则,以及还原默认策略等;
status:显示生效的规则;
restart:清空netfilter上的规则,再读取事先保存的规则,并应用到netfilter上;
-
start:读取事先保存的规则,并应用到netfilter上;
-
默认的规则文件:/etc/sysconfig/iptables
-
checkconfig iptables on|off;开机是否启动
-
-
CentOS 7:
-
systemctl start|stop|restart|status firewalld.service
-
systemctl disable firewalld.service
-
systemctl stop firewalld.service
-
-
-
命令选项
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 table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]`
-
-t table:
raw, mangle, nat, [filter] -
COMMAND:如何管理chain的命令
-
链管理:
- -N:new, 自定义一条新的规则链;
- -X: delete,删除自定义的规则链;
-
-P:Policy,设置默认策略;
对filter表中的链而言,其默认策略有:ACCEPT:接受;DROP:丢弃;REJECT:拒绝; - -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
-
规则管理:
- -A:append,追加;
- -I:insert, 插入,要指明位置,省略时表示第一条;
-
-D:delete,删除;
- 指明规则序号;
- 指明规则本身;
- -R:replace,替换指定链上的指定规则;
- -F:flush,清空指定的规则链;
-
-Z:zero,置零;
iptables的每条规则都有两个计数器:- 匹配到的报文的个数;pkts
- 匹配到的所有报文的大小之和;bytes
-
查看:
-
-L:list, 列出指定鏈上的所有规则;
-
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;-vv, -vvv
-x:exactly,显示计数器结果的精确值;
–line-numbers:显示规则的序号;
-
-n:numberic,以数字格式显示地址和端口号;
-
-L:list, 列出指定鏈上的所有规则;
-
链管理:
-
chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-
匹配条件:-m matchname [per-match-optinons]
-
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
[!] -s, –source address[/mask][,…]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, –destination address[/mask][,…]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
[!] -p, –protocol protocol (/etc/protocols中的协议名)protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all" 主要讲:{tcp|udp|icmp}
[!] -i, –in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
[!] -o, –out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链; 扩展匹配条件: 需要加载扩展模块,方可生效;
-
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
-
tcp:
[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围; [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围; [!] --tcp-flags mask comp mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST comp is a comma-separated list of flags which must be set,例如SYN 例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0; [!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
-
udp
[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围; [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
-
icmp
[!] --icmp-type {type[/code]|typename} echo-request:8 (ping请求) ~]# iptables -A INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP 自己可以ping其他主机,其他主机ping不了自己 echo-reply:0 (ping回应)
-
tcp:
-
显式扩展:必须显式地指明使用的扩展模块进行的扩展;[-m matchname [per-match-options]];
-
使用帮助
- CentOS 6:man iptables
- CentOS 7:man iptables-extensions
-
multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口; [!] --ports port[,port|,port:port]...:指明多个端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport –dports 22,80 -j ACCEPT
-
iprange扩展
指明连续的(但一般不能扩展为整个网络)ip地址范围;[!] --src-range from[-to]:源IP地址; [!] --dst-range from[-to]:目标IP地址;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp –dport 80 -m iprange –src-range 172.16.100.5-172.16.100.10 -j DROP
-
string扩展
对报文中的应用层数据做字符串模式匹配检测;对明文编码的协议生效;--algo {bm|kmp}:字符串匹配检测算法; bm:Boyer-Moore kmp:Knuth-Pratt-Morris [!] --string pattern:要检测的字符串模式; [!] --hex-string pattern:要检测的字符串模式,16进制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp –sport 80 -m string –algo bm –string “gay” -j REJECT
-
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...] --kerneltz:使用内核上的时区,而非默认的UTC;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp –dport 80 -m time –timestart 14:30 –timestop 18:30 –weekdays Sat,Sun –kerneltz -j DROP
-
connlimit扩展(连接限制)
根据每客户端IP做并发连接数数量匹配;--connlimit-upto n:连接的数量小于等于n时匹配; --connlimit-above n:连接的数量大于n时匹配; 使用时,根据默认策略是允许还是拒绝使用
~]# iptables -A INPUT -d 172.16.100.67 -p tcp –dport 21 -m connlimit –connlimit-above 2 -j REJECT
-
limit扩展
基于收发报文的速率做匹配;
采用令牌桶过滤器;--limit rate[/second|/minute|/hour|/day] 平均速率 --limit-burst number 峰值数量
~]# iptables -I INPUT -d 172.16.100.67 -p icmp –icmp-type 8 -m limit –limit 3/minute –limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT -
state扩展
-
根据”连接追踪机制“去检查连接的状态;
- 在内核的内存空间当中,把每一个请求的连接和本机出去的连接,彼此之间通过模板建立起关联关系,从而能够追踪来本机访问的每一个客户端和本机响应的每一个响应报文或响应链接,它们二者之间有什么关系;
-
conntrack机制:追踪本机上的请求和响应之间的关系;因此,能使得对所有请求报文的响应能够定义的状态,有如下几种:
- NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
- ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
- RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
- INVALID:无效的连接;
- UNTRACKED:未进行追踪的连接;
-
[!] –state state
-
不同的协议的连接追踪时长:
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
-
调整连接追踪功能所能够容纳的最大连接数量:
/proc/sys/net/nf_contrack_max
-
已经追踪到到的并记录下来的连接:
/proc/net/nf_conntrack
-
不同协议的连接追踪时长
/proc/sys/net/netfilter/
-
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时
-
方法一:
加大nf_conntrack_max 值vi /etc/sysctl.conf net.ipv4.nf_conntrack_max = 393216 net.ipv4.netfilter.nf_conntrack_max = 393216
-
方法二:
降低 nf_conntrack timeout时间,越少就会越快的腾出空间vi /etc/sysctl.conf net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300 net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
-
方法一:
-
根据”连接追踪机制“去检查连接的状态;
-
使用帮助
-
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
-
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
-
处理动作:-j targetname [per-target-options]
-
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
RETURN:返回调用链;
REDIRECT:端口重定向;
LOG:记录日志;
MARK:做防火墙标记;
DNAT:目标地址转换;
SNAT:源地址转换;
MASQUERADE:地址伪装;
…
自定义链 -
Target:
- ACCEPT, DROP, REJECT, RETURN
-
LOG, SNAT, DNAT, REDIRECT, MASQUERADE,…
LOG:既不做拒绝,也不做允许,只是做日志 --log-level level 指明日志级别 --log-prefix prefix 日志前缀
-
ACCEPT:接受
-
-
如何使用自定义链:
-
自定义链:需要被调用才能生效;自定义链最后需要定义返回规则;
-
返回规则使用的target叫做RETURN;
-
被调用后的自定义链,不可再被重新引用、重新命名、删除,除非清空规则并解除引用,
添加自定义链: [root@station77 ~]# iptables -N icmp [root@station77 ~]# iptables -L -n Chain icmp (0 references) target prot opt source destination 重命名:引用次数为0,是可以直接重命名的 [root@station77 ~]# iptables -E icmp in-icmp [root@station77 ~]# iptables -L -n Chain in-icmp (0 references) target prot opt source destination 向自定义链中添加规则: [root@station77 ~]# iptables -A in-icmp -d 172.16.251.77 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT [root@station77 ~]# iptables -L -n Chain in-icmp (0 references) target prot opt source destination ACCEPT icmp -- 0.0.0.0/0 172.16.251.77 icmptype 8 state NEW 调用链: 在INPUT上附加规则 iptables -A INPUT -j in-icmp 如果匹配不到,返回主链 iptables -A in-icmp -j RETURN
-
-
规则的有效期限
-
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;kernel如果不重启,其一直有效;
-
保存规则:
保存规则至指定的文件:CentOS 6: ~]# service iptables save 将规则保存至/etc/sysconfig/iptables文件中;如果iptables设置开机启动,则开机时会读取此文件; ~]# iptables-save > /PATH/TO/SOME_RULES_FILE CentOS 7: ~]# iptables-save > /PATH/TO/SOME_RULES_FILE
-
重新载入预存规则文件中规则:
CentOS 7: ~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE CentOS 6: ~]# service iptables restart
-
自动生效规则文件中的规则:
-
用脚本保存各iptables命令;让此脚本开机后自动运行;
/etc/rc.d/rc.local文件中添加脚本路径; /PATH/TO/SOME_SCRIPT_FILE
-
用规则文件保存各规则,开机时自动载入此规则文件中的规则;
/etc/rc.d/rc.local文件添加: iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
-
用脚本保存各iptables命令;让此脚本开机后自动运行;
-
CentOS 7:
引入了新的iptables前端管理工具firewalld,其管理工具有:firewalld-cmd, firewalld-config
-
-
iptables/netfilter网络防火墙:
- 网关;
- filter表的FORWARD链;
-
要注意的问题:
- 请求-响应报文均会经由FORWARD链,要注意规则的方向性;
- 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;
-
NAT: Network Address Translation
-
请求报文:由管理员定义;
-
改源地址:SNAT,MASQUERADE
改目标地址:DNAT
-
改源地址:SNAT,MASQUERADE
- 响应报文:由NAT的conntrack机制自动实现;
-
请求报文:由管理员定义;
-
NAT定义在nat表;PREROUTING,INPUT,OUTPUT,POSTROUTING
-
SNAT:POSTROUTING
DNAT:PREROUTING
PAT
-
SNAT:POSTROUTING
-
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]
-
SNAT:
原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/77999