[TOC]
0x00 Firewall 快速入门 (1)firewalld简介: 它是Linux上新用的防火墙软件它跟iptables防火墙是差不多的工具但比其更好使用与设置;
firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。 ,也提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具; 在CentOS7.0中默认使用firewall代替了iptables service,使得软防火墙操作更加便利人性化,Firewalld有图形界面和字符命令界面;
firewalld 特点特性:
D-BUS 接口提供防火墙状态的信息,使防火墙的启用、停用或查询设置成为可能。
它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项
区域:网络或者防火墙区域定义了连接的可信程度(加入了防火墙的“zone”区域概念)
服务:服务可以是一系列本读端口、目的以及附加信息,也可以是服务启动时自动增加的防火墙助手模块;
ICMP 类型: Internet 控制报文协议 (ICMP) 被用以交换报文和互联网协议 (IP) 的错误报文
直接接口: 主要用于服务或者应用程序增加特定的防火墙规则,即支持允许服务或者应用程序直接添加防火墙规则的接口(都是临时生效
)
运行时配置:运行时配置并非永久有效, 支持动态更新重启服务直接reload规则就行
永久配置:永久配置存储在配置文件种,每次机器重启或者服务重启、重新加载时将自动恢复。
firewalld跟iptables比起来至少有两大好处:
firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链
”而且对TCP/IP协议也不理解也可以实现大部分功能。
Tips:firewalld自身并不具备防火墙的功能
,而是和iptables一样需要通过内核的netfilter来实现,即firewalld和 iptables一样都是作用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了
。
Q:什么是区域? 网络区域定义了网络连接的可信等级。这是一个一对多的关系意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。
Q:哪个区域可用? 由firewalld 提供的区域按照从不信任到信任的顺序排序。
丢弃(drop): 任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。
阻塞(block): 任何进入的网络连接都被拒绝,并返回 IPv4的icmp-host-prohibited报文或者IPv6的icmp6-adm-prohibited报文。只允许由该系统初始化的网络连接。
公开(public): 用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
外部(externel): 用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
隔离区(DMZ): 用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。
工作(work): 用在工作网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
家庭(home): 用在家庭网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
内部(internal): 用在内部网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
受信任的(trusted): 允许所有网络连接。
由 NetworkManager 控制的网络连接 描述:防火墙不能够通过 NetworkManager 显示的名称来配置网络连接,只能配置网络接口; 如果在配置文件中没有配置区域,接口将配置到 firewalld 的默认区域。如果网络连接使用了不止一个接口,所有的接口都会应用到 fiwewalld。接口名称的改变也将由 NetworkManager 控制并应用到firewalld。
为了简此网络连接将被用作与区域的关系。
当接口断开NM也告诉Firewall从区域中删除该接口;
当firewalld 启动后将通知NM把网络连接增加到区域
注意事项:
虽然Centos7 继续保留了iptables命令但不能使用,除非手动删除firewall再安装iptables否则不能继续使用以前的iptables配置方法
firewall daemon 无法解析由 iptables 和 ebtables 命令行工具添加的防火墙规则
静态防火墙(system-config-firewall/lokkit)与 “守护进程” 不能同时使用
参考文档:https://fedoraproject.org/wiki/FirewallD/zh-cn 官方文档:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld
(2) firewall安装与启动 默认环境:CentOS Linux release 7.6.1810 (Core) 字符界面管理工具:firewall-cmd 图形界面管理工具:firewall-config
[TOC]
0x00 Firewall 快速入门 (1)firewalld简介: 它是Linux上新用的防火墙软件它跟iptables防火墙是差不多的工具但比其更好使用与设置;
firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。 ,也提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具; 在CentOS7.0中默认使用firewall代替了iptables service,使得软防火墙操作更加便利人性化,Firewalld有图形界面和字符命令界面;
firewalld 特点特性:
D-BUS 接口提供防火墙状态的信息,使防火墙的启用、停用或查询设置成为可能。
它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项
区域:网络或者防火墙区域定义了连接的可信程度(加入了防火墙的“zone”区域概念)
服务:服务可以是一系列本读端口、目的以及附加信息,也可以是服务启动时自动增加的防火墙助手模块;
ICMP 类型: Internet 控制报文协议 (ICMP) 被用以交换报文和互联网协议 (IP) 的错误报文
直接接口: 主要用于服务或者应用程序增加特定的防火墙规则,即支持允许服务或者应用程序直接添加防火墙规则的接口(都是临时生效
)
运行时配置:运行时配置并非永久有效, 支持动态更新重启服务直接reload规则就行
永久配置:永久配置存储在配置文件种,每次机器重启或者服务重启、重新加载时将自动恢复。
firewalld跟iptables比起来至少有两大好处:
firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链
”而且对TCP/IP协议也不理解也可以实现大部分功能。
Tips:firewalld自身并不具备防火墙的功能
,而是和iptables一样需要通过内核的netfilter来实现,即firewalld和 iptables一样都是作用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了
。
Q:什么是区域? 网络区域定义了网络连接的可信等级。这是一个一对多的关系意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。
Q:哪个区域可用? 由firewalld 提供的区域按照从不信任到信任的顺序排序。
丢弃(drop): 任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。
阻塞(block): 任何进入的网络连接都被拒绝,并返回 IPv4的icmp-host-prohibited报文或者IPv6的icmp6-adm-prohibited报文。只允许由该系统初始化的网络连接。
公开(public): 用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
外部(externel): 用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
隔离区(DMZ): 用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。
工作(work): 用在工作网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
家庭(home): 用在家庭网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
内部(internal): 用在内部网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
受信任的(trusted): 允许所有网络连接。
由 NetworkManager 控制的网络连接 描述:防火墙不能够通过 NetworkManager 显示的名称来配置网络连接,只能配置网络接口; 如果在配置文件中没有配置区域,接口将配置到 firewalld 的默认区域。如果网络连接使用了不止一个接口,所有的接口都会应用到 fiwewalld。接口名称的改变也将由 NetworkManager 控制并应用到firewalld。
为了简此网络连接将被用作与区域的关系。
当接口断开NM也告诉Firewall从区域中删除该接口;
当firewalld 启动后将通知NM把网络连接增加到区域
注意事项:
虽然Centos7 继续保留了iptables命令但不能使用,除非手动删除firewall再安装iptables否则不能继续使用以前的iptables配置方法
firewall daemon 无法解析由 iptables 和 ebtables 命令行工具添加的防火墙规则
静态防火墙(system-config-firewall/lokkit)与 “守护进程” 不能同时使用
参考文档:https://fedoraproject.org/wiki/FirewallD/zh-cn 官方文档:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld
(2) firewall安装与启动 默认环境:CentOS Linux release 7.6.1810 (Core) 字符界面管理工具:firewall-cmd 图形界面管理工具:firewall-config
1 2 3 4 5 yum install firewalld firewall-config bash-completion -y systemctl start firewalld.service systemctl stop firewalld.service systemctl enable firewalld.service systemctl disable firewalld.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 firewall-cmd [选项 ... ] 通用选项 -h, --help -V, --version -q, --quiet 状态选项 --state --reload --complete-reload --runtime-to-permanent --check-config 日志选项 --get-log-denied --set -log-denied=<value> firewall-cmd --version firewall-cmd --help firewall-cmd --state running
Firewall配置文件以及目录: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /usr/lib/firewalld/ cd /usr/lib/firewalld/services /etc/firewalld/ /etc/firewalld/zones/ $cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/<?xml version="1.0" encoding="utf-8" ?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22" /> </service>
(3) firewall-cmd 命令 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 firewall-cmd --reload $firewall -cmd --get-zonesblock dmz drop external home internal public trusted work $firewall -cmd --get-servicesfirewall-cmd [ --zone=<zone> ] --list-services firewall-cmd --list-service ssh dhcpv6-client $firewall -cmd --get-icmptypesfirewall-cmd [--zone=<zone>] --list-all firewall-cmd --list-all-zones firewall-cmd --get-default-zone firewall-cmd --set -default-zone=<zone> firewall-cmd --get-active-zones firewall-cmd --get-zone-of-interface=<interface> firewall-cmd --get-zone-of-interface=ens192 public firewall-cmd [--zone=<zone>] --query-interface=<interface> firewall-cmd --query-interface=ens192 yes firewall-cmd [--zone=<zone>] --add-interface=<interface> firewall-cmd [--zone=<zone>] --change-interface=<interface> firewall-cmd [--zone=<zone>] --remove-interface=<interface> firewall-cmd --panic-on firewall-cmd --panic-off firewall-cmd --query-panic firewall-cmd --permanent [运行时区域]
(4)处理运行时区域 注意:运行时模式下对区域进行的修改不是永久有效的,重新加载或者重启后修改将失效。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 firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>] firewall-cmd --zone=home --add-service=ipp-client --timeout=60 firewall-cmd [--zone=<zone>] --remove-service=<service> firewall-cmd --zone=home --remove-service=http firewall-cmd [--zone=<zone>] --query-service=<service> firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>] firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol> firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol> firewall-cmd [--zone=<zone>] --add-masquerade firewall-cmd [--zone=<zone>] --remove-masquerade firewall-cmd [--zone=<zone>] --query-masquerade firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype> firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype> firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype> firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
(5)直接选项 直接选项主要用于使服务和应用程序能够增加规则,规则不会被保存在重新加载或者重启之后必须再次提交。 传递的参数 < args > 与 iptables, ip6tables 以及 ebtables 一致。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args> firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain> --remove-chain --query-chain firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table> firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args> firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args> firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args> firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>
(6)命令行配置富规则 1 2 3 4 5 firewall-cmd --list-rich-rules firewall-cmd --add-rich-rule 'rule family=ipv4 source address=源地址 service name=服务名称 log prefix="fpt" level=info accept' --permannet
0x01 Firewall实例 1.ICMP禁Ping机器与启动ping通信:1 2 3 4 5 6 7 8 firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop' firewall-cmd --query-rich-rule='rule protocol value=' icmp' drop' firewall-cmd --remove-rich-rule='rule protocol value=icmp drop'
weiyigeek.top-禁ping
2.对于服务的开发与停止在 FirewallD 的服务名称暂时开放ftp或者ssh服务1 2 3 4 5 6 7 8 9 10 11 firewall-cmd --zone=public --add-service=ftp --permanent firewall-cmd --remove-service=ftp --permanent firewall-cmd --zone=public --remove-service=ssh --permanent firewall-cmd --zone=public --add-service=ssh --permanent firewall-cmd --reload firewall-cmd --query-service ftp no firewall-cmd --zone=public --query-service=ssh yes firewall-cmd --zone=public --remove-service=ssh --permanent
weiyigeek.top-开放服务
3.查看所有开放端口服务配置信息(默认public区域),查看public区域中所有打开的端口:1 2 $firewall -cmd --zone=public --list-all$firewall -cmd --zone=public --list-ports
weiyigeek.top-区域信息查看
4.添加接口到区域和设置更改区域的接口1 2 3 4 $firewall -cmd --get-active-zones 查看区域信息(公共接口): $firewall -cmd --get-zone-of-interface=eth0 $firewall -cmd --zone=public --add-interface=eth0 $firewall -cmd --zone=internal --change-zone=p3p1
weiyigeek.top-区域接口
5.查询包拒绝状态,以及更新防火墙规则(及重新加载配置,不用重启服务:)1 2 3 4 5 6 7 8 9 10 11 firewall-cmd --query-panic firewall-cmd --panic-on firewall-cmd --panic-off firewall-cmd --reload firewall-cmd --complete-reload service firewalld restart
指定开放端口和协议并关闭1 2 3 4 5 6 7 8 9 10 11 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload firewall-cmd --zone=public --query-port=80/tcp $firewall -cmd --zone=public --list-ports 80/tcp firewall-cmd --zone=public --remove-port=80/tcp --permanent firewall-cmd --zone=public --add-port=4990-4999/udp
流量转发:端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口,转发的目的如果不指定 ip 的话就默认为本机;如果指定了 ip 却没指定端口,则默认使用来源端口
。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sed -i '/net.ipv4.ip_forward/ s/\(.*= \).*/\11/' /etc/sysctl.conf firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 firewall-cmd --zone=public --add-masquerade firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.10.15 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080
如果配置好端口转发之后不能用,可以检查下面两个问题:
比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了
其次检查是否允许伪装 IP,没允许的话要开启伪装 IP
补充说明:
当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。
端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。
伪装IP 防火墙可以实现伪装IP的功能,下面的端口转发就会用到这个功能。1 2 3 firewall-cmd --query-masquerade firewall-cmd --add-masquerade firewall-cmd --remove-masquerade
rich-rule的规则的定义1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 firewall-cmd --add-rich-rule "rule family=ipv4 source address=10.0.10.1 service name='ssh' reject" firewall-cmd --add-rich-rule "rule family=ipv4 source address=10.0.10.1 service name='ssh' drop" firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.10.1 port port=22 protocol=tcp reject' firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.10.1" accept' firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.10.1" destination address="10.0.10.13/32" port port="8080-8090" protocol="tcp" accept' firewall-cmd --remove-rich-rule='rule family="ipv4" source address="10.0.10.1" destination address="10.0.10.13/32" port port="80" protocol="tcp" accept' firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.31.1.2 forward-port port=23456 protocol=tcp to-port=10211 to-addr=192.168.31.83' --permanent --zone=external
直接模式1 2 3 firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT firewall-cmd --reload