netfilter工作在主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应的处理

防火墙的种类:
软件防火墙:软件技术实现数据包过滤
硬件防火墙:硬件设备,实现数据包过滤

防火墙类型:
主机型防火墙:保护自己本机应用程序
网络防火墙:保护内部其他服务器应用程序

软件型防火墙:netfilter是Linux内核自带一个模块,网络过滤器
CentOS7系统:默认使用的防火墙管理工具firewalld
CentOS6系统:默认使用的防火墙管理工具iptables

firewalld防火墙
管理工具:firewalld-cmd
防火墙预设安全区域
public:仅允许访问本机的sshd、DHCP、ping等少量服务
trusted:允许任何访问
block:拒绝任何来访请求,有明确回应
drop:拒绝任何来访请求,没有任何回应(丢弃)

#开启防火墙
[root@localhost ~]# systemctl start firewalld

#查看默认区域
[root@localhost ~]# firewall-cmd --get-default-zone
public

#修改默认区域
firewall-cmd --set-default-zone=区域名	 

#将默认区域修改为block
[root@localhost ~]# firewall-cmd --set-default-zone=block
success

[root@localhost ~]# firewall-cmd --get-default-zone
block

#将默认区域修改为dorp
[root@localhost ~]# firewall-cmd --set-default-zone=drop
success

[root@localhost ~]# firewall-cmd --get-default-zone
drop

#将默认区域修改为public
[root@localhost ~]# firewall-cmd --set-default-zone=public
success
[root@localhost ~]# firewall-cmd --get-default-zone
public

#查看区域规则
firewall-cmd --zone=区域名 --list-all		

#查看public所有规则
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default    #默认区域
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: ssh dhcpv6-client   #允许访问的服务
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	
#为public区域添加http协议,使用 --add-service=服务名
[root@localhost ~]# firewall-cmd --zone=public --add-service=http
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: ssh dhcpv6-client http   #添加http协议
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

#为public添加ftp协议
[root@localhost ~]# firewall-cmd --zone=public --add-service=ftp
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: ssh dhcpv6-client http ftp   #添加ftp协议
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

封网段开服务

#若针对永久配置需添加 --permanent
#使用  -- add-source=网段地址

#为public区域永久添加http协议
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: ssh dhcpv6-client http ftp
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

#为public区域永久添加ftp协议	
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=ftp
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: ssh dhcpv6-client http ftp
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

#永久修改需重新加载防火墙配置
firewall-cmd --reload
[root@localhost ~]# firewall-cmd --reload
success

#单独拒绝某一个IP
[root@localhost ~]# firewall-cmd --zone=block --add-source=192.168.0.24
success
[root@localhost ~]# firewall-cmd --zone=block --list-all
block (active)
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces: 
  sources: 192.168.0.24
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

#删除规则:--remove-source

#删除block区域的指定IP
[root@localhost ~]# firewall-cmd --zone=block --remove-source=192.168.0.24
success
[root@localhost ~]# firewall-cmd --zone=block --list-all
block

#删除public区域的ftp协议
[root@localhost ~]# firewall-cmd --zone=public --remove-service=ftp
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: ssh dhcpv6-client http

防火墙端口映射
本地应用的端口重定向(端口1>端口2)从客户机访问端口1的请求,自动映射到本机端口2

#当有人访问5432端口时,映射到本机的80端口
[root@localhost ~]# firewall-cmd --zone=public --add-forward-port=port=5432:proto=tcp:toport=80
success
#命令解释:
--add--forward   #添加转发端口
port=port=5432   #指定转发的端口
proto=tcp        #指定tcp协议
toport=80        #指定目标端口

[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources: 
  services: ssh dhcpv6-client http
  ports: 
  protocols: 
  masquerade: no
  forward-ports: port=5432:proto=tcp:toport=80:toaddr=
  source-ports: 
  icmp-blocks: 
  rich rules: 

iptables框架
iptables的4表
filter:是iptables的默认表,用于对数据包进行过滤
包含三个链:INPUT,OUTPUT,FORWARD
nat:地址转换表,不能过滤数据包,用于修改数据包中的源IP与目的IP和端口映射
包含三个链:PREROUTING,POSTROUTING,OUTPUT
mangle:包标记表, 主要功能是修改数据包的一些标志位,以便对数据包进行策略路由
包含五个链:PREROUTING,FORWARD,POSTROUTING,INPUT,OUTPUTr决定是否跟踪数据包
raw:状态跟踪表,用于跟踪数据包
包含两个链:OUTPUT,PREROUTING

iptables的5链
PREROUTING链:用于处理刚到达本机并在路由转发前的数据包,它会转换数据包中的目标IP地址,通常用于DNAT(destination NAT)目标地址转换
POSTROUTING链:用于处理即将离开本机的数据包,它会转换数据包中的源IP地址,通常用于SNAT(source ipaddress)源地址转换
FORWARD链:用于将数据包转发到本机的另外一个网络所需要的链
INPUT链:入站规则,限制客户端数据包目地地址是防火墙主机的上层应用所需要的链
OUTPUT链:出站规则,限制防火墙主机上层应用产生的数据包是否可以出站需要的链

iptables命令格式
命令格式:Iptables [-t 表名] 选项 [链名] [条件] [-j 目标操作]
添加规则:
-A #追加一条防火墙规则至链的末尾
-I #插入一条防火墙规则至链的开头

查看规则:
-L #查看iptables所有规则,与-n连用
-n #以数字形式显示地址、端口等信息,与-L连用
--line-numbers #查看规则时,显示规则的行号

删除规则:
-D #删除链内指定的序号(或内容)的一条规则
-F #清空指定表的所有规则

默认规则:
-P #为指定的链设置默认规则

目标操作
ACCEPT:允许通过/放行
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,有明确回应

iptables防火墙规则的条件
通用匹配:
协议匹配:-p #协议名称
地址匹配:-s 源地址、-d 目标地址
接口匹配:-i 接受数据的网卡、-o 发送数据的网卡
端口匹配:--sport 源端口号、--dport 目标端口号
创建规则注意事项
1.可以不指定表,默认为filter表
2.如果没有找到匹配条件,执行防火墙默认规则

主机型防火墙规则配置

#停止本机的firewalld防火墙
[root@iptables-server ~]# systemctl stop firewalld
[root@iptables-server ~]# systemctl disable firewalld

#安装iptables服务
[root@iptables ~]# yum -y install iptables-services
[root@iptables ~]# systemctl start iptables

#拒绝icmp访问
[root@iptables ~]# iptables -t filter -I INPUT -p icmp -j REJECT

#查看规则
[root@iptables ~]# iptables -L -n --line-numbers

#测试icmp访问
[root@client24 ~]# ping 192.168.0.80
PING 192.168.0.10 (192.168.0.80) 56(84) bytes of data.
From 192.168.0.10 icmp_seq=1 Destination Port Unreachable

[root@iptables ~]# iptables -t filter -I INPUT -p icmp -j DROP
[root@iptables ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT

#清空某一条规则(默认为filter表)
[root@iptables ~]# iptables -t filter -D  INPUT  3 

#清空所有规则(默认为filter表所有规则)
[root@iptables ~]# iptables -F

#清空其他表所有规则
[root@iptables ~]# iptables -t nat -F
[root@iptables ~]# iptables -t raw -F
[root@iptables ~]# iptables -t mangle -F

设置防火墙默认规则

#查看filter表
[root@iptables ~]# iptables -t filter -nL

#允许22号端口被访问
[root@iptables ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT

[root@iptables ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

#将filter表INPUT链默认规则修改为DROP
[root@iptables ~]# iptables -t filter -P INPUT DROP 

[root@iptables ~]# iptables -nL
Chain INPUT (policy DROP)   #默认为拒
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22  #只允许22端口访问,其他全部拒绝
#将默认规则修改为ACCEPT
[root@iptables ~]# iptables -t filter -P INPUT ACCEPT

#清空防火墙规则
[root@iptables ~]# iptables -F

#设置防火墙拒绝所有80端口的访问
[root@iptables ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j REJECT

#查看规则
[root@iptables ~]# iptables -nL

#清空规则
[root@iptables ~]# iptables -F

#单独拒绝某个IP
[root@iptables ~]# iptables -t filter -I INPUT  -s 192.168.0.24 -j REJECT

#单独拒绝某个IP不允许访问本机的某个服务(端口)
[root@iptables ~]# iptables -I INPUT -s 192.168.0.24 -p tcp --dport 80 -j REJECT

#查看规则
[root@master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  192.168.0.80         0.0.0.0/0            reject-with icmp-port-unreachable

192.168.0.20访问测试
[root@client24 ~]# curl http://192.168.0.80
curl: (7) Failed connect to 192.168.0.80:80; 拒绝连接

#拒绝客户端访问本机网卡的80端口
[root@iptables ~]# iptables -t filter -I INPUT -i ens32 -p tcp --dport 80 -j REJECT

#客户端测试
[root@client24 ~]# curl http://192.168.0.80
curl: (7) Failed connect to 192.168.0.10:80; 拒绝连接

[root@iptables ~]# iptables -F

#设置防火墙拒绝某个网段
[root@iptables ~]# iptables -t filter -I INPUT -s 192.168.1.0/24 -j REJECT

#查看规则
[root@iptables ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  192.168.1.0/24       0.0.0.0/0

网络型防火墙规则配置
通过路由转发配置网络型防火墙
主机名 网卡、IP地址、网关设置
host10 ens32:192.168.1.10,网关指向防火墙外网IP:192.168.1.100
iptables ens32内网IP:192.168.0.40,ens34外网IP:192.168.1.100
web-11 ens32:192.168.0.11,网关指向防火墙内网IP:192.168.0.40

防火墙主机添加网卡并设置IP,IP设置为:192.168.0.100/24

nmtui  修改网卡IP地址(交互)

#开启路由转发功能
[root@iptables ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf 

[root@iptabels ~]# sysctl -p   //加载配置立即生效
net.ipv4.ip_forward = 1
 
#查看路由转发
[root@iptables ~]# cat /proc/sys/net/ipv4/ip_forward
1

第二台服务器提供网站服务:web26将网关指向192.168.0.11

#安装httpd服务
[root@web26 ~]# yum -y install httpd
 
#修改默认首页
[root@web26 ~]# echo  web26 > /var/www/html/index.html
[root@web26 ~]# systemctl start httpd
[root@web26 ~]# systemctl status httpd

第三台为客户端:client将IP修改为192.168.1.24网段,将网关指向防火墙主机的第二块网卡:192.168.1.100
访问测试:curl http://192.168.0.26
防火墙主机配置规则:拒绝192.168.1.10访问80端口

[root@iptables ~]# iptables -I FORWARD -s 192.168.1.10 -p tcp --dport 80 -j DROP

#客户端192.168.1.30访问测试:
curl http://192.168.0.20

#拒绝所有客户端地址访问内网80端口
[root@iptables ~]# iptables -t filter -I FORWARD -p tcp --dport 80 -j REJECT

[root@iptables ~]# iptables -F 

防火墙扩展
命令格式:iptables 选项 链名 -m 扩展模块 --具体扩展条件 -j 动作

#根据MAC地址封锁主机,安装nmap扫描获取地方IP的MAC地址
[root@iptables ~]# yum -y install nmap

#扫描对方主机IP
[root@iptables ~]# nmap 192.168.28 
Starting Nmap 6.40 ( http://nmap.org ) at 2020-09-25 17:12 CST
Nmap scan report for 192.168.0.111
Host is up (0.00044s latency).                        //当前主机状态
MAC Address: 00:0C:29:CA:87:81 (VMware)   //MAC地址
Nmap done: 1 IP address (1 host up) scanned in 4.05 seconds

#通过MAC地址限制对方访问
[root@iptables ~]# iptables -t filter -I FORWARD -p tcp --dport 80 -m mac --mac-source 00:0C:29:D5:29:0F -j REJECT

基于多端口设置过滤规则

[root@iptables ~]# iptables -t filter -I FORWARD -p tcp -m multiport --dports 20,21,80,443 -j ACCEPT
#multiport :多端口模块

#根据IP范围设置封锁规则
[root@iptables ~]# iptables -t filter -I FORWARD -p tcp --dport 80 -m iprange --src-range 192.168.1.20-192.168.1.30 -j REJECT
#iprange模块:ip范围模块
#--src-range:源IP
#--dst-range:目标IP 

配置SNAT实现共享上网
通过防火墙规则,允许局域网中的主机访问外网
主机名 网卡、IP地址、网关
内部主机:client25 ens32:192.168.1.25,网关:192.168.1.100
内部防火墙:iptables ens32外网IP:192.168.0.80,ens34内网IP:192.168.1.100
外部主机:web26 ens32:192.168.0.26,网关:192.168.0.80

#实现192.168.1.25转换为192.168.0.80
[root@iptables ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -p tcp  -j SNAT --to-source 192.168.0.80
#POSTROUTING:路由后链
#-s:指定源地址为192.168.1.0网段的地址
#-p:想要通过tcp协议
#--dport:访问目标的80端口时
#-j:SNAT转换
#--to-source:转换源地址为192.168.0.26

#web1动态查看访问日志
[root@web26 ~]# tail -f /var/log/httpd/access_log

client 192.168.1.25访问网站
curl  http://192.168.0.26

#所有iptables规则都是临时规则,如果需要永久保留规则需要执行如下命令
[root@iptables ~]# service iptables save
上一篇 下一篇