网站加关键词病毒式营销的案例
华子目录
- 什么是`防火墙`
- 分类
- `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
是本机ip
output链
:由本机
发出的流量
,并且在路由之前
forward链
:位于在流量路由之后
,目的ip
不是本机ip
prerouting链
:位于路由之前
,流量
一致性检查之后
postrouting链
:所有
即将离开本机
的流量
防火墙规则
通
(放行
)堵
(阻止,拒绝
)拒绝
:返回信息
后拒绝
阻止
:直接丢包
策略匹配原则
防火墙
会从上至下
的顺序
来读取配置
的策略
- 在
找到匹配项
后就立即结束配置工作
并去执行匹配项
中定义的行为
(即放行或阻止
) - 如果在
读取完
所有的策略
后没有匹配项
,就去执行默认的策略
iptables
iptables
会从上至下
的顺序
来读取配置
的策略
- 在
找到匹配项
后就立即结束配置工作
并去执行匹配项
中定义的行为
(即放行或阻止
) - 如果在
读取完
所有的策略
后没有匹配项
,就去执行默认的策略
iptables
的规则
默认保存在内存
中,如果需要永久保存
需要把策略
保存到/etc/sysconfig/iptables
中
#永久保存
[root@server1 ~]# service iptables save
iptables
流量处理动作
当规则链
匹配后应采用以下几种动作
来处理匹配
的流量
accept
:允许流量通过
reject
:拒绝流量通过
,拒绝后
回复拒绝信息
log
:记录日志信息
drop
:拒绝流量通过
,流量丢弃不回复
iptables表
表中
可以有多种hook函数
,每个规则链
中里可以有多个策略
5种规则表
raw表
:第一优先级
的表
,不会
对数据包
进行跟踪和nat转换
,使用output,prerouting
,对应的动作
为notrack
mangle表
:第二优先级
的表
,主要用于修改数据包
的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
的路由器
server1
ip配置
[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
server2
ip配置
[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