RHEL中有几种防火墙共存:
这些软件本身其实并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核的netfilter完成的。CentOS7默认采用的是firewalld管理netfilter子系统,底层调用的仍然是iptables命令。不同的防火墙软件相互间存在冲突,使用某个时应禁用其他的。
systemctl start/stop/enable/disable/status/is-active xxxx //systemctl服务管理命令
netfilter是Linux 2.4内核引入的全新的包过滤引擎。由一些数据包过滤表组成,这些表包含内核用来控制信息包过滤的规则集。iptables等等都是在用户空间修改过滤表规则的便捷工具。
netfilter在tcp/ip协议栈必须经过且可以读取规则的位置,共设有5个控制关卡。这5个关卡处的检查规则分别放在5个规则链中(有的叫钩子函数(hook functions)。也就是说5条链对应着数据包传输路径中的5个控制关卡,链中的规则会在对应的关卡检查和处理。任何一个数据包,只要经过本机,必然经过5个链中的某个或某几个。
链其实就是包含众多规则的检查清单,每一条链中包含很多规则。当一个数据包到达一个链时,系统就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则就继续检查下一条规则,如果该数据包不符合链中任一条规则,系统就会根据该链预先定义的默认策略来处理数据包。
数据包的传输过程
可以看出,刚从网络接口进入的数据包尚未进行路由决策,还不知道数据要走向哪里,所以进出口处没办法实现数据过滤,需要在内核空间设置转发关卡、进入用户空间关卡和离开用户空间关卡。
参考文档:http://drops.wooyun.org/tips/1424
起源于freeBSD的ipfirewall(内核1.x时代),所有规则都在内核中;2.0x后更名为ipchains,可以定义多条规则并串用;现在叫iptables,使用表组织规则链。
iptablses按照用途和使用场合,将5条链各自切分到五张不同的表中。也就是说每张表中可以按需要单独为某些链配置规则。例如,mangle表和filter表中都能为INPUT链配置规则,当数据包流经INPUT位置(进入用户空间),这两个表中INPUT链的规则都会用来做过滤检查。
五张表,每张表侧重于不同的功能
iptables还支持自定义规则链。自定义的链必须和某个特定的链关联起来。可在某个链中设定规则,满足一定条件的数据包跳转到某个目标链处理,目标链处理完成后返回当前链中继续处理后续规则。
因为链中规则是从头到尾依次检查的,所以规则的次序是非常重要的。越严格的规则应该越靠前。
service --status-all
service iptables start|stop|restart|status service iptables save //定义的所有内容,在重启时都会失效。调用save命令可以把规则保存到文件/etc/sysconfig/iptables中。 iptables-save //保存规则 iptables-restore //加载规则。开机的时候,会自动加载/etc/sysconfig/iptables iptables-restore < /etc/sysconfig/iptables2 //加载自定义的规则文件 //iptables服务配置文件: /etc/sysconfig/iptables-config //iptables规则文件: /etc/sysconfig/iptables echo "1">/proc/sys/net/ipv4/ip_forward //打开iptables转发:
iptables [-t TABLE] COMMAND [CHAIN] [CRETIRIA]... [-j ACTION]
省缺表名为filter。命令中用到的序号(RULENUM)都基于1。
COMMAND 命令选项
-A|--append CHAIN //链尾添加新规则 -D|--delete CHAIN [RULENUM] //删除链中规则,按需序号或内容确定要删除的规则 -I|--insert CHAIN [RULENUM] //在链中插入一条新的规则,默认插在开头 -R|--replace CHAIN RULENUM //替换、修改一条规则,按序号或内容确定 -L|--list [CHAIN [RULENUM]] //列出指定链或所有链中指定规则或所有规则 -S|--list-urles [CHAIN [RULENUM]] //显示链中规则 -F|--flush [CHAIN] //清空指定链或所有链中规则 -Z|--zero [CHAIN [RULENUM]] //重置指定链或所有链的计数器(匹配的数据包数和流量字节数) -N|--new-chain CHAIN //新建自定义规则链 -X|--delete-cahin [CHAIN] //删除指定表中用户自定义的规则链 -E|--rename-chain OLDCHAIN NEWCHAIN //重命名链,移动任何引用 -P|-policy CHAIN TARGET //设置链的默认策略,数据包未匹配任意一条规则就按此策略处理
CRETIRIA 条件匹配
分为基本匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配
基本匹配
-p|--proto PROTO //按协议匹配,如tcp、udp、icmp,all表示所有协议。 (/etc/protocols中的协议名) -s|--source ADDRESS[/mask]... //按数据包的源地址匹配,可使用IP地址、网络地址、主机名、域名 -d|--destination ADDRESS[/mask]... //按目标地址匹配,可使用IP地址、网络地址、主机名、域名 -i|--in-interface INPUTNAME[ +] //按入站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING链 -o|--out-interface OUTPUTNAME[+] //按出站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING链
可使用 ! 可以否定一个子句,如-p !tcp
扩展匹配
-m|--match MATCHTYPE EXTENSIONMATCH... //扩展匹配,可能加载extension
如: -p tcp -m tcp --dport 80
隐式扩展匹配(对-p PROTO的扩展,或者说是-p PROTO的附加匹配条件)
-m PROTO 可以省略,所以叫隐式
-m tcp //-p tcp的扩展 --sport [!]N[:M] //源端口, 服务名、端口、端口范围。 --dport [!]N[:M] //目标端口,服务名、端口、端口范围 --tcp-flags CHECKFLAGS FLAGSOFTRUE //TCP标志位:SYN(同步),ACK(应答),RST(重置),FIN(结束),URG(紧急),PSH(强迫推送)。多个标志位逗号分隔。
//CHECKFLAGS为要检查的标志位,FLAGSOFTRUE为必须为1的标志位(其余的应该为0) --syn //第一次握手。 等效于 --tcpflags syn,ack,fin,rst syn 四个标志中只有syn为1 -m udp //-p udp的扩展 --sport N[-M] --dport N[-M] -m icmp //隐含条件为-p icmp --icmp-type N //8:echo-request 0:echo-reply
显示扩展匹配
-m state --state //连接状态检测,NEW,ESTABLISHED,RELATED,INVALID -m multiport --source-ports PORT[,PORT]...|N:M //多个源端口,多个端口用逗号分隔, --destination-ports PORT[,PORT]...|N:M //多个目的端口 --ports //多个端口,每个包的源端口和目的端口相同才会匹配 -m limit --limit N/UNIT //速率,如3/minute, 1/s, n/second , n/day --limit-burst N //峰值速率,如100,表示最大不能超过100个数据包 -m connlimit --connlimit-above N //多于n个,前面加!取反 -m iprange --src-range IP-IP --dst-range IP-IP -m mac --mac-source //mac地址限制,不能用在OUTPUT和POSTROUTING规则链上,因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址 -m string --algo [bm|kmp] //匹配算法 --string "PATTERN" //匹配字符模式 -m recent --name //设定列表名称,默认为DEFAULT --rsource //源地址 --rdest //目的地址 --set //添加源地址的包到列表中 --update //每次建立连接都更新列表 --rcheck //检查地址是否在列表 --seconds //指定时间。必须与--rcheck或--update配合使用 --hitcount //命中次数。必须和--rcheck或--update配合使用 --remove //在列表中删除地址
-m time
--timestart h:mm
--timestop hh:mm
--days DAYS //Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗号分隔
-m mark
--mark N //是否包含标记号N
-m owner
--uid-owner 500 //用来匹配来自本机的封包,是否为某特定使用者所产生的,可以避免服务器使用root或其它身分将敏感数据传送出
--gid-owner O //用来匹配来自本机的封包,是否为某特定使用者群组所产生的
--pid-owner 78 //用来匹配来自本机的封包,是否为某特定进程所产生的
--sid-owner 100 //用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包
-j|--jump TARGET //跳转到目标规则,可能加载target extension -g|--goto CHAIN //跳转到指定链,不再返回
辅助选项
-t|--table TABLE //指定操作的表,默认的表为filter -n|--numeric //用数字形式显示地址和端口,显示主机IP地址而不是主机名 -x|--exact //计数器显示精确值,不做单位换算 -v|--verbose (x3) //查看规则列表时,显示更详细的信息 -line-numbers //查看规则表时,显示在链中的序号 -V|--version -h|--help
[option] --help //查看特定选项的帮助,如iptables -p icmp --help --fragment -f //match second or further fragments only --modprobe=<command> //try to insert modules using this command --set-counters PKTS BYTES //set the counter during insert/append
state TCP链接状态
只允许NEW和ESTABLISHED进,只允许ESTABLISHED出可以阻止反弹式木马。
使用示例
iptables -F //删除iptables现有规则 iptables -L [-v[vv] -n] //查看iptables规则 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //在INPUT链尾添加一条规则 iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //在INPUT链中插入为第2条规则 iptables -D INPUT 2 //删除INPUT链中第2条规则 iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //替换修改第三条规则 iptables -P INPUT DROP //设置INPUT链的默认策略为DROP //允许远程主机进行SSH连接 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT //允许本地主机进行SSH连接 iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INTPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT //允许HTTP请求 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT //限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个 iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT //限制SSH连接速率(默认策略是DROP) iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT //防止syn攻击(限制syn的请求速度) iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN iptables -A syn-flood -j DROP //防止syn攻击(限制单个ip的最大syn连接数) iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP //利用recent模块抵御DOS攻击 iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //单个IP最多连接3个会话 Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP //只要是新的连接请求,就把它加入到SSH列表中。5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP //防止单个IP访问量过大 iptables –A OUTPUT –m state --state NEW –j DROP //阻止反弹木马 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT //防止ping攻击 //只允许自己ping别人,不允许别人ping自己 iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT //对于127.0.0.1比较特殊,我们需要明确定义它 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT //SNAT 基于原地址转换。许多内网用户通过一个外网 口上网的情况。将我们内网的地址转换为一个外网的IP,共用外网IP访问外网资源。 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1 //当外网地址不是固定的时候。将外网地址换成 MASQUERADE(动态伪装):它可以实现自动读取外网网卡获取的IP地址。 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE //DNAT 目标地址转换。目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上 iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
dynamic firewall daemon。支持ipv4和ipv6。Centos7中默认将防火墙从iptables升级为了firewalld。firewalld相对于iptables主要的优点有:
1.1.过滤规则集合:zone
zone配置文件示例:public.xml
<?xml version="1.0" encoding="utf-8"?> <zone target="default"> <short>Public</short> <description>For use in public areas...</description> <service name="ssh"/> <service name="dhcpv6-client"/> </zone>
1.2.service
service示例:ssh.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH)...</description> <port protocol="tcp" port="22"/> </service>
1.3.过滤规则
1.4.过滤规则优先级
2.1.firewalld配置方式
2.2.firewall-cmd命令
firewall-cmd --version firewall-cmd --help firewall-cmd --state //查看firewalld服务状态 firewall-cmd --reload //修改配置文件后,动态加载,不会断开连接。 firewall-cmd --complete-reload //完全重新加载看,会断开连接。类似重启。 firewall-cmd --panic-on/--panic-off/--query-panic //panic模式开启/关闭/查询。panic模式会丢弃所有出入站的数据包,一段时间后所有连接都会超时中断。 firewall-cmd --get-active-zones //查看所有绑定了source, interface和默认的zone,以及各个zone的生效条件。 firewall-cmd --set-default-zone=ZONE //设置默认的zone,也可以修改firewalld.conf中的DefaultZone选项。
firewall-cmd --zone=xxxx --list-all
//反向查询: 根据source或interface查询对应的zone firewall-cmd --get-zone-of-interface=interface firewall-cmd --get-zone-of-source=source[/mask]
//更多用法在后面列出......
部分命令共同的参数说明:
2.3.配置文件存储位置
firewalld的配置文件以xml为主(主配置文件firewalld.conf除外),有两个存储位置:
修改配置的话只需要将/usr/lib/firewalld中的配置文件复制到/etc/firewalld中修改。恢复配置的话直接删除/etc/firewalld中的配置文件即可。
2.4.配置文件结构
2.5.zone文件中配置规则
<?xml version="1.0" encoding="utf-8"?> <zone target="default"> <!--target属性为zone的默认处理行为,可选值:default(省缺), ACCEPT, %%REJECT%%, DROP --> <short>Demo</short> <description>demo...</description> <source address="address[/mask]"> <interface name="ifcfg-em1"/> <!--也可在网卡配置文件ifcfg-*中配置,只需要加入 ZONE=public --> <service name="ssh"/> <port port="portid[-portid]" protocol="tcp|udp"/> <icmp-block name="echo-request"/> <!--ping报文--> <masquerade/> <forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="ipv4address"]/> <rule [family="ipv4|ipv6"]> [ <source address="address[/mask]" [invert="bool"]/> ] [ <destination address="address[/mask]" [invert="bool"]/> ] [ <service name="string"/> | <port port="portid[-portid]" protocol="tcp|udp"/> | <protocol value="protocol"/> | <icmp-block name="icmptype"/> | <masquerade/> | <forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="address"]/> ] [ <log [prefix="prefixtext"] [level="emerg|alert|crit|err|warn|notice|info|debug"]/> [<limit value="rate/duration"/>] </log> ] [ <audit> [<limit value="rate/duration"/>] </audit> ] [ <accept/> | <reject [type="rejecttype"]/> | <drop/> ] </rule> </zone>
2.6.使用firewall-cmd配置规则
//zone的默认的行为 firewall-cmd --permanent [--zone=zone] --get-target firewall-cmd --permanent [--zone=zone] --set-target=target //配置source,相同的source只能在一个zone中配置,否则会提示Error: ZONE_CONFLICT 。 firewall-cmd [--permanent] [--zone=zone] --list-sources //显示绑定的source firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask] //查询是否绑定了source firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask] //绑定source,如果已有绑定则取消。 firewall-cmd [--zone=zone] --change-source=source[/mask] //修改source,如果原来未绑定则添加绑定。 firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask] //删除绑定 //interface 如eth0, 也可以在网卡配置文件ifcfg-*中加入 ZONE=ZONE名 firewall-cmd [--permanent] [--zone=zone] --list-interfaces firewall-cmd [--permanent] [--zone=zone] --add-interface=interface firewall-cmd [--zone=zone] --change-interface=interface firewall-cmd [--permanent] [--zone=zone] --query-interface=interface firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface //service firewall-cmd [--permanent] [--zone=zone] --list-services firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-service=service firewall-cmd [--permanent] [--zone=zone] --query-service=service //port firewall-cmd [--permanent] [--zone=zone] --list-ports firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol //icmp-block, 默认允许所有ICMP通过
firewall-cmd --get-icmptypes //查看所有支持的ICMP类型:
// destination-unreachable echo-reply echo-request parameter-problemr-solicitation source-quench time-exceeded
firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype //masquerade firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-masquerade firewall-cmd [--permanent] [--zone=zone] --query-masquerade //端口转发 firewall-cmd [--permanent] [--zone=zone] --list-forward-ports firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]][--timeout=SECONDS] firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]] firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]] //rule规则, ‘rule‘是将xml配置中的<和/>符号去掉后的字符串,如 ‘rule family="ipv4" source address="1.2.3.4" drop‘ firewall-cmd [--permanent] [--zone=zone] --list-rich-rules firewall-cmd [--permanent] [--zone=zone] --add-rich-rule=‘rule‘ [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule=‘rule‘ firewall-cmd [--permanent] [--zone=zone] --query-rich-rule=‘rule‘
参考文档:
http://drops.wooyun.org/tips/1424
http://blog.chinaunix.net/uid-26000296-id-4111127.html
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld
http://blog.chinaunix.net/uid-26495963-id-3279216.html
http://www.linuxso.com/linuxpeixun/10332.html
http://www.cnblogs.com/excelib/p/5155951.html
http://www.cnblogs.com/excelib/p/5150647.html
Linux防火墙配置(iptables, firewalld)
原文:http://www.cnblogs.com/pixy/p/5156739.html