firewalld及iptables

firewalld

centos 7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处:
1、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
2、firewalld在使用上要比iptables人性化很多,即使不明白“四张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

注:实际上iptables还有第五张表—security表,但是这张表需要和selinux结合使用
firewalld目录结构:
firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),有两个存储位置
1、/etc/firewalld/
2、/usr/lib/firewalld/
使用规则:当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。注:两个目录下的同名配置文件第一个目录内的生效
第二个目录中存放的是firewalld给提供的通用配置文件,如果我们想修改配置, 那么可以copy一份到第一个目录中,然后再进行修改,当然也可以直接修改第二个目录下的文件
查看服务状态:
# systemctl status firewalld
# systemctl status -l firewalld
-l 完整信息 如果屏幕显示空间不够,默认情况下会缩略显示

启动关闭服务:
# systemctl start firewalld
# systemctl stop firewalld
# systemctl reload firewalld 重新加载配置
zone:
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下
九个zone其实就是九种方案,而且起决定作用的其实是每个xml文件所包含的内容,而不是文件名,所以不需要对每种zone(每个文件名)的含义花费过多的精力,比如trusted这个zone会信任所有的数据包,也就是说所有数据包都会放行,但是public这个zone只会放行其中所配置的服务,其他的一律不予放行,其实我们如果将这两个文件中的内容互换一下他们的规则就换过来了,也就是public这个zone会放行所有的数据包

注意:生效的只有默认zone里面的规则
trusted.xml中zone的target,就是因为他设置为了ACCEPT,所以才会放行所有的数据包,而 public.xml中的zone没有target属性,这样就会默认拒绝通过,所以public这个zone只有其中配置过的服务才可以通过

九区:
drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。

命令行显示firewalld运行状态
firewall-cmd —state
image.png
列出当前有多少个zone
firewall-cmd —get-zones
image.png
获取当前活动的zone
firewall-cmd —get-active-zones
image.png
获取默认zone
firewall-cmd —get-default-zone
image.png
设置默认zone
firewall-cmd —set-default-zone=public(9个zone均可设置)
image.png
拒绝/允许所有状态:(—panic为默认关闭状态)
firewall-cmd —panic-on #拒绝所有状态
firewall-cmd —panic-off #允许所有状态
image.png
查看是否拒绝panic:
firewall-cmd —query-panic
image.png
获取当前支持的service(跟当前服务器是否安装某服务无关)
firewall-cmd —get-services
image.png
检查下一次重载后将激活的服务:
firewall-cmd —get-services —permanent
image.png
显示端口,默认显示—zone=public
firewall-cmd —list-port
image.png
列出zone当前设置,默认public:
firewall-cmd —list-all
image.png
增加服务,例,给public增加http服务
firewall-cmd —zone=public —add-service=http —permanent #永久生效,—permanent
image.png
获取当前区域的接口:
#firewall-cmd —get-zone-of-interface=ens33
image.png

临时修改网络接口(ens33)为内部区域(internal):#用来修改网络接口
#firewall-cmd —zone=internal —change-interface=ens33
image.png

增加zone public开放http service:
# firewall-cmd —zone=public —add-service=http
success
# firewall-cmd —permanent —zone=internal —add-service=http
success
—permanent 永久生效

重新加载配置:
# firewall-cmd —reload
success

增加zone internal开放443/tcp协议端口:
# firewall-cmd —zone=internal —add-port=443/tcp
success
删除zone public 中ssh服务
# firewall-cmd —zone=public —remove-service=ssh
列出zone internal的所有service:
# firewall-cmd —zone=internal —list-services
dhcpv6-client ipp-client mdns samba-client ssh

设置黑/白名单: (hosts.allow hosts.deny)
增加172.28.129.0/24网段到zone trusted(信任)
# firewall-cmd —permanent —zone=trusted —add-source=172.28.129.0/24
success
设置黑/白名单: (hosts.allow hosts.deny)
增加172.28.129.0/24网段到zone trusted(信任)
# firewall-cmd —permanent —zone=trusted —add-source=172.28.129.0/24
success
add-source
列出zone truste的白名单:
# firewall-cmd —permanent —zone=trusted —list-sources
172.28.129.0/24

iptables

分类:

逻辑分类:主机防火墙(个人)和网络防火墙(集体)
主机防火墙:针对单个主机进行防护
网络防火墙:它往往处于网络入口或者边缘,针对于网络入口进行防护,服务于防火墙背后的局域网

物理分类:硬件防火墙和软件防火墙
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分基于软件实现,性能高,成本高
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上,性能低,成本低

基础:

iptables其实并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框架叫做“netfilter”。
netfilter 内核态 位于内核空间
iptables 用户态 位于用户空间

四表:
raw 追踪数据包
mangle 对数据包打标记
nat 地址转换
filter 数据包过滤

五链:
PREROUTING 在路由之前
INPUT 数据包进入时
FORWARD 数据包经过时
OUTPUT 数据包出去时
POSTROUTING 在路由之后

raw:
Chain PREROUTING (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
mangle:
Chain PREROUTING (policy ACCEPT)
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain POSTROUTING (policy ACCEPT)
nat:
Chain PREROUTING (policy ACCEPT)
Chain INPUT (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
Chain POSTROUTING (policy ACCEPT)
filter:
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT匹配过的数据包不会在去匹配)
Chain OUTPUT (policy ACCEPT)
匹配规则:
从上往下以此匹配,匹配过的数据包不会在去匹配。
port(协议):tcp udp icmp

删除规则:
iptables -F [-t 表名] 默认时删除filter表 删除的是表里的所有

查看规则:
iptables -L
iptables -L -n
iptables -L —line /iptables -L —line-number #均可查看规则序号
数据包的过滤:(实战)
李杨 (10.0.0.1) ping/ssh server(10.1.1.2)
语法:
iptables -t 表 动作 链 匹配条件 -j 目标动作
-s source #源地址
-d destination #目标地址
动作:

添加规则:-A
iptables -t filter -A INPUT -p icmp -j REJECT
iptables -t filter -A INPUT -p tcp —dport 22 -s 192.168.122.113 -j REJECT
插入规则:-I
如果不指定插入到第几条,默认插入到第一条
插到那默认就是第几条
iptables -t filter -I INPUT 2 -p tcp —dport 22 -s 192.168.122.114 -j REJECT 插入到第二条规则上面
iptables -t filter -I INPUT -p tcp —dport 22 -s 192.168.122.114 -j REJECT 默认插入到第一行
替换(修改)规则:-R
iptables -t filter -R INPUT 2 -p tcp —dport 22 -s 192.168.122.115 -j REJECT 把114—>115
删除规则:-D
iptables -t filter -D INPUT -p tcp —dport 22 -s 192.168.122.115 -j REJECT
iptables -L —line (要删除的序号)
iptables -t filter -D INPUT(链) 2

修改默认策略:-P 只能用DROP和ACCEPT
iptables -t filter -P INPUT DROP
iptables -t filter -P INPUT ACCEPT
添加自定义链:-N 默认不生效 是用来存储规则的
iptables -N blackrach 自己创建的链
iptables -t filter -A blacrach -p tcp —dport 22 -s 192.168.122.116 -j REJECT 往自定义链上添加
iptables -A INPUT -j blackrach 关联自定义链,使用自定义链
修改自定义链名称:-E
iptables -E blackrach blackcloud
删掉自定义规则:不能被关联,必须是空链
iptables -X +链名 删除自定义链
计数清零:-Z
清空字节数
清空数据包个数
-v 显示详细的计数信息
iptables -Z 清空计数

匹配条件:
基本匹配:
协议 -p tcp udp icmp
查端口:vim /etc/services 记录的是tcp/udp协议簇
vim /etc/protocols 记录的是icmp
-p tcp udp icmp
端口:使用端口前加协议(-p)
—sport源端口
iptables -A INPUT -p tcp —sport 22 -s 10.18.44.10 -j REJECT
—dport目标端口
iptables -A INPUT -p tcp —dport 22 -s 10.18.44.10 -j REJECT

IP
-s 源IP source ip地址 网段 逗号可以分开多个地址
-d 目标IP destination

扩展匹配:
[root@rabbitmq2 ~]# arping -I ens33 192.168.188.153
ARPING 192.168.188.153 from 192.168.188.154 ens33
Unicast reply from 192.168.188.153 [00:0C:29:91:FB:48] 0.773m
可查看目标MAC地址
查看路由的三种方式:
route、ip route、 netstat -route
[root@rabbitmq2 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 ens33
192.168.188.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@rabbitmq2 ~]# ip route
default via 192.168.188.2 dev ens33 proto dhcp metric 100
192.168.188.0/24 dev ens33 proto kernel scope link src 192.168.188.154 metric 100
[root@rabbitmq2 ~]# netstat -route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 ens33
192.168.188.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3

-m 后面+扩展匹配
-m multiport 多端口
#iptables -A INPUT -m multiport —sports(—source-ports) 80,20,22,1000:2000 -j DROP
—dports(—destination-ports)
-m iprange 多ip地址
# iptables -A INPUT -m iprange —src-range 10.18.44.211-10.18.44.250 -j DROP
-m mac
# iptables -A INPUT -m mac —mac-source 52:54:00:86:a1:86 -j REJECT
获取MAC的方式
[root@xingdian opt]# arp -a 10.0.102.101
[root@xingdian opt]# arping -I eth0 10.0.102.101

目标动作:
ACCEPT 允许数据包通过(默认策略)
DROP 直接丢弃数据包,不给任何回应
REJECT 拒绝数据包,必要时会给数据发送端一个响应
SNAT 源地址转换,可以解决內网用户用一个公网IP上网问题 POSTROUTING
DNAT 目标地址转换 PREROUTING
REDIRECT 做端口映射(扩展)

网络地址转换NAT(企业应用,虚拟机做实验效果不佳)
SNAT:把内网地址转换成公网地址

client ————————iptables——内网ip—公网( baidu公网)

一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?我防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -d 192.168.122.0/24 -j SNAT —to-source 192.168.2.1

DNAT:要把别人的公网ip换成我们内部的IP

web-server iptables client

如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?显然不可能了,所以只能使用PREROUTING
1.1 1.2 2.1 2.2
A ——————————-B——————————-C
转发

iptables -t nat -A PREROUTING -d 192.168.1.2 -j DNAT —to-destination 192.168.2.2
# iptables -t nat -A POSTROUTING -d 192.168.2.2 -j SNAT —to 192.168.2.1
~~~~~~~~~
面试题:
# iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 -dport 80 -j REDIRECT —to-destination 192.168.1.1:8080

docker 端口映射 namespace 命名空间 -p 80:8080