netfilter/iptables:
netfilter是存在于内核中的一个防火墙框架,用来管理网络数据包,netfilter在IP数据包处理流程中的5个关键位置放置了5个钩子(hook)函数,当数据包流经相应的位置时,相应的钩子函数会被调用,每个对应的钩子上有对应的表,表中有对应的规则链,链中存放着对应的规则,最终形成了对数据包处理规则的实现;
iptables是运行于用户空间中的进程,通过控制netfilter来实现对数据包的管理、维护与检查;
net filter功能:
filter:包过滤;
NAT:网络地址转换(Network Address Translation);
mangle:拆解报文,做出修改,而后重新封装;
raw:关闭nat表上启用的连接追踪机制;
钩子函数(hook function):
1、 prerouting
2、 input
3、 forward
4、 output
5、 postrouting
每张表可以放置对应的钩子:
filter:input
forward output
nat:prerouting
output postrouting
mangle:prerouting
input forward output
postrouting
raw:prerouting output
iptables:内置的链
1、 PREROUTING
2、 INPUT
3、 FORWARD
4、 OUTPUT
5、 POSTROUTING
注:允许用户自定义规则链,它们需要手动关联至指定的“钩子”;
各表的优先级:raw à mangle à nat à filter
iptables规则的组成:
l 匹配条件:
网络层首部:源地址、目标地址…
传输层首部:源端口、目标端口、TCP Flags…
以及一些扩展模块引入的检查机制;
l 跳转目标:-j target
target:DROP ACCEPT REJECT SNAT
DNAT MASQUERADE LOG ….
iptables命令的基本格式:
iptables [-t table] {-A|-C|-D} chain
rule-specification
ip6tables [-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]
COMMANDs:
链管理:
-N,
–new-chain chain:新建一个自定义的规则链;
-X,
–delete-chain [chain]:删除用户自定义的引用计数为0的空链;
-F,
–flush [chain]:清空指定的规则链上的规则;
-E,
–rename-chain old-chain new-chain:重命名链;
-Z, –zero
[chain [rulenum]]:置零计数器;
注意:每个规则都有两个计数器
packets:被本规则所匹配到的所有报文的个数;
bytes:被本规则所匹配到的所有报文的大小之和;
-P,
–policy chain target:定义指定链的默认target
规则管理:
-A,–append
chain rule-specification:向指定链的尾部追加规则;
-D,–delete
chain rulenum:删除指定链中的某条规则;
-I,–insert
chain rulenum:向指定链中的指定位置插入规则,默认为首部;
-R –replace chain rulenum:替换指定链中的某条规则;
-L –list [chain]:列出指定链中的所有规则;
–line-numbers:显示链中规则的序号;
-S –list-rules [chain]:列出指定链中的所有规则;
-F:清除指定链的所有规则;
PARAMETERS:
通用匹配:
[!] -s ,–source address[/mask][,..]:检查报文的源地址是否符合或等于此处的地址;
[!] -d ,–destination
address[/mask][,..]:检查报文的目标地址是否符合或等于此处的地址;
[!] -p ,–rotocol protocol:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp,
ah, sctp, mh 或者 “all”, 亦可以数字格式指明协议
[!] -i ,–in-interface name :限定报文仅能够从指定的接口流入;only for packets entering the INPUT, FORWARD and
PREROUTING chains;
[!] -o, –out-interface name:限定报文仅能够从指定的接口流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.
-m –match match:调用指定的扩展模块,来扩展匹配条件;
扩展匹配:
-m tcp
–sport –dport
基础使用:
1、创建一条新链,添加规则并关联至指定的钩子上:
iptables -N Test_Chain
iptables -A Test_Chain -d
172.18.54.3 -j REJECT
iptables -A INPUT -j Test_Chain
删除自定义链:
iptables -D INPUT 1 (此处的1为自定义链在引用链中所处的规则条目,如果引用多次,需要逐个删除;)
iptables -Z Test_Chain
iptables -X Test_Chain
重命名链:
iptables -E Test_Chain New_Chain_Name
清空链上的规则:
iptables
-F(不指明链名,默认清空filter表上的所有链上的规则)
删除规则:
iptables -D INPUT Number
插入规则:
iptables -I INPUT -j REJECT (默认插入首部)
改变规则链默认策略:
iptables -P INPUT DROP
rule-specification
= [matches…] [target]
matches:匹配条件
target:跳转目标
1、开放本机的所有tcp服务给所有主机;
# iptables -I INPUT -p
tcp -j ACCEPT
# iptables -I OUTPUT
-p tcp -j ACCEPT
2、开放本机的所有udp服务给172.16.0.0/16网络中的主机,但不包含172.16.0.200;
# iptables -I INPUT
2 -s 172.18.0.200 -p udp -j REJECT
# iptables -I INPUT
3 -s 172.18.0.0/16 -p udp -j ACCEPT
#
iptables -I OUTPUT 2 -s 172.18.0.67 -d 172.18.0.0/16 -p udp -j ACCEPT
3、默认策略为REJECT;
# iptables -A INPUT
-j REJECT
扩展:
1、 仅开放本机的ssh服务给172.16.0.0/16中的主机,而且不包含172.16.0.200;
# iptables -s
172.16.0.200 -p tcp –dport 22 -j REJECT
# iptables -s
172.16.0.0/16 -p tcp –dport 22 -j ACCEPT
扩展条件匹配:
隐式扩展:
-p tcp:可直接使用tcp扩展模块的专用选项;
[!] –source-port,–sport
port[:port] 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
;
[!]
–destination-port,–dport port[:port] 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
;
[!] –tcp-flags mask
comp 匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
mask:要检查的FLAGS list,以逗号分隔;
comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;
–tcp-flags
SYN,ACK,FIN,RST SYN
–tcp-flags
ALL ALL
–tcp-flags
ALL NONE
[!] –syn: –tcp-flags
SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp协议扩展模块的专用选项:
[!] –source-port,–sport
port[:port]
[!]
–destination-port,–dport port[:port]
[!] –icmp-type
{type[/code]|typename}
0/0: echo reply
8/0:echo request
显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;
1、multiport
以离散或连续的 方式定义多端口匹配条件,最多15个;
[!] –source-ports,–sports
port[,port|,port:port]…:指定多个源端口;
[!] –destination-ports,–dports
port[,port|,port:port]…:指定多个目标端口;
# iptables -I INPUT
-d 172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT
2、iprange
以连续地址块的方式来指明多IP地址匹配条件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
# iptables -I INPUT -d
172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -m iprange
–src-range 172.16.0.61-172.16.0.70 -j REJECT
3、time
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –weekdays
day[,day…]
[!] –monthdays day[,day…]
–datestart
YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] –kerneltz:使用内核配置的时区而非默认的UTC;
4、string
–algo {bm|kmp}
[!] –string pattern
[!] –hex-string
pattern
–from offset
–to offset
# iptables -I OUTPUT
-m string –algo bm –string “gay” -j REJECT
5、connlimit
–connlimit-upto n
–connlimit-above n
# iptables -I INPUT
-d 172.16.0.7 -p tcp –syn –dport 22 -m connlimit –connlimit-above 2 -j
REJECT
6、limit
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
# iptables -I OUTPUT
-s 172.16.0.7 -p icmp –icmp-type 0 -j ACCEPT
7、state
[!] –state state
INVALID,
ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新连接请求;
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
UNTRACKED:未追踪的连接;
state扩展:
内核模块装载:
nf_conntrack
nf_conntrack_ipv4
手动装载:
modprobe nf_conntrack_ftp
追踪到的连接:
/proc/net/nf_conntrack
调整可记录的连接数量最大值:
/proc/sys/net/nf_conntrack_max
超时时长:
/proc/sys/net/netfilter/*timeout*
处理动作(跳转目标):
-j targetname [per-target-options]
简单target:
ACCEPT, DROP
扩展target:
REJECT
–reject-with type
type: icmp-net-unreachable,
icmp-host-unreachable
icmp-port-unreachable,icmp-proto-unreachable
icmp-net-prohibited
icmp-host-prohib‐ited, or
icmp-admin-prohibite
LOG
–log-level
level:emerg, alert, crit, error, warning, notice, info or debug.
–log-prefix:定义日志前缀;
保存和载入规则:
保存:iptables-save
> /PATH/TO/SOME_RULE_FILE
重载:iptabls-restore
< /PATH/FROM/SOME_RULE_FILE
-n, –noflush:不清除原有规则
-t, –test:仅分析生成规则集,但不提交
CentOS
6:
保存规则:
service iptables save
保存规则于/etc/sysconfig/iptables文件,覆盖保存;
重载规则:
service iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
配置文件:/etc/sysconfig/iptables-config
CentOS 7:
(1) 自定义Unit
File,进行iptables-restore;
(2) firewalld服务;
(3) 自定义脚本;
规则优化的思路:
使用自定义链管理特定应用的相关规则,模块化管理规则;
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较严格的放在前面;
(4) 设置默认策略:白名单机制
(a) iptables -P,不建议;
(b) 建议在规则的最后定义规则做为默认策略;
iptables/netfilter网络防火墙:
(1) 网关;
(2) filter表的FORWARD链;
要注意的问题:
(1) 请求–响应报文均会经由FORWARD链,要注意规则的方向性;
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;
NAT: Network Address Translation
请求报文:由管理员定义;
响应报文:由NAT的conntrack机制自动实现;
请求报文:
改源地址:SNAT
改目标地址:DNAT
iptables/netfilter:
NAT定义在nat表;
PREROUTING,INPUT,OUTPUT,POSTROUTING
SNAT:POSTROUTING
DNAT:PREROUTING
target:
SNAT:
–to-source
[ipaddr[-ipaddr]]
#
iptables -t nat -I POSTROUTING -j SNAT –to-source 172.18.54.3
DNAT:
–to-destination
[ipaddr[-ipaddr]][:port[-port]]
# iptables -t nat -I
PREROUTING -j DNAT –to-destination 172.18.54.2
MASQUERADE:
SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target;
原创文章,作者:M22-Zero,如若转载,请注明出处:http://www.178linux.com/74677