iptables
首先来看看传统的iptables如何使用。默认的iptables规则表有:fileter表(过滤规则表)、nat表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体的数据链中。Linux防火墙的过滤框架,从图中可以看出,如果是外部主机发送数据包给防火墙本机,数据将会经过PREROUTING链与INPUT链;如果是防火墙本机发送数据包到外部主机,数据将会经过OUTPUT链与POSTROUTING链;如果防火墙作为路由负责转发数据,则数据将经过PREROUTING链、FORWARD链以及POSTROUTING链。
iptables防火墙语法格式:
管理员需要使用iptables命令添加、删除防火墙规则,下面我们看看iptables命令的具体用法。命令描述:netfilter防火墙规则管理工具。
用法:iptables[-t 表名]{-A|-D|-I|-D|-F|-L|-Z|-P} 链名 rule-specification
选项:-t 指定需要维护的防火墙规则表,不使用-t时,则默认操作对象为filter表。
-A 追加防火墙规则。
-D 删除防火墙规则。
-I 插入防火墙规则。
-F 清空防火墙规则。
-L 列出防火墙规则。
-R 替换防火墙规则。
-Z 清空防火墙数据表统计信息。
-P 设置链默认规则。
匹配参数:[!]-p 匹配协议,!代表取反[!]
-s 匹配源地址
[!]-d 匹配目标地址
[!]-i 匹配入站网卡接口
[!]-o 匹配出站网卡接口
[!]--sport 匹配源端口
[!]--dport 匹配目标端口
[!]--src-range 匹配源地址范围
[!]--dst-range 匹配目标地址范围
[!]--limit 匹配数据表速率
[!]--mac-source 匹配源MAC地址
[!]--sports 匹配源端口
[!]--dports 匹配目标端口
[!]--state 匹配状态(INVALID、ESTABLISHED、NEW、RELATED)
[!]--string 匹配应用层字串
触发动作:
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向
iptables防火墙规则的顺序非常重要,内核按顺序检查这些规则,如果发现有匹配的规则条目,则立刻执行相关动作,停止继续向下查找规则条目,如果所有的防火墙规则都未能匹配成功,则按照默认策略处理。我们使用-A选项添加防火墙规则会将该规则追加到整个链的最后,而使用-I选项添加的规则默认会插入到链中作为第一条规则。下面通过实例简单演示iptables命令的使用方法。
查看filter表的所有规则:
[root@m01 3]# iptables -nL
查看nat表的所有规则:
[root@m01 3]# iptables -t nat -nL
清空filter表中的所有规则:
[root@m01 3]# iptables -F
往filter表添加一条新的入站规则,丢弃192.168.1.1主机发送给防火墙本机的所有数据包。
[root@m01 3]# iptables -A INPUT -s 192.168.1.1 -j ACCEPT
往filter表插入一条新的入站规则,拒绝192.168.1.22 ping防火墙本机:
[root@m01 3]# iptables -A INPUT -s 192.168.1.22 -p icmp -j REJECT
查看filter表中防火墙规则并显示规则编号:
[root@m01 3]# iptables -nL --line-numbers
删除filter表中INPUT链的第一条规则:
[root@m01 3]# iptables -D INPUT 1
替换filter表中INPUT链的第二条规则,拒绝192.168.1.254之外的任何主机连接防火墙本机:
[root@m01 3]# iptables -A INPUT 2 ! -s 192.168.1.254 -j REJECT
将192.168.1.10主机发送给防火墙本机22端口的所有数据包信息记录到messages日志:
[root@m01 3]# iptables -I INPUT -s 192.168.1.10 --p tcp --dport 22 -j LOG
允许任何主机从ens33网络接口访问防火墙本机的80端口:
[root@m01 3]# iptables -I INPUT -i ens33 --p tcp --dport 80 -j ACCEPT
iptables防火墙应用案例:
允许任意客户端访问服务器主机提供的日常服务(HTTP、HTTPS、DNS、NTP、SMTP、POP3、SSH),在Linux系统中,/etc/services文件可以帮助我们找到各种服务所对应的标准端口信息。
防火墙备份与还原:
CentOS 7系统中防火墙规则默认保存在/etc/sysconfig/iptables文件中,使用iptables-save将规则保存至该文件中可以实现保存防火墙规则的作用,计算机重启后会自动加载该文件中的规则。如果使用iptables-save将规则保存至其他位置,可以实现备份防火墙规则的作用。当防火墙规则需要做还原操作时,可以使用iptables-restore将备份文件直接导入当前防火墙规则。
firewalld
firewalld将所有的网络流量都分类汇集到zones中,firewalld通过zones管理防火墙规则。每一个进入系统的数据包,都会首先检查她的源IP地址和接口(进出的网卡接口),如果地址与某个zone匹配,则该zone中的规则将生效。而每个zone都会有开启或关闭的服务和端口的列表,以实现允许或拒绝连接服务和端口。如何数据包的源IP地址和网卡接口都不能和任何zone匹配,则该数据包将匹配默认zone,一般情况下是一个名称为public的默认zone。firewalld会提供block、dmz、drop、external、home、internal、public、trusted、work这九个zone
比如,有一个数据包从eno16777736网卡进入本机,根据规则该数据包被导向到了work这个zone,而在work这个zone中有允许访问http服务的规则,则最后该数据包将可以进入本机并访问http服务。
大部分zone都定义的有自己的允许规则,规则通过端口/协议(631/udp)或者预定义的服务(ssh)这种形式设置,如果数据包没有匹配这些允许的规则,则该数据包一般会被防火墙拒绝。但又一个名称为trusted的zone,默认会运行所有的数据流量,如果有一个数据包进入了该zone,则被允许访问所有的资源。
具体的firewalld预定义zone及其描述信息见表
在没有特殊要求下使用默认的public zone即可满足大多数使用场景。
firewalld-cmd命令
使用firewall-cmd命令来管理我们的防火墙规则,安装firewalld这个软件包,系统就会提供该命令工具,其语法格式如下:
常用命令:
查看默认zone
[root@m01 3]# firewall-cmd --get-default-zone
设置默认zone,为home
[root@m01 3]# firewall-cmd --set-default-zone=home
success
[root@m01 3]#
显示当前正在使用的zone信息:
[root@m01 3]# firewall-cmd --get-active-zones
public
interfaces: ens33
[root@m01 3]#
显示系统预定义的zone,默认为九个zone:
[root@m01 3]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@m01 3]#
显示系统预定义的服务名称:
[root@m01 3]# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
查询ens33接口与哪个zone匹配,网卡与public匹配,则该网卡的流量执行public中定义的规则,默认将允许访问所有服务:
[root@m01 3]# firewall-cmd --get-zone-of-interface=ens33
public
显示所有zone及其对应的规则信息:
[root@m01 3]# firewall-cmd --list-all-zones
在public这个zone中添加允许访问FTP服务的规则:
[root@m01 3]# firewall-cmd --add-service=ftp --zone=public
success
在public这个zone中添加允许访问3306端口的规则:
[root@m01 3]# firewall-cmd --add-port=3306/tcp --zone=public
success
从public这个zone中删除允许访问3306端口的规则:
[root@m01 3]# firewall-cmd --remove-port=3306/tcp --zone=public
success
将ens33网卡与public绑定,以后从该接口进入的流量,匹配public中的规则:
[root@m01 3]# firewall-cmd --add-interface=ens33 --zone=public
success
将ens33网卡接口与public解除绑定:
[root@m01 3]# firewall-cmd --remove-interface=ens33 --zone=public
success
将源IP地址1.1.1.1与public绑定,以后该主机访问本机时匹配public中的规则:
[root@m01 3]# firewall-cmd --add-source=1.1.1.1 --zone=public
success
查看默认zone的规则列表:
[root@m01 3]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources: 1.1.1.1
services: dhcpv6-client ftp ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
查看public这个zone的规则列表:
[root@m01 3]# firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources: 1.1.1.1
services: dhcpv6-client ftp ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
在public这个zone中添加一条永久规则(允许访问3306端口),该规则再重启防火墙后依然有效:
[root@m01 3]# firewall-cmd --permanent --add-port=3306/tcp --zone=public
success
重新加载读取防火墙规则:新添加规则后要重新加载firewall 规则才生效
[root@m01 3]# firewall-cmd --reload
success
[root@m01 3]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 3306/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules: