当前位置:   article > 正文

Linux 防火墙(二)——NAT和Firewall_t11zones

t11zones

Linux 防火墙(一)——基础介绍以及基本扩展模块

规则优化最佳实践

  1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条
  2. 谨慎放行入站的新请求
  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
  4. 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
  5. 不同类的规则(访问不同应用),匹配范围大的放在前面
  6. 应该将那些可由一条规则能够描述的多个规则合并为一条
  7. 设置默认策略,建议白名单(只放行特定连接)
    iptables -P,不建议
    规则的最后定义规则做为默认策略,推荐使用,放在最后一条

iptables规则保存

使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
持久保存规则:
CentOS 7,8

iptables-save > /PATH/TO/SOME_RULES_FILE
  • 1

CentOS 6

#将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save
  • 1
  • 2

加载规则

CentOS 7 重新载入预存规则文件中规则:

iptables-restore < /PATH/FROM/SOME_RULES_FILE
  • 1

-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交

CentOS 6:

#会自动从/etc/sysconfig/iptables 重新载入规则
service iptables restart
  • 1
  • 2

开机自动重载规则

用脚本保存各iptables命令;让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径 /PATH/TO/SOME_SCRIPT_FILE

用规则文件保存各规则,开机时自动载入此规则文件中的规则
在/etc/rc.d/rc.local文件添加

iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
  • 1

定义Unit File, CentOS 7,8 可以安装 iptables-services 实现iptables.service

yum install iptables-services
iptables-save > /etc/sysconfig/iptables
systemctl enable iptables.service
  • 1
  • 2
  • 3

iptables范例

如果做了WEB服务器,开启80端口.
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  

如果做了邮件服务器,开启25,110端口.
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT  

如果做了FTP服务器,开启21端口
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

如果做了DNS服务器,开启53端口
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT

如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
允许icmp包通过,也就是允许ping,
# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
# iptables -A INPUT -p icmp -j ACCEPT    (INPUT设置成DROP的话)  

允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)

下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.
减少不安全的端口连接
# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

网络防火墙

iptables/netfilter 利用filter表的FORWARD链,可以充当网络防火墙:
注意的问题:
(1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行

NAT 表

NAT: network address translation,支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链
请求报文:修改源/目标IP,由定义如何修改
响应报文:修改源/目标IP,根据跟踪机制自动实现
NAT的实现分为下面类型:
SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问
外部网络,实现地址伪装,请求报文:修改源IP
DNAT:destination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给
外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
PNAT: port nat,端口和IP都进行修改
NAT+PAT一起工作,请求报文,替换的是源地址(SNAT)。相应报文替换的是目的地址(DNAT)

SNAT

源地址转换,让本地网络中的主机通过某一特定地址访问外部网络,具体实现一般都在POSTROUTING链上,因为如果数据包是发给本机的。如果在PREROUTING链上做,不就是相当于浪费功夫吗吗,因为最后也是要发给自己,结果在发给自己之前还做了一层转换,所以有点浪费资源了。综合来说在POSTROUTING上做最合适。

为什么要进行源地址转换呢。我们想象一个场景,我们只有一个公网IP但是这时候我们有很多主机需要上网,我们内网的主机上网肯定需要公网IP才能上网。这时候我们只有一个公网IP,就可以进行SNAT转换,吧访问互联网的数据包都发给那个拥有公网ip的网关。网关进行SNAT转换,将源地址转换为公网IP地址。公网上数据包响应请求的时候发给网关。由网关再把目标地址转换回来。这样有2个好处。第一.保证了内网主机的安全。第二,解决了ipv4地址紧缺的问题。

私网访问外网
SNAT:基于nat表的target,适用于固定的公网IP
SNAT选项:
–to-source [ipaddr[-ipaddr]][:port[-port]] #什么地址去替换公网地址 还要指定哪一个网段
–random

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
#在postrouting中做策略  SNAT  不是本地局域网就不做POSTROUTING转发
  • 1
  • 2

范例:

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to source  
172.18.1.6-172.18.1.9  #实现多地址  前提这个地址是固定拥有的
  • 1
  • 2

MASQUERADE:基于nat表的target,适用于动态的公网IP,如拨号网络
MASQUERADE选项:
–to-ports port[-port]
–random

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE   #自动判断公网地址转换
  • 1

范例:

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE  #动态地址
  • 1

优点:只需要一个公网地址。防止黑客攻击,因为是私有地址没有路由。

DNAT

DNAT 的全称为Destination Network Address Translation目的地址转换,原理和SNAT类似,只是DNAT修改的是目的地址。而SNAT修改的是源地址。
还有就是DNAT一般在PREROUTING链上修改。为什么呢。我们可以这样想。如果本地主机正好也开启了一个和服务端提供服务相同的端口,这时候,我们再去访问网关,网关将会将请求送到自己的用户空间,这样后端的服务器就没有收到请求。而客户端得到的也不是他想要的东西。所以综合考虑在PREROUTING会比较好。

那DNAT主要是为了解决什么样的问题呢?我们想象这样一个场景。假设我们不是客户端了。我们现在是服务端,要提供web服务。当用户来连接的时候,如果直接访问我们的真实服务器。这是不是不太好。相当于直接暴露在公网,有一些黑客很容易就攻击你。而如果我们告诉用户一个ip,让用户来连接这个ip。再由这个网关或者说防火墙进行DNAT,转发给后端。这样一来,至少有2个好处。第一,保证了后端主机的一定安全,因为没有直接暴露在公网。第二,如果躲在网关后面的服务器不止一台。我们还可以做一些负载均衡,让网站更健壮。(但是这种直接配置iptables来完成负载均衡的方法,一般不这么用了。)

外网访问内网(私网)
DNAT:nat表的target,适用于端口映射
DNAT选项:
–to-destination [ipaddr[-ipaddr]][:port[-port]]

iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --todestination InterSeverIP[:PORT]
  • 1

范例:

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.7 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.7 -p tcp --dport 80 -j DNAT --to-destination 
10.0.1.22:8080
  • 1
  • 2
  • 3

转发REDIRECT

REDIRECT,是NAT表的target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口,可用于
PREROUTING OUTPUT链

REDIRECT选项:
–to-ports port[-port]
范例:

iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080
  • 1

扩展:

[root@centos8 ~]#while true;do  awk '{ip[$1]++}END{for (i in ip){if(ip[i]>=100)system("iptables -A INPUT -s 
"i" -j REJECT")}}'  /var/log/httpd/access_log ;sleep 10 ;done  #脚本禁止超过100次数访问ip拒绝访问
  • 1
  • 2

理解三个转发的逻辑非常重要

实战案例:马哥教育原校区的防火墙配置设置

# Generated by iptables-save v1.4.7 on Wed May 18 09:22:34 2016
*filter
:INPUT ACCEPT [85890:4530430]
:FORWARD ACCEPT [76814:55698470]
:OUTPUT ACCEPT [166620:238017546]
-A FORWARD -s 172.16.0.100/32 -j ACCEPT          #转发 这几台机器不受控制
-A FORWARD -s 172.16.0.200/32 -j ACCEPT
-A FORWARD -s 172.16.0.67/32 -j ACCEPT
#WANG ADD NEXT LINE IN 20170627
#-A FORWARD -s 172.16.0.0/16 -j ACCEPT
#WANG ADD NEXT LINE IN 20170704
#-A FORWARD -s 172.18.0.0/16 -j ACCEPT
#-A FORWARD -s 172.18.0.0/16 -j REJECT
#-A FORWARD -s 172.16.0.68/32 -j ACCEPT
#-A FORWARD -s 172.16.0.69/32 -j ACCEPT
#-A FORWARD -s 172.16.0.6/32 -j ACCEPT
-A FORWARD -s 172.17.200.200/32 -j ACCEPT
-A FORWARD -s 172.17.136.136/32 -j ACCEPT
-A FORWARD -s 172.17.0.100/32 -j ACCEPT
-A FORWARD -s 172.18.100.1/32 -j ACCEPT
-A FORWARD -s 172.18.0.100/32 -j ACCEPT
-A FORWARD -s 172.18.200.2/32 -j ACCEPT
-A FORWARD -s 172.18.200.3/32 -j ACCEPT
-A FORWARD -s 172.18.211.211/32 -j ACCEPT
-A FORWARD -s 172.18.212.212/32 -j ACCEPT
-A FORWARD -m iprange --src-range 172.16.0.100-172.16.0.110 -j ACCEPT #范围
-A FORWARD -m iprange --src-range 172.17.0.100-172.17.0.110 -j ACCEPT
-A FORWARD -m iprange --src-range 172.18.0.100-172.18.0.110 -j ACCEPT
-A FORWARD -m iprange --src-range 172.17.100.6-172.17.100.16 -j ACCEPT
-A FORWARD -m iprange --src-range 172.18.100.61-172.18.100.70 -j ACCEPT
-A FORWARD -s 172.16.0.0/16 -m string --string "verycd.com" --algo kmp --to65535 -j REJECT 
--reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "tudou.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "youku.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "iqiyi.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "pptv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "letv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "xunlei.com" --algo kmp --to
65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "verycd.com" --algo kmp --to
65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "tudou.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "youku.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "iqiyi.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "pptv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "letv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "xunlei.com" --algo kmp --to
65535 -j REJECT --reject-with icmp-port-unreachable
#-A FORWARD -s 172.18.0.0/16 -j REJECT
#-A FORWARD -s 172.16.0.0/16 -j REJECT
#-A FORWARD -i ppp0 -m string --string ".exe" --algo bm --to 65535 -j REJECT --reject-with icmp-port-
unreachable
-A FORWARD -s 172.18.0.0/16 -m time --timestart 08:50:00 --timestop 18:00:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
-A FORWARD -s 172.17.0.0/16 -m time --timestart 08:50:00 --timestop 18:00:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m time --timestart 08:50:00 --timestop 12:30:00 --
weekdays Tue,Thu,Sat --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m time --timestart 13:50:00 --timestop 18:00:00 --
weekdays Tue,Thu,Sat --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#wang next 2 lines changed in 20170619
#-A FORWARD -s 172.17.0.0/16 -m time --timestart 08:50:00 --timestop 12:30:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#-A FORWARD -s 172.17.0.172.17.0.0/16 -m time --timestart 13:30:00 --timestop 18:10:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#-A FORWARD -s 172.18.0.0/16 -m time --timestart 08:50:00 --timestop 18:10:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#-A FORWARD -s 172.18.0.0/16 -m time --timestart 08:50:00 --timestop 18:10:00 --
weekdays Tue,Thu --datestop 2038-01-19T11:14:07 -j REJECT --reject-with icmpport-
unreachable
COMMIT
# Completed on Wed May 18 09:22:34 2016
# Generated by iptables-save v1.4.7 on Wed May 18 09:22:34 2016
*nat
:PREROUTING ACCEPT [1429833:65427211]
:POSTROUTING ACCEPT [850518:35452195]
:OUTPUT ACCEPT [120198:9146655]
-A POSTROUTING -s 172.16.0.100/32 -j MASQUERADE
-A POSTROUTING -s 172.18.0.100/32 -j MASQUERADE
#-A POSTROUTING -s 172.16.0.200/32 -j MASQUERADE
#wang add next 1 line in 20170619
#wang add next 1 line in 20170704
-A POSTROUTING -s 172.16.0.69/32 -j MASQUERADE
-A POSTROUTING -s 172.17.200.200/32 -j MASQUERADE  #地址转换
-A POSTROUTING -s 172.17.136.136/32 -j MASQUERADE
-A POSTROUTING -s 172.17.0.100/32 -j MASQUERADE
#-A POSTROUTING -s 172.18.0.0/16 -j MASQUERADE
#-A POSTROUTING -s 172.16.0.6/32 -j MASQUERADE
-A POSTROUTING -m iprange --src-range 172.16.0.100-172.16.0.110 -j MASQUERADE
-A POSTROUTING -m iprange --src-range 172.17.0.100-172.17.0.110 -j MASQUERADE
-A POSTROUTING -m iprange --src-range 172.18.0.100-172.18.0.110 -j MASQUERADE
-A POSTROUTING -s 172.16.0.0/16 -p tcp -m multiport --dports 80,443,53,22,6666 -
j MASQUERADE      #只能访问互联网固定端口   端口6666 是自定义端口
-A POSTROUTING -s 172.16.0.0/16 -p udp -m multiport --dports 22 -j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 -p tcp -m multiport --dports 80,443,53,22,6666 -
j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 -p udp -m multiport --dports 22 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 -p tcp -m multiport --dports
80,443,53,22,6666,1206,5938,1949 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 -p udp -m multiport --dports 22,1206,5938,1949 -
j MASQUERADE
COMMIT
# Completed on Wed May 18 09:22:34 2016
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120

查看端口是什么服务:

[root@centos8 ~]#grep 端口号 /etc/services 
  • 1

firewalld服务

firewalld 介绍

firewalld是CentOS 7.0新推出的管理netfilter的工具
firewalld是配置和监控防火墙规则的系统守护进程。可以实iptables,ip6tables,ebtables的功能
firewalld服务由firewalld包提供
firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
归入zone顺序:
先根据数据包中源地址,将其纳为某个zone
纳为网络接口所属zone
纳入默认zone,默认为public zone,管理员可以改为其它zone
网卡默认属于public zone,lo网络接口属于trusted zone

firewalld zone分类
zone名称默认配置
trusted允许所有流量
home拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量
internal拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量。和home相同
work拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量
public (默认)拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于public zone
external拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。
dmz拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量
block拒绝除和传出流量相关的所有传入流量
drop拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应)
预定义服务
服务名称配置
sshLocal SSH server. Traffic to 22/tcp
dhcpv6-clientLocal DHCPv6 client. Traffic to 546/udp on the fe80::/64 IPv6 network
ippclientLocal IPP printing. Traffic to 631/udp.
sambaclientLocal Windows file and print sharing client. Traffic to 137/udp and 138/udp.
mdnsmdnsMulticast DNS (mDNS) local-link name resolution. Traffic to 5353/udp to the224.0.0.251 (IPv4) or ff02::fb (IPv6) multicast addresses.

firewalld预定义服务配置
firewall-cmd --get-services 查看预定义服务列表
/usr/lib/firewalld/services/*.xml预定义服务的配置

firewalld 三种配置方法
firewall-config (firewall-config包)图形工具
firewall-cmd (firewalld包)命令行工具
/etc/firewalld 配置文件,一般不建议

firewall-cmd 命令

firewall-cmd 格式

Usage: firewall-cmd [OPTIONS...]
  • 1

常见选项

--get-zones 列出所有可用区域
--get-default-zone 查询默认区域
--set-default-zone= 设置默认区域
--get-active-zones 列出当前正使用的区域
--add-source=[--zone=] 添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域
--remove-source= [--zone=] 从指定区域删除源地址的流量,如无--zone= 选项,使用默认区域
--add-interface=[--zone=] 添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域
--change-interface=[--zone=] 改变指定接口至新的区域,如果无--zone= 选项,使用默认区域
--add-service= [--zone=] 允许服务的流量通过,如果无--zone= 选项,使用默认区域
--add-port=<PORT/PROTOCOL>[--zone=] 允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
--remove-service= [--zone=] 从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用默认区域
--remove-port=<PORT/PROTOCOL>[--zone=] 从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选项,
使用默认区域
--reload 删除当前运行时配置,应用加载永久配置
--list-services 查看开放的服务
--list-ports 查看开放的端口
--list-all [--zone=] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无--zone=选项,使用默认区域
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

范例:

#查看默认zone
firewall-cmd --get-default-zone
#默认zone设为dmz
firewall-cmd --set-default-zone=dmz
#在internal zone中增加源地址192.168.0.0/24的永久规则
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
#在internal zone中增加协议mysql的永久规则
firewall-cmd --permanent –zone=internal --add-service=mysql
#加载新规则以生效
firewall-cmd --reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

范例:配置firewalld

systemctl mask iptables
systemctl mask ip6tables
systemctl status firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public
firewall-cmd --permanent --zone=public --list-all
firewall-cmd --permanent --zone=public --add-port 8080/tcp
firewall-cmd ---reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

其它规则

当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则

rich-rules 富规则,功能强,表达性语言
Direct configuration rules 直接规则,灵活性差, 帮助:man 5 firewalld.direct

管理rich规则

rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和
auditd,也可以实现端口转发,伪装和限制速率
规则实施顺序:
该区域的端口转发,伪装规则
该区域的日志规则
该区域的允许规则
该区域的拒绝规则
每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效
rich语法:

rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

man 5 firewalld.richlanguage

rich规则选项
选项描述
- -add-richrule=’’Add to the specified zone, or the default zone if no zone is specified.
- -removerichrule=’’Remove to the specified zone, or the default zone if no zone is specified.
- -queryrichrule=’’Query if has been added to the specified zone, or the default zone if no zoneis specified. Returns 0 if the rule is present, otherwise 1.
- -list-richrulesOutputs all rich rules for the specified zone, or the default zone if no zone isspecified.
rich规则实现

拒绝从192.168.0.11的所有流量,当address 选项使用source 或 destination时,必须用family= ipv4|ipv6

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 
reject'
  • 1
  • 2

限制每分钟只有两个连接到ftp服务

firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
  • 1

抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包

firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'
  • 1

接受所有192.168.1.0/24子网端口5900-5905范围的TCP流量

firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source
address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'
  • 1
  • 2
rich日志规则
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]
<LOGLEVEL> 可以是emerg,alert, crit, error, warning, notice, info, debug.
<DURATION> s:秒, m:分钟, h:小时, d:天
audit [limit value="<RATE/DURATION>"]
  • 1
  • 2
  • 3
  • 4

范例

#接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh"
log prefix="ssh " level="notice" limit value="3/m" accept

#从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息

firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" 
audit limit value="1/h" reject' --timeout=300

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.X.10/32 service 
name="http" log level=notice prefix="NEW HTTP "
limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
伪装和端口转发

NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式

伪装NAT

firewall-cmd --permanent --zone=<ZONE> --add-masquerade
firewall-cmd --query-masquerade #检查是否允许伪装
firewall-cmd --add-masquerade #允许防火墙伪装IP
firewall-cmd --remove-masquerade #禁止防火墙伪装IP
  • 1
  • 2
  • 3
  • 4

范例:

firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
  • 1

端口转发
端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪装才能实现

firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=
<PORTNUMBER>][:toaddr=]
  • 1
  • 2

说明:toport= 和toaddr= 至少要指定一个
范例:

#转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
firewall-cmd --add-masquerade 启用伪装
firewall-cmd --zone=public --add-forwardport=
port=9527:proto=tcp:toport=80:toaddr=192.168.0.254
  • 1
  • 2
  • 3
  • 4

rich规则的port转发语法:

forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
  • 1

范例:

#转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source
address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source
address=172.25.X.10/32 forward-port port=443 protocol=tcp to-port=22'
firewall-cmd --reload
ssh -p 443 serverX.example.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

范例:限制ssh服务非标准端口访问

cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
vim /etc/firewalld/services/ssh.xml
<port protocol="tcp" port="999"/>
systemctl restart sshd.service
systemctl status -l sshd.service
sealert -a /var/log/audit/audit.log
semanage port -a -t ssh_port_t -p tcp 999
systemctl restart sshd.service
ss -tulpn | grep sshd
firewall-cmd --permanent --zone=work --add-source=172.25.X.0/24
firewall-cmd --permanent --zone=work --add-port=999/tcp
firewall-cmd --reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

练习

说明:以下练习INPUT和OUTPUT默认策略均为DROP
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含
了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数
据下载请求的次数每分钟不得超过5个
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的学号,新请求建立的速率一分钟
不得超过2个;仅允许响应报文通过其服务端口离开本机
4、拒绝TCP标志位全部为1及全部为0的报文访问本机
5、允许本机ping别的主机;但不开放别的主机ping本机
6、判断下述规则的意义

iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 172.16.100.7 -j RETURN
iptables -A INPUT -d 172.16.100.7 -j clean_in
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,873,135,137,139,445 -
j DROP
iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,873,135,137,139,445 -
j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,3389 -j DROP
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

7 实现主机防火墙
放行telnet, ftp, web服务
放行samba服务
放行dns服务(查询和区域传送)
8 实现网络防火墙
放行telnet, ftp, web服务
放行samba服务
放行dns服务(查询和区域传送)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/184264
推荐阅读
相关标签
  

闽ICP备14008679号