企业选型建议:
中小企业: 使用公有云,安全组,waf防火墙,态势感知.
访问量巨大: 使用硬件防火墙,waf防火墙,硬件服务器+云服务器
掌握表和链之间联系即可。
Netfilter | 表(tables) | 链(chains) | 规则(Policy) |
---|---|---|---|
一栋楼 | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 |
工作流程小结:※※※※※
- 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
- 如果**匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT)**,数据包就不再向下匹配新的规则。
- 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到**匹配默认规则**得到明确的阻止还是通过。
- 防火墙的**默认规则是所有规则都匹配完才会匹配的**。
表(table)是对功能的分类,防火墙功能(filter表),共享上网,端口转发(nat表)
链对数据流进行处理,需要使用不同的链(数据流入(INPUT),数据流出(OUTPUT))
iptables 是4表5链
4表: filter 表 nat表 raw表 mangle表
伍链: INPUT OUTPUT FORWARD PREROUTING POSTROUTING
filter 表 | 强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) filter表示iptables默认使用的表,这个表定义了三个链(chains) 企业工作场景:主机防火墙 |
---|---|
INPUT ⭐️⭐️⭐️⭐️⭐️ | 负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤进入主机的数据包 (能否让数据包进入服务器) |
FORWARD | 路过: 负责转发流经主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍 LVS NAT模式,net.ipv4.ip_forward=0 |
OUTPUT | 处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包 |
nat | 负责网络地址转换的,即来源与目的IP地址和port的转换。 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。 工作场景: 1. 用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING) 2. 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING) 3. WEB,单个端口的映射,直接映射80端口(PREROUTING) 这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。 |
---|---|
OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址。 |
PREROUTING | 在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等 就是收信时,根据规则重写收件人的地址。 例如:把公网IP:xxx.xxx.xxx.xxx映射到局域网的xx.xx.xx.xx服务器上。 如果是web服务,可以报80转换为局域网的服务器9000端口上 10.0.0.61 8080(目标端口) ----nat—à 10.0.0.7 22 |
POSTROUTING | 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。 写好发件人的地址,要让家人回信时能够有地址可回。 例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址。 生产应用:局域网共享上网。 |
课外了解: 官方最全超级详解传送门
iptables iptables启动或关闭的命令
oldboy-bao 10.0.0.61 172.16.1.61
为了使用systemctl管理安装的软件:yum install -y iptables-services
检查结果
[root@oldboy-bao ~] rpm -qa |grep iptables
iptables-services-1.4.21-35.el7.x86_64 #我们安装的。
iptables-1.4.21-35.el7.x86_64 #系统自带
启动iptables 内核模块
手动加载iptables内核模块(直接复制到虚拟机上就好了)
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
让配置永久生效
chmod +x /etc/rc.d/rc.local
cat >>/etc/rc.local<
检查是否加载防火墙iptables 模块
[root@oldboy-bao ~] lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp 12809 0
nf_conntrack_ftp 18478 1 nf_nat_ftp
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26583 2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack 139264 6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter 12810 0
ip_tables 27126 2 iptable_filter,iptable_nat
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
[root@oldboy-bao ~] lsmod |egrep 'filter|nat|ipt' |wc -l
9
关闭已有的firewalld防火墙:systemctl stop firewalld
+systemctl disable firewalld
清空iptables自带规则
iptables -t filter -nL
iptables -t filter -F #flush清空规则
iptables -X #删除定义的链。
iptables -Z #清空计数器。
在filter表的INPUT连上新加1条拒绝规则,拒绝所有目标端口是22的请求。
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
iptables -t filter -nL --line-number #显示规则并添加序号
iptables -t filter -D INPUT 1 #删除filter表INPUT链的第1个规则
屏蔽来自于10.0.0.1的访问
iptables -I INPUT -s 10.0.0.1 -j DROP
iptables -t filter -nL --line-number #显示规则并添加序号
iptables -t filter -D INPUT 1 #删除filter表INPUT链的第1个规则
️ ✅ 通过Iptables实现。
️通过Linux内核参数实现。
iptables -I INPUT -p icmp -j DROP
开启另一个机器ping。
环境准备 | 需求 | 细节 |
---|---|---|
oldboy-bao | 双网卡 | eth0 10(外网) eth1 172(内网) |
oldboy-docker | 双网卡 | eth0 10(外网) eth1 172(内网) |
添加网卡设置lan区段:添加到和堡垒机相同的区段
书写网卡配置文件
oldboy-docker
[root@oldboy-docker ~] cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=none
ONBOOT=yes
IPADDR=172.16.1.62
PREFIX=24
[root@oldboy-docker ~] systemctl restart network
配置规则之前测试
ssh -p22 10.0.0.61 #ctrl + d 退出
ssh -p22 172.16.1.61
都可以链接与访问。
进行配置
翻译:添加filter表INPUT链接拒绝规则,禁止源ip是10.0.0.0/24网段访问目标端口是22,协议tcp.
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
配置规则之后测试
ssh -p22 10.0.0.61 访问失败
ssh -p22 172.16.1.61 访问成功
都可以链接与访问。
经过漫长等待,10网段访问失败。
--dport默认只能指定1个端口或指定端口范文 通过:(冒号)实现。
iptables -I INPUT -p tcp --dport 1:1024 -j DROP
使用multiport模块,就可以指定多个端口
iptables -I INPUT -p tcp -m multiport --dport 80,443 -j DROP
iptables -I INPUT -s 10.0.0.1 -j ACCEPT
iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
备份原有的
cp /etc/sysconfig/iptables{,.bak}
iptables-save >/etc/sysconfig/iptables
systemctl restart iptables
⭐️⚠️ 修改默认规则之前,要测试之前的准许的规则。
iptables -t filter -P INPUT DROP
修改之后一点点添加放行规则
iptables -I INPUT -s 10.0.0.1 -j ACCEPT
iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
# -i 数据进入的时候
iptables -A INPUT -i lo -j ACCEPT
# -o 数据流出的时候
iptables -A OUTPUT -o lo -j ACCEPT
#匹配连接状态
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #放行tcp连接状态
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@oldboy-bao ~] iptables-save
# Generated by iptables-save v1.4.21 on Thu Aug 10 12:00:05 2023
*nat
:PREROUTING ACCEPT [2:458]
:INPUT ACCEPT [2:458]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Thu Aug 10 12:00:05 2023
# Generated by iptables-save v1.4.21 on Thu Aug 10 12:00:05 2023
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -j DROP
-A INPUT -s 10.0.0.1/32 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Aug 10 12:00:05 2023