文章目录
iptables
防火墙概念
-
逻辑上
- 主机防火墙
个人防火墙 针对单个主机进行防护
- 网络防火墙
集体防火墙 针对于网络入口进行防护,服务于防火墙背后的本地局域网
-
物理上
- 硬件防火墙
在硬件级别实现防火墙功能,另一部分功能基于软件实现,性能高,成本高
- 软件防火墙
应用软件上用逻辑规则在逻辑上实现一个防火墙 ,性能低,成本低
iptables和netfilter
iptables概念
单单Linux的iptables还算不上防火墙,iptables本质上是一个命令行工具(位于用户空间),使用iptables能够操作netfilter(位于Linux内核的安全框架)
netfilter和iptables组成了Linux的包过滤防火墙,能够完成封包过滤,封包重定向和网络地址转换(NAT)等功能。
netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
- 网络地址转换
- 数据包内容修改
- 数据包过滤
netfilter组件实现Linux包过滤防火墙的功能 iptables命令行工具实现操作netfilter来具体实现防火墙功能
tip: iptables只是一个命令行工具 所以就不存在systemctl start iptables.service这种命令了 调用iptables命令即可
iptables规则概念
iptables在netfilter中添加、修改和删除规则(rules),这就是iptables配置防火墙的实质了
相同功能的规则存储在内核空间的信息包过滤表中(四个表中分别是 filter、nat、mangle、raw表)
规则可以指定源地址、目的地址、传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP和SMTP)等
当数据包里面的种种信息(上面提到的)被规则匹配到时 iptables设定的处理办法就会执行 如放行(accept)、拒绝(reject)、丢弃(drop)等
匹配过程是顺序匹配,匹配即停止。
表的概念
我们通过iptables自定义的规则,都存在四个表中
- 表功能
-
filter表
负责过滤功能,防火墙; 内核模块:iptables_filter
-
nat表
网络地址转换功能;内核模块:iptable_nat
-
mangle表
拆解报文,做出修改,并重新封装的功能;内核模块:iptable_mangle
-
raw表
关闭nat表上启用的连接追踪机制; 内核模块:iptable_raw
-
链的概念
规则根据不同的作用被保存在不同的表中。组合不同表中的规则,组成一个Linux内部的关卡
链的概念就有了
五条链
- input 发往用户空间
- output 发往内核空间
- prerouting 路由前
- forward 转发
- postrouting 路由后
iptables流程
图中一个数据报文从客户端出发,经过网卡进入Linux内核空间中的prerouting链(关卡),匹配该关卡的所有规则,根据匹配规则决定报文能不能通过(丢弃?放行?修改数据包信息?)方向由报文目的地决定
报文流向:
到本机某进程的报文:PREROUTING链 ------> INPUT链
由本机转发的报文:PREROUTING -----> FORWARD -----> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT -------> POSTROUTING
链表关系
每个链能够使用的表规则
raw表 | mangle表 | nat表 | filter表 | |
---|---|---|---|---|
PREROUTING链 | √ | √ | √ | |
INPUT链 | √ | √(centos7有) | √ | |
OUTPUT链 | √ | √ | √ | √ |
FORWARD链 | √ | √ | ||
POSTROUTING链 | √ | √ |
在同一个链中 表规则的优先级顺序为 raw---->mangle----->nat----->filter
我们可以在某个表中创建自定义链,但是不能直接应用,只能由五条默认的链通过动作来调用
数据经过防火墙的流程图
匹配条件
-
基本匹配条件
源地址,目标地址
-
扩展匹配条件
源端口,目标端口等 由扩展模块提供功能
处理动作
当规则被匹配之后 就会执行触发预先设定的动作,可以是基本动作和扩展动作
常用动作:
- ACCEPT:运行数据包通过
- DROP:直接丢弃数据包,不给任何回应信息,直到本地超时
- REJECT:拒绝数据包通过,会给一个拒绝的响应信息
- SNAT:源地址转换,内网用户共用一个公网IP
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
- DNAT:目标地址转换 转发
- REDIRECT: 在本机做端口映射
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
以上概念参考自http://www.zsythink.net/archives/1199 https://www.cnblogs.com/liang2580/articles/8400140.html
案例测试
理清了粗略的过程 就可以操作一波了 四表五链
iptables命令
-
iptables [-t 表名] 选项 [-I 链名] [-p 条件] [-j 目标操作]
iptables -t filter -I INPUT -p icmp -j REJECT #拒绝icmp协议 iptables -t filter -I INPUT -p icmp -j ACCEPT #允许icmp协议 iptables -I INPUT -p icmp -j REJECT #默认是filter表 可以缺省 #不指定表 默认为filter表 #不指定链 默认为该表的所有链 #按顺序匹配,匹配即停止(有例外执行LOG动作可以继续匹配),如果没有匹配条件,就执行防火墙默认规则 #选项/链名/目标操作都用大写
-
-F 清空所有规则
-
-A 追加一条防火墙规则至链的末尾位置
-
-I 插入一条防火墙规则至链的开头
-
-nL 查看iptables所有规则 以数字形式显示地址、端口等信息 n必须在前面
-
–line-numbers 查看规则时,显示规则的行号
-
-D 删除链内指定序号(或内容)的一条规则
-
-P 为指定的链设置默认规则
iptables过滤条件
类别 | 选项 | 用法 |
---|---|---|
通用匹配 | 协议匹配 | -p 协议名称 |
通用匹配 | 地址匹配 | -s 源地址、-d 目标地址 |
通用匹配 | 接口匹配 | -i 接受数据的网卡、-o 发送数据的网卡 |
隐含匹配 | 端口匹配 | –sport 源端口号、–dport 目标端口号 |
隐含匹配 | ICMP类型匹配 | –icmp-type ICMP类型 |
命令使用
iptables -F #清空所有规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
#追加规则至filter表中的INPUT链的末尾,允许任何人使用TCP协议访问本机
iptables -I INPUT -p udp -j ACCEPT
#插入规则至filter表中的INPUT链的开头,允许任何人使用UDP协议访问本机
iptables -I INPUT 2 -p icmp -j ACCEPT
#插入规则至filter表中的INPUT链的第2行,允许任何人使用ICMP协议访问本机
iptables -nL INPUT #查看INPUT链的规则
Chain INPUT (policy ACCEPT) #默认规则动作是ACCEPT
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
iptables -L INPUT --line-numbers #查看INPUT链规则 显示行号
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere #没加n选项所以不是数字显示IP
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT tcp -- anywhere anywhere
#删除操作
iptables -D INPUT 3 #删除filter表中INPUT链的第三条规则
iptables -nL INPUT #查看以西 确认第三条被删除了
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
#清空四个表中的所有规则
iptables -F #默认是filter表
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
#修改默认规则动作
iptables -t filter -P INPUT DROP #设置INPUT链默认规则为DROP 用ssh控制 敲完就断了。。。
iptables -nL INPUT #查看下
Chain INPUT (policy DROP)
target prot opt source destination
#记得改回ACCEPT
filter过滤和转发测试案例
条件命令
iptables过滤条件
类别 | 选项 | 用法 |
---|---|---|
通用匹配 | 协议匹配 | -p 协议名称 |
通用匹配 | 地址匹配 | -s 源地址、-d 目标地址 |
通用匹配 | 接口匹配 | -i 接受数据的网卡、-o 发送数据的网卡 |
隐含匹配 | 端口匹配 | –sport 源端口号、–dport 目标端口号 |
隐含匹配 | ICMP类型匹配 | –icmp-type ICMP类型 |
前置准备
主机名 | 配置 |
---|---|
client | ens33:192.168.4.10 网关:192.168.4.5 |
proxy | ens33:192.168.2.5 ens37:192.168.4.5 |
web1 | ens33:192.168.2.100 网关:192.168.2.5 |
主机型防火墙测试
#proxy主机型防火墙测试 守护的是自己这台机子
iptables -I INPUT -p tcp --dport 80 -j REJECT
iptables -I INPUT -s 192.168.2.100 -j REJECT
iptables -I INPUT -d 192.168.2.5 -p tcp --dport 80 -j REJECT
iptables -I INPUT -i ens33 -p tcp --dport 80 -j REJECT
iptables -A INPUT -s 192.168.2.0/24 -j DROP #丢弃所有2.0网段的主机数据包
iptables -A INPUT -s 114.212.33.12 -p tcp --dport 22 -j REJECT #拒绝114.212.33.12使用tcp协议远程ssh目标22端口(本机)
网络型防火墙测试
#完成前置准备
echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发 临时的 实现软路由功能
#or
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf #实现永久有效规则
#web1
yum -y install httpd
echo "test page" > /var/www/html/index.html
systemctl restart httpd
#client
curl http://192.168.2.100 #4.10访问2.100的http服务
test page #成功访问到了
#proxy 禁止访问
iptables -I FORWARD -s 192.168.4.10 -p tcp --dport 80 -j DROP
#在FORWARD链中添加规则 丢弃来自4.10的tcp协议访问目标机子80端口的数据包
#client
curl http://192.168.2.100 #再次访问
#漫长的等待 没有回应 数据包被DROP丢弃了 响应消息都不给~ 如果是REJECT就会有回应
禁ping的策略
iptables -I INPUT -p icmp -j DROP #禁止ping 别人的ping丢弃 自己ping别人把回应的也丢弃了
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP #禁止入站的Ping请求 不拒绝入站的ping回应包 就能够组织别人ping自己 自己可以ping别人了
iptables -p icmp --help #查看更多操作
防火墙扩展规则
-m指定扩展模块 --具体扩展条件 -j 动作
根据MAC地址过滤测试
#client
ip link show ens33 #查看client的MAC地址
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:e9:31:9b brd ff:ff:ff:ff:ff:ff
#proxy
iptables -F
iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 00:0c:29:e9:31:9b -j DROP
# mac模块 参数指定MAC地址
#针对client的MAC地址丢弃数据包 client改IP都没有用
基于多端口设置过滤规则
iptables -A INPUT -p tcp -m multiport --dports 20,25,80,110,143,16501:16800 -j ACCEPT
#允许20,25,80,110,143,16501~16800所有端口tcp协议访问 一般多端口模块只用来作用目标端口,不用来作用源端口(--sports),因为源端口不固定 没有限制的意义
根据IP地址范围设置规则
iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEPT
#本命令允许源地址IP为4.10~20的通过 目标地址ip参数(--dst-range)
iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
#禁止4.0网段ssh登录本机 不需要扩展模块
SNAT实现共享上网
沿用filter过滤和转发测试案例
设定2.0网段是外部网络 4.0网段是内部网络
实现client(4.10)访问web1(2.100),查看web1日志是2.5访问的web1,达到伪装的效果
#proxy
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.2.5
#规则是在proxy的POSTROUTING链上,源地址是4.0网段的 访问目标80端口 触发SNAT动作 修改数据包的源地址为192.168.2.5
#client
curl http://192.168.2.100 #访问
test page #成功通过proxy访问到
#web1
tail -n 1 /var/log/httpd/access_log #查看httpd日志最后一行 看看是谁访问了网页
192.168.2.5 - - [13/Jan/2021:12:47:25 -0500] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
#可以发现是2.5访问的 说明伪装成功了
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j MASQUERADE
#对于外网IP不固定的情况,可以执行MASQUERADE动作 达到动态伪装IP的效果
#要问为什么 因为租一个固定公网IP太贵了 T.T
永久设置iptables
#通过iptables命令设置的规则都是临时的 永久的需要使用iptables-services工具并开机自动启动服务
yum -y install iptables-services
systemctl enable --now iptables.service #开机自启服务 将保存的规则执行
service iptables save #保存当前临时配置的iptables规则