买产品做企业网站还是博客做网站现在挣钱吗
华子目录
- 什么是`防火墙`
- 分类
- `netfilter`(`数据包过滤`)
- 定义
- `netfilter`分析内容
- 防火墙无法完成的任务
- `netfilter`策略管理工具
- `netfilter`的`5类hook函数`
- 防火墙规则
- 策略匹配原则
- `iptables`
- `iptables`流量`处理动作`
- `iptables表`
- `5种规则表`
- `安装iptables`
- `iptables策略文件`
- `iptables命令`的`语法格式`以及`常用参数`
- 格式
- 参数
- 示例
- 查看策略`iptables -nL --line`
- 清空规则
- 修改策略
- 修改默认策略
- 添加链
- 修改链名
- 删除链
- 部署`nginx`,拒绝访问`80端口`
- 拒绝`来源`为`172.25.254.100`访问`80端口`
- 只能让`来源`为`172.25.254.100`访问`80端口`
- `iptables`的`状态跟踪`(只能访问`22`和`80`端口)
- 利用`iptables`搭建`Linux路由器`
什么是防火墙
防火墙时位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出

火墙是系统内核上的一个模块netfilter(数据包过滤机制)- 通过
netfilter来管理kernel space(内核空间)的策略
- 没有
火墙时,流量直接访问内核管理的服务- 有
火墙时,会在内核上开一个内核空间(记录了什么流量可以通过,什么流量不可以通过)。负责往内核空间里面写东西的是netfilter- 一个
linux内核上有2个网卡,只有开启内核路由转发功能,2个网卡才能通信
#临时开启内核路由转发
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
分类
硬件防火墙:由厂商设计好的主机硬件,其操作系统主要以提供数据包数据的过滤机制为主,并去掉不必要的功能软件防火墙:保护系统网络安全的一套软件
netfilter(数据包过滤)
定义
netfilter是一个工作在Linux内核的网络数据包处理框架,用于分析进入主机的网络数据包- 将
数据包的头部数据(硬件地址,软件地址,TCP,UDP,ICMP等)提取出来进行分析,来决定该连接为放行还是抵挡 netfilter分析OSI七层协议的2,3,4层
netfilter分析内容
拒绝让Internet的数据包进入主机的某些端口拒绝某些来源IP的数据包进入拒绝让带有某些特殊标志(flag)的数据包进入,如:带有SYN的主动连接标志- 分析
硬件地址(MAC地址)决定是否连接 - 可以做
nat地址转换
防火墙无法完成的任务
防火墙并不能杀毒或清除木马程序(假设主机开放了www服务,那么防火墙的设置一定是要将www服务的port开放给client端。假设www服务器有漏洞,或者请求www服务的数据包本身就是病毒的一部分时,防火墙时阻止不了的)防火墙无法阻止来自内部的攻击(防火墙对于内部的规则设置通常比较少,所以就很容易造成内部员工对于网络滥用的情况)
netfilter策略管理工具
netfilter这个内核网络栈过滤框架的使用需要通过iptables或nftables来进行
与netfilter进行交互工具常用种类
iptables服务使用iptables交互,rhel6之前系统默认使用此服务,管理手段丰富,配置比较复杂firewalld服务使用nftables交互,rhel6之后的版本默认使用此服务,配置类似windows火墙,功能模块度高,使用简单

iptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的管理工具,即只是一种服务,而真正使用规则干活的是内核的netfilter
netfilter的5类hook函数
hook函数也叫规则链

电脑是客户端
input链:位于流量经过路由之后,并且目的ip是本机ipoutput链:由本机发出的流量,并且在路由之前forward链:位于在流量路由之后,目的ip不是本机ipprerouting链:位于路由之前,流量一致性检查之后postrouting链:所有即将离开本机的流量



防火墙规则
通(放行)堵(阻止,拒绝)拒绝:返回信息后拒绝阻止:直接丢包
策略匹配原则
防火墙会从上至下的顺序来读取配置的策略- 在
找到匹配项后就立即结束配置工作并去执行匹配项中定义的行为(即放行或阻止) - 如果在
读取完所有的策略后没有匹配项,就去执行默认的策略
iptables
iptables会从上至下的顺序来读取配置的策略- 在
找到匹配项后就立即结束配置工作并去执行匹配项中定义的行为(即放行或阻止) - 如果在
读取完所有的策略后没有匹配项,就去执行默认的策略 iptables的规则默认保存在内存中,如果需要永久保存需要把策略保存到/etc/sysconfig/iptables中
#永久保存
[root@server1 ~]# service iptables save
iptables流量处理动作
当规则链匹配后应采用以下几种动作来处理匹配的流量
accept:允许流量通过reject:拒绝流量通过,拒绝后回复拒绝信息log:记录日志信息drop:拒绝流量通过,流量丢弃不回复
iptables表
表中可以有多种hook函数,每个规则链中里可以有多个策略
5种规则表
raw表:第一优先级的表,不会对数据包进行跟踪和nat转换,使用output,prerouting,对应的动作为notrackmangle表:第二优先级的表,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)值以及为数据包设置Mark标记,以实现Qos以及策略路由等- 由于需要
相应的路由设备支持,因此应用并不广泛,包含全部5个规则链
- 由于需要
nat表:第三优先级的表,网络地址转换表,用于修改源和目的地址,分snat(源地址转换)和dnat(目的地址转换)。包含三个规则链:output,prerouting,postrouting(和内核无关的数据包,主要做地址转换)filter表:第四优先级的表,用于对数据包过滤(外网进入内网时),根据具体的规则决定是否放行该数据包(如drop,accept,reject),包含三个规则链:input,forward,forward(经过内核处理过的所有网络包:input,output,forward)- 所谓的
防火墙其实基本上是指这张表上的过滤规则,常用
- 所谓的
security表:最不常用的表- 通常我们说的
iptables只有4张表,security表是新加入的特性,用于在数据包上应用selinux
- 通常我们说的
安装iptables
RHEL9,Centos7中默认使用的是firewalld,且与iptables之间有冲突,如果需要使用iptables需要先停止firewalld再进行安装
[root@server1 ~]# systemctl stop firewalld[root@server1 ~]# systemctl disable firewalld#锁服务,解锁服务使用unmask
[root@server1 ~]# systemctl mask firewalld.service
[root@server1 ~]# yum install iptables-services -y
[root@server1 ~]# systemctl enable --now iptables[root@server1 ~]# systemctl is-active iptables
active
iptables策略文件
规则链存储文件在/etc/sysconfig/iptables
前三行为注释- 显示的是
filter表的规则链
[root@server1 ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
iptables命令的语法格式以及常用参数
永久保存策略
[root@server1 ~]# service iptables save #保存设置的规则
# 注意:保存设置的规则,否则重启后会恢复默认设置
格式
[root@server1 ~]# iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 控制动作#-A添加策略
#-I在指定位置添加策略
#-D删除策略
#-R修改策略
#-j控制动作
参数
| 参数 | 作用 |
|---|---|
-t | 对指定的表进行操作,表必须是raw,nat,filter,mangle,security中的一个,默认是filter |
-p | 指定要匹配的数据包协议类型 |
-s | 匹配源地址ip/mask,当后面没有mask,源ip是一个地址(比如192.168.1.1);当有mask时,表示一个网段(比如192.168.1.0/24) |
-d | 匹配目的地址ip/mask |
-i 网卡名 | 匹配从这块网卡流入的数据,只对input,forward,prerouting链起作用。如果没有指定此选项,则表示可以流入任何一个网卡 |
-o 网卡名 | 匹配从这块网卡流出的数据,只对nat表中的链起作用。如果没有指定此选项,则表示可以从任何一个网卡流出 |
-L | 列出规则链(chain)上的所有规则,如果没有指定链,列出表上所有链的所有规则 |
-A | 在指定规则链的末尾加入新策略 |
-I num | 在指定规则链的指定位置插入策略,如果num为1,表示在头部插入,num为2,表示在第二条策略位置处插入 |
-D num | 删除指定位置的策略 |
-R num | 替换/修改第几条策略 |
-P | 设置指定链的默认策略,只有内置的链才可以设置,用户自定义的链不允许设置 |
-F | 清空所有策略 |
-N | 创建新链 |
-X | 删除指定的链,这个链必须没有被其它任何策略引用,而且这条链上必须没有任何策略。如果没有指定链名,则会删除该表中所有非内置的链 |
-E | 修改链名 |
-Z | 把指定链,或者表中的所有链上的所有计数器清零 |
-j | 满足某条件时该执行什么样的动作 |
-h | 显示帮助信息 |
示例
查看策略iptables -nL --line
[root@server1 ~]# iptables -t filter -nL --line# -n:显示源# -L:写在最后,列出所有规则# --line:增加行号

[root@server ~]# iptables -nvxL --line
# 参数释义# -n:显示源# -v:详细信息# -x:单位自动转换为KB\MB# -L:写在最后,列出所有规则# --line:增加行号
[root@server ~]# iptables -nvxL --line
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source
destination
1 159 24271 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT 1 -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 19 1843 REJECT 0 -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source
destination
1 0 0 REJECT 0 -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT 143 packets, 12422 bytes)
num pkts bytes target prot opt in out source
destination# 显示释义# num:规则的行号# pkts:数据包数量# bytes:数据包字节数# target:动作(放行、拒绝)# port:端口# in:入站网卡# out:出站网卡
清空规则
# 清空内存中的规则(清空所有表的所有链)
[root@server ~]# iptables -F
修改策略
-R修改策略
[root@server1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- !172.25.254.100 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
[root@server1 ~]# iptables -R INPUT 1 -p tcp -s 172.25.254.100 --dport 80 -j REJECT[root@server1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 172.25.254.100 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
修改默认策略
-P修改默认策略
[root@server1 ~]# iptables -nL

[root@server1 ~]# iptables -P FORWARD DROP[root@server1 ~]# iptables -nL

添加链
-N添加链
[root@server1 ~]# iptables -N huazi[root@server1 ~]# iptables -nL

修改链名
-E修改链名
[root@server1 ~]# iptables -E huazi HUAZI[root@server1 ~]# iptables -nL

删除链
-X删除链
[root@server1 ~]# iptables -X HUAZI[root@server1 ~]# iptables -nL

部署nginx,拒绝访问80端口
[root@server1 ~]# yum install nginx -y#先清空策略
[root@server1 ~]# iptables -F#添加策略
[root@server1 ~]# iptables -A INPUT -p tcp --dport 80 -j REJECT[root@server1 ~]# iptables -nL

[root@server1 ~]# echo hello world > /usr/share/nginx/html/index.html[root@server1 ~]# systemctl enable --now nginx
[root@server1 ~]# curl 172.25.254.100
curl: (7) Failed to connect to 172.25.254.100 port 80: 拒绝连接
#删除策略后
[root@server1 ~]# iptables -D INPUT 1[root@server1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destinationChain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@server1 ~]# curl 172.25.254.100
hello world
拒绝来源为172.25.254.100访问80端口
#先清空
[root@server1 ~]# iptables -F[root@server1 ~]# iptables -A INPUT -p tcp -s 172.25.254.100 --dport 80 -j REJECT[root@server1 ~]# iptables -nL

[root@server1 ~]# curl 172.25.254.100
curl: (7) Failed to connect to 172.25.254.100 port 80: 拒绝连接

#删除策略
[root@server1 ~]# iptables -D INPUT 1
[root@server1 ~]# curl 172.25.254.100
hello world
只能让来源为172.25.254.100访问80端口
!取反
[root@server1 ~]# iptables -F[root@server1 ~]# iptables -A INPUT -p tcp ! -s 172.25.254.100 --dport 80 -j REJECT[root@server1 ~]# iptables -nL

[root@server1 ~]# curl 172.25.254.100
hello world

#删除
[root@server1 ~]# iptables -D INPUT 1
[root@server1 ~]# curl 172.25.254.100
hello world

iptables的状态跟踪(只能访问22和80端口)
- 在
没有状态跟踪之前
[root@server1 ~]# iptables -F
[root@server1 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@server1 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@server1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@server1 ~]# iptables -A INPUT -j REJECT
[root@server1 ~]# iptables -F

- 但是
这样写会消耗大量的cpu等资源,我们应该对流量进行状态跟踪,只对第一次访问的流量做检测
[root@server1 ~]# iptables -F
[root@server1 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@server1 ~]# iptables -A INPUT -m state --state NEW -i lo -j ACCEPT
[root@server1 ~]# iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
[root@server1 ~]# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
[root@server1 ~]# iptables -A INPUT -j REJECT
[root@server1 ~]# iptables -nL

利用iptables搭建Linux路由器
准备2台主机
- 一台
server1,一个nat网卡,一个仅主机网卡 - 一台
server2,一个仅主机网卡
server1充当server2的路由器
server1ip配置

[root@server1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0[ethernet][ipv4]
address=172.25.254.100/24,172.25.254.2
dns=114.114.114.114;
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy][root@server1 ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1[ethernet][ipv4]
address=192.168.0.100/24
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]
[root@server1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.254.2 0.0.0.0 UG 100 0 0 eth0
172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
server2ip配置
[root@server2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0[ethernet][ipv4]
address=192.168.0.200/24,192.168.0.100
dns=114.114.114.114;
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]

[root@server2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
server1开启内核路由功能
#临时开启
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
内网访问外网
[root@server1 ~]# iptables -F
[root@server1 ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
[root@server1 ~]# iptables -t nat -nL

#这时server2就可以上网了
[root@server2 ~]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.4) 56(84) 比特的数据。
64 比特,来自 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=127 时间=106 毫秒
64 比特,来自 110.242.68.4 (110.242.68.4): icmp_seq=2 ttl=127 时间=35.3 毫秒
64 比特,来自 110.242.68.4 (110.242.68.4): icmp_seq=3 ttl=127 时间=70.6 毫秒
外网访问内网
[root@server1 ~]# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-dest 192.168.0.200
[root@server1 ~]# iptables -t nat -nL


