1、iptables工作原理 2、iptables:规则管理器使用 3、规则匹配 4、firewall-cmd 5、网络防火墙 6、NAT ================================================================================================================================================ iptables工作原理 1、防火墙 防火墙最基本的功能就是隔离网络,通过将网络划分成不同的区域(通常情况下称为ZONE),制定出不同区域之间的访问控制策略来控制不同信任程度区域间传 送的数据流。防火墙可以硬件防火墙也可以是软件防火墙。常见的防火墙架构有:主机防火墙、网络防火墙、硬件防火墙。主机防火墙在本主机的内核 TCP/IP 协议栈实现,网络防火墙在一个网络内的出口位置由专用的硬件对流经网络的数据报文进行过滤处理。硬件防火墙在专用的硬件级别实现部分防火墙功能,另一 个部分由软件实现。 主机防火墙 网络防火墙 硬件防火墙 软件防火墙 网络层防火墙:OSI下三层。IP地址、端口、协议状态来判断 应用层防火墙 2、iptables iptables 是运行在用户空间的一个应用软件,通过接口控制内核模块 netfiler 模块,以达到对流入流出及转发的数据报文进行过滤及其他操作的功能。netfilter 是在内核空间实现防火墙功能的框架。事实上 iptables 不具有任何防火墙的功能,它只是运行在前端的一个程序,帮助用户制定管理防火墙规则的规则管理器。 3、netfilter 在内核中使用5个钩子函数实现防火墙功能,这五个钩子对应5条链。可以理解成这五个钩子在内核5个不同的位置进行看守,对数据过滤或流向等进行监控以及做出 动作。通过在每个位置制定相应的规则,对报文流经的每个位置进行检查过滤,达到防火墙的功能。netfilter 具有拒绝任何报文的经过本机的功能,而需要数据报 文流经本地,则需要制定放行的规则。 4、链 PREROUTING # 路由前决策,报文最先到达主机匹配的位置。 INPUT # 报文到达本机经过的位置 FORWARD # 由本机转发的报文流经的位置 OUTPUT # 由本机发出的数据报文经过的位置 POSTROUTING # 第二次路由决策,报文从本机流出的最后位置 自定义链 # 用于对内置链进行扩展和补充,只有Hook钩子调用自定义链时方能生效 5、表 每条链上制定多条规则,而这些规则的功能是各不相同。根据功能的不同,通常iptables中又分为有四张表。具有相同功能的规则写入不同的链中,由这些具有相同功能 的规则组成的链组成表。 iptables中的四表及功能:优先级由低到高 filter # 对数据包进行过滤,并作出动作 nat # 网络地址转换,network address translation mange # 拆除报文、修改报文、封装报文 raw # 关闭nat表上启用的连接追踪功能,在非常繁忙服务器上要关闭连接追踪功能,否则可能会造成占用大量内存 6、动作 对报文的处理动作(target) 使用 -j 选项指明 对报文可以有匹配条件和处理动作,匹配条件有基本匹配条件和扩展匹配条件。处理动作有内建处理动作和自动义处理动作,下列是内建处理动作。 ACCEPT # 允许报文通过 DROP # 丢弃报文,不做响应 REJECT # 拒绝报文通过,并明确响应请求方拒绝通过 RETURN # 返回调用链 REDIREC # 端口重定向 LO # 记录日志 MAR # 做防火墙标记 DNAT # 目标地址转换 SNAT # 源地址转换 MASQUERAD # 地址伪装SNAT,例如将内网地址转换成一个对外的一个IP 自定义 # 由自定义链上的规则进行匹配 7、iptables有4表5链 添加规则判断: 1、要实现什么功能,即判断添加到那张表 2、报文流经的路径,判断添加的那个链 8、链上规则的次序,即检查次序 1、同类规则,匹配范围小的放上面 2、不同类规则,检测频率大的放上面 3、尽可能的合并规则,节省匹配时间和系统资源 4、定义默认策略 9、规则 组成部分:报文匹配条件;匹配之后处理的动作 匹配条件:根据协议特征指定 基本匹配 扩展匹配条件 处理动作: 内建处理动作 自定义处理动作 10、规则配置工具 CentOS6:iptables CentOS7:firewall-cmd # 命令行 firewall-config # 图形界面 ================================================================================================================================================ iptables:规则管理器使用 1、注意: 1、iptables链的默认策略表示:所有规则都不匹配时,按默认策略进行处理数据包。如果默认策略都是DROP,则表示以白名单的形式图案家规则。 2、同类型规则,匹配范围小的要放到前面 3、规则和链有计数器:能够显示从启用开始匹配多少个数据包。每个规则和链都有两个计数器: pkgs:由规则或链所匹配到的报文的个数 bytes:有规则或链匹配到的所有报文大小之和 2、iptables命令语法格式 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格式: rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options] Note: 1、[-t tables] 用来指定表名称,默认是filter。filter、nat、mangle、raw 子命令: -t table_name 指定表名 链管理: -F # flush,如果省略选项,则清空指定表上的所有规则 -N # new,自定义创建一个新的链 -X # 删除用户自定义的空链 -Z # zero,清零,置零规则计数器 -P # Policy,为指定链设定默认策略,对filter表中的链,默认策略通常有ACCEPT、DROP、REJECT -E # rename,重命名自定义链,引用计数器不为0的自定义链无法改名删除 规则管理: -A # 将新的规则追加于指定链的尾部 -I # 将新的规则插入指定链的指定位置,默认插入到规则的最前面 -D # 删除链上的指定规则 指定方式: 1、指定匹配条件 2、指定规则编号 -R # replace,替换指定链上的指定规则 查看: -L # 列出指定链上的所有规则 -n # 数字格式显示地址和端口号 -v # verbose,显示详细信息,-vv 显示信息详细程度级别 --line-numbers # 显示规则编号 -x # exactly,显示计数器计数结果的精确值 Note:显示字段含义 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) Chain 链名 (默认策略 报文匹配数,字节匹配数) pkts bytes target prot opt source destination 报文匹配数 匹配字节数 动作 协议 选项 源地址 目标地址 ctstate XXX,XXX,XXX 追踪状态 示例: iptables -t table_name -L # 显示指定表中的链,如果不指定-t table_name 默认是filter iptables -t table_name -L -n # 显示指定表中的链,且数字格式显示地址和端口号 iptables -t table_name -L -v # 显示指定表中的链,且显示更加详细的信息,如规则引用计数 iptables -t table_name -L --line-numbers # 显示规则的编号 iptables -t table_name -F # 清空指定表中的所有规则,如果不指定-t table_name 默认是filter iptables -t table_name -X # 清空指定表中的所有自定义链,默认是清空fileter中的链 iptables -t table_name -N new_chain_name # 在指定表中创建一个新链 iptables -t table -E OLD_CHAIN_NAME NEW_CHAIN_NAME # 修改指定表中中指定链的名称 iptables -t table_name -P CHAIN_NAME NEW_CHAIN_POLICY # 修改指定表中指定链的默认策略 iptables -t table_name -R CHAIN RULENUM RULE-SPECIFICATION # 替换指定表中指定链 iptables -t table_name -D CHAIN_NAME RULE_NUMBER # 删除指定表中指定链的规则,以规则编号指定 iptables -t table_name -D chain_name rule_number # 删除指定表中指定链的规则,以规则编号指定 ================================================================================================================================================ 规则匹配 1、基本规则匹配 检查匹配报文中的源IP地址 [!] {-s|--src|--source} {IP|NETWORK/MASK} 检查匹配报文中的目的IP地址 [!] {-d|--dst|--dest|--destination} {IP|NETWORK/MASK} 检查报文中的协议,即IP首部中的protocols所标识的协议 {-p|--protlcol} {tcp|udp|icmp} 数据报文的流入接口,仅能用于PREROUTING,INPUT,FORWARD链 {-i|--in-interface} INTERFACE_NAME 数据报文的流出接口,仅能用于FORWRAD,OUTPUT,POSTROUTING链 {-o|--out-interface} INTERFACE_NAME 示例: iptables -t filter -A OUTPUT -s 192.168.1.150 -o eth0 -j ACCEPT # 限制网卡接口的报文,从本机流出的报文 iptables -t filter -A INPUT -d 192.168.1.150 -i eth0 -j ACCEPT # 限制网卡接口,流入本机的报文 iptables -t filter -A INPUT -s 0.0.0.0/0 -d 172.18.26.2 -i eth0 -j ACCEPT # 从网络接口限制进入的报文 iptables -t filter -A OUTPUT -s 172.18.26.2 -s 0.0.0.0/0 -o eth0 -j ACCEPT # 从网络接口限制流出的报文 iptables -t filter -A INPUT -s 0.0.0.0 -d 192.168.1.150 -p tcp -j ACCEPT # 添加规则,放行所有使用TCP协议访问本机的的报文 iptables -t filter -A OUTPUT -s 192.168.1.150 -d 0.0.0.0 -p tcp -j ACCEPT # 由 TCP协议从本机发出的报文都允许 2、扩展匹配 iptables本身可以通过报文协议类型、源IP、目标IP等进行匹配。但是也可以通过一些扩展的模块对报文进行更精细的匹配。 rpm -ql iptables | grep "[a-z]\+\.so$" 进行查看,以.so结尾的文件都是iptables的扩展。扩展匹配又分为:隐式扩展和显示扩展。隐式扩展不需要额外添加选项-m。 语法格式:[-m] mancth_name --spec_options 3、隐式扩展 隐式扩展:对-p指定了协议后,-m选项需要省略 ,支持的协议有:tcp, udp, udplite, icmp, esp, ah, sctp or all -p tcp --dport PORT # 目标端口,可以是单个端口,也可以是连续的多个端口 --sport PORT # 源端口 --tcp-flages LIST1 LIST2 # SYN | ACK | FIN | RST | PSH | URG ,检测6个标志位那些必须为1,那些必须为0 # 检查在LIST1中所指明的所有标志位,且这其中LIST2中所表示的标志位必须为1,而余下的 必须要为0 ,没在LIST1中指明,不做检查 示例: --tcp-flages SYN,ACK,FIN,RST SYN(这个配置相当于--syn,表示TCP握手的第一次) --tcp-flages ALL ALL # 表示错误的数据包 --tcp-flages ALL NONE # 表示错误的数据包 -p udp --dport PORT # udp协议的目标端口 --sport PORT # udp协议的源端口 -p icmp --icmp-type # icmp报文类型,可用数字表示类型 示例: # 放行SSH服务 iptables -t filter -A INPUT -s 0.0.0.0/0 -d 172.18.26.2 -p tcp --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -d 0.0.0.0/0 -s 172.18.26.2 -p tcp --sport 22 -j ACCEPT # 只允许22端口,-t -m -s -d视情况,可以省略 iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT # 放行Web服务 iptables -t filter -I INPUT -s 0.0.0.0/0 -d 172.18.26.2 -p tcp --dport 80 -j ACCEPT iptables -t filter -I OUTPUT -s 172.18.26.2 -d 0.0.0.0/0 -p tcp --sport 80 -j ACCEPT # 允许ping通别的主机,不允许其他主机ping iptables -t filter -A OUTPUT -s 172.18.26.2 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT iptables -t filter -A INPUT -s 0.0.0.0/0 -d 192.168.1.155 -p icmp --icmp-type 0 -j ACCEPT 4、显式扩展 必须使用-m选项,显示指明扩展模块,查看iptables的扩展:rpm -ql iptables | grep "[[:lower:]]\+.so$",获取iptables扩展匹配帮助: CentOS6:man iptables | CentOS7:man iptables-extensions 1、 multiport:以离散方式定义多端口匹配,最多定义15个端口 [!] {--source-ports|--sports} {port[,port|,port:port]...} # 指明源端口 [!] {--destination-ports|--dports} {port[,port|,port:port]...} # 指明目标端口 [!] --ports port[,port|,port:port]... # 源和目标端口都可以匹配 示例:同时放行22端口和80端口 iptables -t filter -I INPUT -s 0.0.0.0/0 -d 192.168.1.150 -p tcp -m multiport --dports 22,80 -j ACCEPT iptables -t filter -I OUTPUT -s 192.168.1.150 -d 0.0.0.0/0 -p tcp -m multiport --sports 22,80 -j ACCEPT 2、iprange:指明连续的IP地址范围时有效 [!] --src-range from[-to] # 指明连续的源IP地址范围 [!] --dst-range from[-to] # 指明连续的目标IP地址范围 示例:给指定的IP地址范围放行22和80端口 iptables -t filter -I INPUT -d 172.18.26.2 -p tcp -m multiport --dports 80:81,22,8080 -m iprange --src-range 172.18.26.1-172.18.26.3 -j ACCEPT iptables -t filter -I OUTPUT -s 172.18.26.2 -p tcp -m multiport --sports 80:81,22,8080 -m iprange --dst-range 172.18.26.1-172.18.26.3 -j ACCEPT Note: 1、连续的端口或者IP使用 12:13:14 的格式指明,如果不联系,则使用 12,14,16 的格式 2、使用连续IP指定规则时,INPUT链上通常不需要使用-s指明源IP地址或者网络 3、mac扩展:指明源MAC地址,适用于:PREROUTING, FORWARD,INPUT chains [!] --mac-source XX:XX:XX:XX:XX:XX 示例: iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT iptables -A INPUT -s 172.16.0.100 -j REJECT 4、string:匹配传输内容报文中出现的字符串 --algo {bm|kmp} # 指定字符串匹配比对算法 --from offset # 匹配起始位置左侧偏移量 --to offset # 匹配其实位置右侧偏移量 [!] --string pattern # 从头到尾检查匹配 [!] --hex-string pattern # 按编码后的字符串指定并进行匹配 示例: # 对80端口的请求中报文中有"GET /index.html"字符串的就进行记录日志 iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG iptables -p udp --dport 53 -m string --algo bm --from 40 --to 57 --hex-string '|03|www|09|netfilter|03|org|00|' # 对报文中出现movie字符串的报文拒绝 iptables -t filter -I OUTPUT -m string --algo bm --string "movie" -j REJECT iptables -t filter -A OUTPUT -s 172.19.26.2 -p tcp -m \\string -algo bm --string "xue" -j DROP Note: 1、字符串匹配需要内核版本高于2.6.14 5、time:基于时间作检查。根据请求报文到达的时间与指定时间范围匹配。默认使用的UTC时间 选项: --lerneltz # 使用内核时区,不建议使用 --localtz # 使用本地时区 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] # 精确匹配开始时间 1997-01-01T00:00:00 必须要有字母T --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] # 精确匹配结束时间 --timestart hh:mm[:ss] # 每天的时间匹配 --timestop hh:mm[:ss] # 每天的时间匹配 [!] --monthdays day[,day...] # 每个月几号 [!] --weekdays day[,day...] # 星期几 示例: -m time --weekdays Sa,Su -m time --datestart 2007-12-24 --datestop 2007-12-27 -m time --datestart 2007-01-01T17:00 --datestop 2007-01-01T23:59:59 -m time --timestart 12:30 --timestop 13:30 -m time --weekdays Fr --monthdays 22,23,24,25,26,27,28 iptables -t filter -I INPUT -d 192.168.1.155 -p tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j REJECT 6、connlimit:单IP并发访问数量限制,可防范cc攻击 --connlimit-upto n # 小于等于数量n,则都允许 --connlimit-above n # 超过数量n则拒绝或丢弃 --connlimit-mask prefix_length # 对客户端的IP地址所属网络中的IP个数进行限制 prefix_length为掩码位数 --connlimit-saddr --connlimit-daddr 示例: # allow 2 telnet connections per client host iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT # you can also match the other way around: iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT # limit the number of parallel HTTP requests to 16 per class C sized source network (24 bit netmask) iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT # 限制ssh连接数量 iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT 7、limit:基于收发报文的速率做匹配。令牌桶过滤器 --limit rate[/second|/minute|/hour|/day] # 限制每分钟rate个请求 --limit-burst number # 对前N个请求不做限制 示例: iptables -t filter -I INPUT -d 172.18.26.2 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j REJECT 8、 state:根据连接追踪机制的状态,进而控制连接。需要装载专用的内核模块 nf_conntrack模块 [!] --state state 相关知识: 1、调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_conntrack_max ,默认数值为31376 所以解決方法一般有两个: (1) 加大 ip_conntrack_max 值 vi /etc/sysctl.conf net.ipv4.ip_conntrack_max = 393216 net.ipv4.netfilter.ip_conntrack_max = 393216 (2): 降低 ip_conntrack timeout时间 vi /etc/sysctl.conf net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120 2、当前追踪并记录的连接 /proc/net/nf_conntrack 3、不同协议或连接类型连接追踪时长 /proc/sys/net/netfilter/* 4、可追踪的连接状态: NEW # 新发出的请求,将其识别为第一次请求的连接为NEW连接 ESTABLISHED # NEW状态之后,连接追踪模板中为其建立的条目失效之前建立的通信的状态 RELATED # 相关的连接,例如vsftp的命令连接和数据连接就是相关连接 INVALIED # 无法识别的连接 UNTRACKED # 未进行追踪的连接,如raw表中关闭追踪 示例: # 通过80端口出去的报文一定是响应之前的请求,即通过80端口建立的连接追踪状态一定ESTABLISHED,所以可以通过追踪状态机制的状态, 限制80端口只能响应。对80端口,INPUT,放行;对于OUTPUT只对ESTABLISHED状态放行 iptables -t filter -I INPUT -d 172.18.26.2 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -t filter -I OUTPUT -s 172.18.26.2 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # ESTABLISHED状态的请求报文,全部放行出去: iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT # ESTABLISHED状态的请求连接,都放行: iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT # 基于连接追踪功能放行ftp的访问:需要借助连接追踪状态的RELATED,对于21号端口对NEW、ESTABLISHED放行,因为命令连接是通过21号端口连接的, 而数据连接通过随机端口连接。 1、装载RELATED追踪专用模块 /lib/modules/2.6.32-573.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko modprobe nf_conntrack_ftp 2、放行命令连接的请求报文 21号端口,命令连接:NEW | ESTABLISHED iptables -I INPUT -d 192.168.1.155 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 数据连接:RELATED | ESTABLISHED iptables -I INPUT -d 192.168.1.155 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 3、放行响应报文放行 ESTABLISHED iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT 测试: iptables -I INPUT -d 172.18.26.2 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -I INPUT -d 172.18.26.2 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -I OUTPUT -s 172.18.26.2 -p tcp -m state --state ESTABLISHED -j ACCEPT 5、target 动作 日志 LOG: 非中断target,本身不拒绝和允许,放在拒绝和允许规则前并将日志记录在/var/log/messages系统日志中 --log-level level # 级别: emerg, alert, crit, error,warning, notice, info or debug --log-prefix prefix # 日志前缀,用于区别不同的日志,最多29个字符  示例: iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections:" 日志文件记录在 /var/log/messages 中 6、 自定义链示例 iptables -N DENY_INVALID_PACKET iptables -A DENY_INVALID_PACKET -p tcp --tcp-flages ALL ALL -j REJECT iptables -A DENY_INVALID_PACKET -p tcp --tcp-flages ALL NONE -j REJECT iptables -A INPUT -j DENY_INVALID_PACKET 7、保存及重载规则 保存: iptables-save > /path/to/iptables-rule 或者 service iptables save # 规则默认保存到/etc/sysconfig/iptables文件 从指定文件重载: iptables-restore < /path/to/iptables-rule -n, --noflush:不清除原有规则 -t, --test:仅分析生成规则集,但不提交 或者 service iptables restore CentOS 6: iptables服务启动,并没有启动任何进程,只是让内核重新读取规则文件。 服务脚本:/etc/rc.d/iptables 服务器脚本配置文件:/etc/sysconfig/iptables-config # 可以定义开机加载的模块 ================================================================================================================================================ firewalld-cmd 可以使用iptables代替firewalld。iptables-services 程序包包含了 iptables 服务和 ip6tables 服务。yum install iptables-services 1、firewalld介绍 1、firewalld的新一代的动态防火墙管理工具,使用Python开发。在firewalld中引入了区域zone的概念。 2、相对于上一代的iptables规则管理工具,firewalld供了直接通过服务或者程序名称添加防火墙规则的接口。例如,直接添加服务名称http 到防火墙放行规则中,则防火墙会自动放行httpd服务所用到的80端口。 3、可以动态生效,当前的网络连接不会终止。旧版本的iptables,规则的更改,都需要重新读取加载/etc/sysconfig/iptables所有规则, 而firewalld可以动态加载规则文件,仅仅加载改变了的规则。 4、firewalld和iptables一样,事实上同样不具有防火墙功能,真正起作用的是内核框架netfilter。 5、iptables 服务在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的 XML文件里。 6、firewalld是配置和监控防火墙规则的系统守护进程。 2、frewalld配置文件 /etc/firewalld/ /etc/service/ # 服务所使用的端口号,如果修改了服务默认的端口号后,需要在此目录下修改相应的端口 /etc/firewalld.conf # 主配置文件 DefaultZone=public # 默认区域 CleanupOnExit=yes # 关闭防火墙后是否清除防火墙规则 /etc/zone/ # 区域配置文件 3、zone 每一个zone都是一套防火墙的规则集合,即每一个不同的zone,都对应一个防火墙规则方案。firewalld默认有9个不同zone。 这9个zone分别是:drop、block、public、external、dmz、work、home、internal、trusted,这些区域根据不同的网络状况 划分。 drop 拒绝所有除和传出相关所有传入流量 block 拒绝所有除和传出相关所有传入流量 public 拒绝所有除和传出相关的以及ssh,dhcpv6-client预定义的所有传入流量。属于默认zone external 拒绝所有除和传出相关的以及ssh预定义的所有传入流量。但是流出的源IP地址将被伪装为网卡接口的IP地址 dmz 拒绝所有除和传出相关的以及ssh预定义的所有传入流量 work 拒绝所有除和传出相关的以及ssh,ipp-client,dhcpv6-client预定义的所有传入流量 home 拒绝所有除和传出相关的以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义的所有传入流量 internal 和home相同 trusted 允许所有流量 4、firewall-cmd命令 全局命令: firewall-cmd --help # 查看帮助信息 firewall-cmd --state # 查看firewalld服务状态 firewall-cmd --reload # 重新加载防火墙规则,并不会中断当前连接 5、区域管理 firewall-cmd --get-zones # 显示支持的区域列表 firewall-cmd --get-active-zones # 查看当前活动的区域 firewall-cmd --set-default-zone=ZONE_NAME # 设定默认区域 vim /etc/firewalld/firewalld.conf # 编辑防火墙配置文件配置默认区域 DefaultZone=ZONE_NAME firewall-cmd --get-zone-of-interface=INTERFACE_NAME # 查看指定接口所对应的区域 firewall-cmd --permanent --zone=ZONE_NAME --add-interface=INTERFACE_NAME# 为某个区域增加一个接口 vim /etc/sysconfing/network-scripts/ifcfg-eth0 # 通过编辑接口配置文件为某区域增加接口 ZONE=ZONE_NAME firewall-cmd --zone=ZONE_NAME --remove-interface=INTERFACE_NAME # 从区域移除一个接口 firewall-cmd --zone=ZONE_NAME --list-interfaces # 查看指定区域对应的接口 firewall-cmd --zone=ZONE_NAME --list-all # 查看某个区域的所有配置 firewall-cmd --list-all-zones # 查看所有区域的所有配置 firewall-cmd --change-interface=INTERFACE_NAME --zone=ZONE_NAME # 改变指定接口所对应的区域 --add-source=[--zone=] # 添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域 --remove-source= [--zone=] # 从指定区域中删除源地址的流量,如果无--zone= 选项,使用默认区域 6、服务管理 firewall-cmd --list-services # 显示当前区域服务 firewall-cmd --get-service # 查看默认支持的服务,默认支持的服务已经有相关的防火墙规则 可以直接使用服务名称添加 firewall-cmd --permanent --zone=ZONE_NAME --add-service=SERVICE_NAME [--timeout=] # 添加一个服务到防火墙区域,可 设定超时时间 firewall-cmd --zone=ZONE_NAME --remove-service=SERVICE_NAME # 从某区域防火墙规则中移除某服务 firewall-cmd --zone=ZONE_NAME --query-service=SERVICE_NAME # 查看指定区域是否启用某服务 firewall-cmd --get-service --permanent # 查看firewalld下次加载后生效的服务 添加服务: # 复制模板 cp /usr/lib/firewalld/service/SERVICE_NAME.xml /etc/firewalld/service/SERVICE_NAME.xml # 修改服务的端口号等配置项 vim /etc/firewalld/service/SERVICE_NAME.xml nginx services HTTP # 重载firewalld firewall-cmd --reload # 添加服务 firewall-cmd --add-service=nginx firewall-cmd --add-service=nginx --permanent firewall-cmd – reload 7、端口/协议组合管理: firewall-cmd --zone=ZONE_NAME --list-ports # 列出指定区域中打开的端口 firewall-cmd --zone=ZONE_NAME --add-port=PORT/tcp # 打开tcp协议的N端口通信,端口号可以是连续的例如11-22 firewall-cmd --zone=ZONE_NAME --remove-port=PORT/tcp # 禁用某端口和协议的组合 firewall-cmd --zone=ZONE_NAME --quert-port=PORT/tcp # 查询某端口协议组合是否开启 firewall-cmd --zone=ZONE_NAME --add-masquerade # 启用某区域的IP伪装功能 firewall-cmd --zone=ZONE_NAME --remove-masquerade # 禁用某区域的IP伪装功能 firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.0.2.55 # 端口转发 8、在紧急状况,例如遭受攻击时开启此模式,在开启恐慌模式后,正处于连接状态的通信不会断开: firewall-cmd --panic-on # 开启恐慌模式 firewall-cmd --panic-off # 关闭恐慌模式 firewall-cmd --query-panic # 查询当前状态开启或关闭 注意: 1、缺少--permanent选项,可以立即生效,但是临时的;使用--permanent选项永久生效,但需要重新加载或系统重启放可生效 2、通过配置文件为某区域添加服务: 区域配置文件在/usr/lib/firewalld/zone/目录下,但不建议修改此目录下的文件,可以修改/etc/firewalld/zone/目录下的文件, 如果/etc/firewalld/zone/下没有相关区域配置文件,则可以复制/usr/lib/firewalld/zone/目录下的文件,然后进行修改配置。 默认优先使用/etc/firewalld/zone/目录下的文件,如果/etc/firewalld/zone/目录下没有与/usr/lib/firewalld/zone/目录下同名 的文件,则使用/etc/lib/firewalld/zone/目录下的文件。 添加服务语法: 9、rich man 5 firewalld.richlanguage rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率。 1、基本语法规则 rule [source] [destination] service|port|protocol|icmp-block|masquerade|forward-port|source-port [log] [audit] [accept|reject|drop|mark] rule source [log] [audit] accept|reject|drop|mark 2、规则生效顺序 端口转发、伪装 日志规则 允许 拒绝 3、rule语法 [--permanent] [--zone=zone] --list-rich-rules [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=timeval] # (seconds), m (minutes), h (hours), for example 20m or 1h. # The --timeout option is not combinable with the --permanent option. [--permanent] [--zone=zone] --remove-rich-rule='rule' [--permanent] [--zone=zone] --query-rich-rule='rule' 4、注意 1、当address选项使用source或者destination时,补习用family=ipv4|ipv6 5、语法格式 rule [family="ipv4|ipv6"] source [not] address="address[/mask]"|mac="mac-address"|ipset="ipset" destination [not] address="address[/mask]" service name="service name" # firewall-cmd --get-services 显示的支持的服务名称 port port="port value" protocol="tcp|udp" protocol value="protocol value" log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] # "emerg", "alert", "crit", "error", "warning", "notice", "info" or "debug" limit value="rate/duration" # 可以限制日志,审计和操作。 6、示例 # 拒绝IP地址为172.18.26.2传入的所有流量 firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.18.26.1/16 reject' # 限制每分钟只有两个连接到ftp服务 firewall-cmd --permanent --zone=public --add-rich-rule="rule service name=ftp limit value=2/m accept" # 丢弃所有icmp报文 firewall-cmd --permanent --zone=public --add-rich-rule="rule protocol value=icmp drop" # 拒绝IP地址为172172.18.0.0/16网络对本机60-80端口发起的请求报文 firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=172.18.0.0/16 port port=60-100 protocol=tcp drop" # 接收ssh新连接,记录日志syslog的motice级别,每分钟最多接收三条日志 firewall-cmd --permanent --zone=public --add-rich-rule="rule service name=ssh log prefix="SSH:" level="notice" limit value="3/m" accept" 7、NAT firewall-cmd --permanent --zone= --addrich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade' 8、rich端口转发 rich可以将发往本机的端口的报文转发到本机或者其他主机的指定端口去。 语法格式: [--permanent] [--zone=zone] --list-forward-ports [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] [--timeout=timeval] [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] 示例: # 将访问本机80端口的报文转发本机的8080端口 firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=172.18.26.1 # 使用rich规则进行端口转发 firewall-cmd --permanent --zone= --addrich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade' 10、shell脚本配置iptables防火墙 1、从防火墙管理范围区分,防火墙可分为主机防火墙和网络防火墙。 防火墙类型: 报文过滤式的netfilter:对进出入主机的报文进行分析过滤检测 TCP Wrappers:TCP Wrapper是一个基于主机的网络访问控制表系统,用于过滤对类Unix系统(如Linux或BSD)的网络访问 Proxy:代理服务器应用于网络防火墙 2、脚本 1、清空所有规则 /sbin/iptables -F /sbin/iptables -X /sbin/iptables -Z /sbin/iptables -F -t nat /sbin/iptables -X -t nat /sbin/iptables -Z -t nat /sbin/iptables -X -t mangle 2、允许来自于lo接口的数据包,通过127.0.0.1访问本地服务 /sbin/iptables -A INPUT -i lo -j ACCEPT 3、编写脚本(不断完善中) #!/bin/bash # PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH # 清除所有默认规则 iptables -F iptables -X iptables -X iptables -t nat -F iptables -t nat -X iptables -t nat -Z # 允许来自于lo接口的数据包,通过127.0.0.1访问本地服务 iptables -A INPUT -i lo -j ACCEPT #设置filter表默认策略 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT #放行所有非NEW连接和相关连接的报文同行 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ================================================================================================================================================ 网络防火墙 1、实验网络结构 172.18.26.1 # 作为外网主机 192.168.1.1 # 作为内网网关,充当网络防火墙(有两块网卡,一块作为外网接口,一块作为内网接口) 192.168.1.2 # 作为内网主机 2、实验步骤 1、网络防火墙主机添加地址 ip addr add 192.168.1.1/24 dev eth1 2、确保网络防火墙打开转发功能 修改内核参数:/proc/sys/net/ipv4/ip_forward sysctl -w net.ipv4.ip_forward=1 3、配置内网主机IP地址并将网关指向网络防火墙主机 # 添加地址 ip addr add 192.168.1.2/24 dev eth0 # 添加默认网关指向网络防火墙 ip route add default via 192.168.2.1 dev eth0 4、外网主机的配置 内网主机不能ping通外网主机,是因为当外网主机接收到内网主机的ping报文后,不能将ping报文返回给内网主机,因为外网主机的路由 是指向其他主机,而不是防火墙。 # 添加路由 ip route add 10.15.150.0/24 via 192.168.150.253 dev enp0s3 route add -net 192.168.2.0/24 gw 192.168.1.150 5、至此,三台主机能够相互ping通。 6、在网络防火墙上制定防火墙规则 1、只允许外网访问web服务,不允许ping iptables -P FORWARD DROP iptables -t filter -I FORWARD -d 192.168.1.2 -p tcp --dport 80 -j ACCEPT # 允许请求报文通过 iptables -t filter -I FORWARD -s 192.168.1.2 -p tcp --sport 80 -j ACCEPT # 允许响应报文通过 # 在外网主机使用curl命令请求测试 # 内网可以ping同外网,外网不能ping通内网 iptables -A FORWARD -s 192.168.1.0/24 -d 0.0.0.0/0 -p imcp --icmp-type 8 -j ACCEPT iptables -A FORWARD -d 192.168.1.0/24 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT 2、优化。放行web服务和ssh服务 iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT iptables -A FORWARD -d 192.168.1.2 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT 3、优化。开放ftp服务、web、ssh服务 modprobe nf_conntrack_ftp # 启用模块 iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -d 192.168.2.2 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT # 外网主机使用ftp客户端连接测试 4、放行telnet 23/tcp iptables -t filter -I FORWARD -p tcp -m multiport --dports 21,22,23,80 -m state --state NEW -j ACCEPT iptables -L -n -v --line-numbers iptables -t filter -D FORWARD 2 5、samba 137/udp 138/udp 139/tcp 445/tcp 6、dns 查询及区域传送 考虑DNS服务器做权威回答(递归)、迭代、区域传送。 INPUT:53/udp OUTPUT:53/udp iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --sport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT ================================================================================================================================================ NAT 1、内网主机访问互联网的两种方式 1、网络层:NAT (Network Address Translation),在网络层和传输层实现,NAT的设计之初是为了安全的目的。 2、应用层:proxy 代理,在应用层实现 2、NAT SNAT:只修改请求报文的源地址 DNAT:只修改请求报文的目标地址 3、NAT表 PREROUTING:DNAT,将内网的私有地址映射为公网上可访问的IP地址 OUTPUT POSTROUTING:SNAT,帮助内网主机请求外网的资源 4、模拟实现SNAT (源地址转换) 外网主机提供web服务,内网主机通过nat服务器源地址转换后,访问外网主机:所有来自内网的主机的请求,将源地址改为对外的网络地址 1、网络结构 172.18.26.1 作为外网主机 172.18.26.1 作为NAT服务器公网IP 192.168.1.1 NAT服务器作为内网主机的网关IP 192.168.1.2 内网主机IP 2、NAT服务器开启核心路由转发 vim /etc/sysctl.conf net.ipv4.ip_forward = 1 3、内网主机配置默认路由 ip route add default via 192.168.1.1 dev eth0 4、测试 内网主机ping外网主机,外网主机使用tcpdump工具抓包分析: tcpdump -i eth0 dst 172.18.26.1 发现ping报文和curl命令请求的报文外网主机能都接受到,但因为当外网主机接收到源IP地址是192.168.1.2的报文时,不能 正确的返回响应报文。 5、添加iptables规则 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 0.0.0.0/0 -j SNAT --to-source 172.18.26.2 6、测试 再使用内网主机请求外网主机的web资源,并查看外网主机的web服务的日志记录的IP的地址 5、模拟实现DNAT (目标地址转换) 内网主机提供web服务,外网主机提供服务,所有来自外网主机的请求,将目标地址转换为私有网络地址 1、添加iptables规则 iptables -t nat -A PREROUTING -d 172.18.26.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2 iptables -t nat -A PREROUTING -d 172.18.26.2 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.2 2、测试。使用外网主机请求NAT服务器 curl 172.18.26.2 使用ssh服务登录172.18.26.2,此时连接的ssh服务是内网的192.168.1.2主机 6、端口映射 iptables -t nat -A PREROUTING -d 172.18.26.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080 再次使用外网主机请求 7、地址伪装SANT,将内网地址转换成一个合适的公网(动态IP地址)ip,自动将源IP地址转换为NAT服务器的IP地址 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE 8、端口转发 iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIECT --to-ports 8080 ================================================================================================================================================