iptables防火墙概述
1. 防火墙概述应用
封端口,封ip √实现NAT 功能;共享上网;端口映射(端口转发),ip映射
2.防火墙种类及使用说明
防火墙官网https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
硬件: 整个企业入口
三层路由: H3C 华为 Cisco(思科)
防火墙: 深信服
Juniper
软件: 开源软件 网站内部 封ip 封ip
iptables 写入到Linux内核中(还有lvs) 以后服务docker 工作在 4层(大部分李)
firewalld C7
nftalbes C8
ufw (ubuntu fire wall) Ubuntu
云防火墙(公有云)
阿里云:
安全组 (封ip,封端口)
NAT 网关(共享上网,端口映射....)
waf 应用防火墙
waf 防火墙(应用防火墙,处理7层的攻击) SQL注入
3.必须熟悉的名词
容器: 瓶子 罐子 存放东西
表(table): 存放链的容器,防火墙最大概念
链(chain): 存放规则的容器
规则(policy): 准许或拒绝规则 ,未来书写的防火墙条件就是各种防火墙规则
(容器--table表--chains链--policy规则;楼--房子--衣柜--衣服)
规则--匹配成功:DROP拒接服务,Accept接受请求,默认规则(最后匹配)
自上而下,一旦匹配成功,直接通过,不会再往下匹配了;
4.iptables 执行过程
01.防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
02.如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配新的规则。
03.如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
04.防火墙的默认规则是所有规则都匹配完才会匹配的
5.表与链※※※※※iptables 是4表伍链
4表: 过滤器filter表;共享上网nat;raw表;mangle表
伍链(大写字母): INPUT数据进来 OUTPUT出去 FORWARD路过 PREROUTING POSTROUTING
pre.... 之前 post .....之后
1) filter表----实现防火墙功能(屏蔽或准许 端口 ip)
2) nat表
实操:环境准备及命令
iptables启动或关闭的命令
(m01 10.0.0.61 172.16.1.61;web01 10.0.0.7 172.16.1.7;web02 10.0.0.8 172.16.1.8)
[root@m01 ~]# yum install -y iptables-services
[root@m01 ~]# rpm -ql iptables-services
/etc/sysconfig/iptables #防火墙的配置文件
/usr/lib/systemd/system/iptables.service #防火墙服务配置文件(命令)
[root@m01 ~]# rpm -ql iptables
/usr/sbin/iptables #iptables 命令 添加/删除/查看 规则(4表伍链)
/usr/sbin/iptables-save #iptables规则 输出(保存)
/usr/sbin/iptables-restore #恢复
#防火墙相关模块 加载到内核中
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
#永久,写入到开机自启动
cat >>/etc/rc.local<
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
[root@m01 ~]# lsmod |egrep 'filter|nat|ipt'
[root@m01 ~]# systemctl stop firewalld
[root@m01 ~]# systemctl disable firewalld
[root@m01 ~]# systemctl start iptables.service
[root@m01 ~]# systemctl enable iptables.service
[root@m01 ~]# systemctl status iptables.service
#查看filter表中的规则(默认filter表)[root@m01 ~]# iptables -nL
#查看指定表中的规则 [root@m01 ~]# iptables -t nat -nL
iptables常用选项介绍
参数 含义
-L 显示表中的所有规则
-n 不要把端口 或ip反向解析为名字
-t 指定表 不指定默认是filter表
指定连接(加入/追加/删除)
-A append 追加 加入准许类规则 使用-A 会把规则写在最后.
-I 置顶--把规则加在链的第1条 拒绝类规则放在所有规则最上面
-D delete 删除 -D INPUT 1
-p 协议(protocal) tcp/udp/icmp/all 指定端口的时候需要指定协议.
--dport 目标端口 dest destination 指定端口 加上协议(-p tcp)
--sport 源端口 source 源
-s --source 源ip
-d --destination 目标ip
-m 指定模块 multiport,limit,state
-i input 输入的时候 从哪个网卡进来
-o ouput 输出的时候 从哪个网卡出去
-j 满足条件后的动作 : DROP/ACCEPT/REJECT
DROP REJECT 都是拒绝
DROP 把数据丢掉 不会返回信息给用户
REJECT 拒绝 返回拒绝信息
-F flush 清除所有规则,不会处理默认的规则
-X 删除用户自定义的链
-Z zero 链的计数器清零(数据包计数器与数据包字节计数器)
配置filter表规,正式配置之前 先备份, 清空规则
[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -X
[root@m01 ~]# iptables -Z
[root@m01 ~]# iptables -nL
#拒绝用户访问22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
#查看规则并加上序号
iptables -t filter -nL --line-number
#删除规则
iptables -t filter -D INPUT 1 #根据序号删除
案例01: 封ip 屏蔽某个ip和网段
屏蔽 ip
# iptables -I INPUT -s 10.0.0.7 -j DROP
# iptables -I INPUT -s 172.16.1.7 -j DROP
# iptables -nL
屏蔽网段
[root@m01 ~]# iptables -I INPUT -s 172.16.1.0/24 -j DROP
案例02: 禁止网段连入(禁止10.0.0.0/24网段访问 8888 端口)
nc ncat netcat nc –lk telnet
# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j DROP
[root@web01 ~]# ssh 172.16.1.61 hostname
方案03: 只允许指定网段连入(允许172.16.1.0网段)
实现阿里云白名单功能 :默认是拒绝 开放端口 网段
allow 10.0.0.0/24;
deny all;
方法1: 利用 ! 进行排除
iptables -I INPUT ! -s 172.16.1.0/24 -j DROP
#只准许 10.0.0.0/24 访问 言外之意 除了 10.0.0.0/24 都拒绝
iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
方法2: 修改链默认规则 修改为拒绝 添加准许
先配置好规则 准许规则 修改默认规则
[root@oldboy-m01 ~]# iptables -nL
[root@oldboy-m01 ~]# iptables -A INPUT -s 10.0.0.0/24
[root@oldboy-m01 ~]# iptables -P INPUT DROP #修改默认规则
[root@oldboy-m01 ~]# iptables -nL
#测试完成后 修改回去 (用ping来验证)
iptables -P INPUT ACCEPT
案例04 指定多个端口
# iptables -I INPUT -p tcp --dport 8888 -j DROP
# iptables -I INPUT -p tcp --dport 9999 -j DROP
[root@oldboy-m01 ~]# iptables -nL
#指定多个端口
-m multiport -p tcp --dport 80,443
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
iptables -nL
iptables -A INPUT -p tcp --dport 1:1024 -j ACCEPT 21
#补充:
[root@m01 ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP
#如果是连续的端口 可以不加上-m multiport 1:1024
[root@m01 ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
案例05: 匹配ICMP类型,禁止ping
ICMP(Internet Control Message Protocol)Internet控制报文协议 ping
整个网站核心
通过防火墙规则 控制是否可以ping
iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
# iptables -I INPUT -p icmp --icmp-type 255 -j DROP
通过内核参数 控制 禁止被ping
[root@m01 ~]# cat /etc/sysctl.conf
#/proc/sys/net/ipv4/icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_all = 1
[root@m01 ~]# sysctl -p #生效
[root@oldboy-m01~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
测试结束,修改回来
[root@oldboy-m01~]# echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
案例06: 匹配网络状态(TCP/IP连接状态)
通过防火墙控制连接状态
-m state --state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
案例07: 限制并发及速率
-m limit --limit n/{se cond/minute/hour}: #限制模块
解释:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时
-m limit --limit 10/minute --limit-burst 5 每6秒释放工牌 给别人使用
#10个数据包 ,每6秒生成,前5个 1人1个工牌 从第6个开始 每6秒 才能释放1个工牌
--limit-burst [n] #在同一时间内允许通过的请求”n”为数字,不指定默认为5
测试 演示#ping icmp 协议 进行测试
iptables -F
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
web01 进行ping测试 验证,前5个一次完成,第七次后面每6秒ping通一次
[root@web01 ~]# ping 10.0.0.61
案例08: 防火墙规则的保存与恢复
iptables-save 默认输出到屏幕
iptables-restore 加上文件
写入到/etc/sysconfig/iptables
# iptables-save >/etc/sysconfig/iptables
# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Wed Feb 12 15:31:43 2020
*filter
:INPUT DROP [92:7008]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [127:14360]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
COMMIT
# Completed on Wed Feb 12 15:31:43 2020
# Generated by iptables-save v1.4.21 on Wed Feb 12 15:31:43 2020
*nat
:PREROUTING ACCEPT [559:51047]
:INPUT ACCEPT [60:6814]
:OUTPUT ACCEPT [6801:408868] :POSTROUTING ACCEPT [6801:408868]
COMMIT
# Completed on Wed Feb 12 15:31:43 2020
[root@oldboy-m01 ~]# iptables -D INPUT 1
[root@oldboy-m01 ~]# iptables-restore [root@oldboy-m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min
burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports
80,443
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#@补充:
systemctl restart iptables #读取 /etc/sysconfig/iptables内容
[root@m01 ~]# iptables-save > /etc/sysconfig/iptables
[root@m01 ~]# iptables-restore [root@m01 ~]# iptables -nL
补充: iptables filter表 功能 可以在 云服务器使用
云服务器应用: 安全组控制端口, iptables控制ip
实际生产用法
iptables配置方式
逛公园模式: 默认规则是 ACCEPT
看电影模式: 默认规则是 DROP 白名单模式
默认是拒绝 去电影院
Ssh 服务 连接状态 数据包进出 转发 修改默认规则拒绝
1. ssh可以连接进来
[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -X
[root@m01 ~]# iptables -Z
[root@m01 ~]# iptables -nL
[root@m01 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT #放行22端口
2.设置允许本机lo**通讯规则**
# 允许本机回环lo接口数据流量流出与流入
iptables -A INPUT -i lo -j ACCEPT #lo网卡放行
iptables -A OUTPUT -o lo -j ACCEPT #lo网卡放行
3.配置默认规则及 放行 80 443端口
[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -P FORWARD DROP
[root@m01 ~]# iptables -P OUTPUT ACCEPT
[root@m01 ~]# iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT #放行80,443端口
[root@m01 ~]# iptables -nL
[root@m01 ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT #放行10.0.0.0/24 和 172.16.1.0/24网段
[root@m01 ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
#此处还可以添加 vpn网段 比如说 10.7.1.0/24
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #放行tcp连接状态
nat共享上网
nat功能在云服务器无法使用替代品叫: NAT 网关
端口转发/端口映射 ip映射
[root@m01 ~]# iptables -P INPUT ACCEPT
[root@m01 ~]# iptables -P FORWARD ACCEPT
实现共享上网(SNAT)操作
共享上网 https://www.processon.com/view/link/5d380f6ce4b0511f1310f722
环境准备
web01 172.16.1.7 (只保留这个网卡), eth0网卡关闭(OnBOOT=no)
m01 配置共享上网的规则
详细流程:
1)防火墙
配置防火墙规则SNAT 规则
开启内核转发功能
# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.6
[root@m01 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@m01 ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.ip_forward = 1
#iptables -t nat -I POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
#实现共享上网的时候
#来自于172.16.1.0/24网段的ip,通过防火墙的nat表的POSTROUTING链
#源ip被修改为 10.0.0.61 通过SNAT方式
注意事项: 公网ip不固定:
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
2)客户端
客户端网关指向防火墙:172.16.1.61 和 配置DNS
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
修改 OnBOOT=no
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
IPADDR=172.16.1.7
PREFIX=24
NAME=eth1
DEVICE=eth1
OnBOOT=yes
GATEWAY=172.16.1.61
DNS1=1.2.4.8
[root@web01 ~]# systemctl restart network
[root@m01 ~]# ssh 172.16.1.7
Last login: Wed Jul 24 23:06:58 2019 from 10.0.0.1
[root@web01 ~]# ip a
[root@web01 ~]# ping baidu.com
3. 完成后 在web01 发出 ip r和ping 外网ip的结果
[root@web01 ~]# ip r
default via 172.16.1.61 dev eth1
169.254.0.0/16 dev eth1 scope link metric 1003
172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.7
[root@web01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.1.61 0.0.0.0 UG 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
[root@web01 ~]# ping baidu.com
共享上网流程:
1. 防火墙添加规则 SNAT\规则 nat表 POSTROUTING
2. 防火墙服务器 开启ip转发功能
3. 后端节点,配置网卡,让网卡网关指向防火墙
实现端口转发(DNAT)
端口映射 https://www.processon.com/view/link/5d381ecfe4b02015bd88fa33
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -
j DNAT --to-destination 172.16.1.7:22
[root@m01 ~]# iptables -nL -t nat
测试与检查 本地she ll中
[d:\~]$ ssh root@10.0.0.61 9000
实现ip映射
ip a add 10.0.0.62/24 dev eth0 label eth0:0
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
[root@m01 ~]# iptables -nL -t nat #还是有的
企业面试题iptalbes https://www.jianshu.com/p/19422676b854
5、请写出查看iptables当前所有规则的命令。
6、禁止来自10.0.0.188 ip地址访问80端口的请求
7、如何使在命令行执行的iptables规则永久生效?
8、实现把访问10.0.0.3:80的请求转到172.16.1.17:80
9、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。
笔试题 www.jianshu.com/p/2180face8381