Iptables防火墙
一、Iptables防火墙概述
0.前言
1、OSI7层模型以及不同层对应哪些协议?
2、TCP/IP三次握手,四次断开的过程,TCP HEADER,状态转换
3、常用的服务端口要非常清楚了解。
4、常用服务协议原理http协议,icmp协议。
企业中安全配置原则:
1、尽可能不给服务器配置外网IP,可以通过代理转发或者通过防火墙映射。
2、并发不是特别大情况有外网IP,可以开启防火墙服务。
3、大并发的情况,不能开iptables,影响性能,利用硬件防火墙提升架构安全。
容器:装东西的器皿,docker容器技术,将镜像装在了一个系统中,这个系统就称为容器
iptables称为一个容器---装着防火墙的表
防火墙的表又是一个容器---装着防火墙的链
防火墙的链也是一个容器---装着防火墙的规则
iptables---表---链---规则
规则:防火墙一条一条安全策略
防火墙匹配规则流程:
1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4. 防火墙的默认规则是所有规则执行完才执行的。
1.应用场景
1.主机安全
2.内部共享上网
3.端口或IP转发
2.iptables注意事项
1.匹配规则是从上往下依次执行的
2.只要匹配到某一条规则,就不会在往下执行
3.如果都没有匹配到规则,就执行默认规则
4.默认规则最后执行,默认允许所有
5.经常使用的规则尽量往前放
二、iptables四表五链
1.四表五链
filter表——过滤数据包
Nat表——用于网络地址转换(IP、端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
Raw表——决定数据包是否被状态跟踪机制处理
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
1、Filter:实现防火墙安全过滤功能
INPUT 对于指定到本地套接字的包,即到达本地防火墙服务器的数据包 外面---->(门)房子iptables
FORWARD 路由穿过的数据包,即经过本地防火墙服务器的数据包 外面-----(前门)房子(后门)---房子
OUTPUT 本地创建的数据包 外面<-----(门)房子iptables
2、NAT:实现将数据包中IP地址或者端口信息,内网到外网进行改写/外网到内网进行改写
PREROUTING 一进来就对数据包进行改变 在路由之前,进行数据包IP地址或端口信息的转换
OUTPUT 本地创建的数据包在路由之前进行改变 本地防火墙要出去的流量进行相应转换(了解)
POSTROUTING 在数据包即将出去时改变数据包信息 在路由之后,进行数据包IP地址或端口信息的转换
SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如上图所示,如果内网主机访问外网而经过路由时,源IP会发生改变,这种变更行为就是SNAT;反之,当外网的数据经过路由发往内网主机时,数据包中的目的IP (路由器上的公网IP) 将修改为内网IP,这种变更行为就是DNAT
注:
在nat server 中,先更改配置文件,/etc/sysctl.conf 中改为
net.ipv4.ip_forward = 1
修改完成后,命令行sysctl -p 让其全部执行生效
3、Managle:对数据进行标记
4、Raw:将数据包一些标记信息进行拆解
2.filter表
1.INPUT链:过滤流入主机的数据包
2.OUTPUT链:过滤流出主机的数据包
3.FORWARD链:负责转发流经主机的数据包
3.Nat表
1.OUTPUT链:过滤流出主机的数据包
2.PREROUTING链:数据包到达防火墙时进行判断,改写数据包的地址或或端口(进)
3.POSTROUTING链:数据包到达防火墙时进行判断,改写数据包的地址或或端口(出)
三、iptables安装
1.安装
[root@lb01 ~]
2.启动
[root@lb01 ~]
[root@lb01 ~]
防护墙实操
3.iptables常用参数
1.链管理:
-N:new, 自定义一条新的规则链;
-X:delete,删除自定义的规则链;
注意:仅能删除 用户自定义的 引用计数为0的 空的 链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
REDIRECT: 重定向重定向
MASQUERADE 地址伪装
SNAT 如果内网主机访问外网而经过路由时,源IP会发生改变,这种变更行为就是SNAT
DNAT 当外网的数据经过路由发往内网主机时,数据包中的目的IP (路由器上的公网IP) 将修改为内网IP,这种变更行为就是DNAT
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
2.规则管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除;
(1) 指明规则序号;
(2) 指明规则本身;
-R:replace,替换指定链上的指定规则;
-R 表示将规则信息进行修改
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和;
3.查看:
-L:list, 列出指定链上的所有规则;
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;
-vv, -vvv
-x:exactly,显示计数器结果的精确值;
--line-numbers:显示规则的序号;
四、iptables常用操作
1.查看防火墙策略(filter)
[root@lb01 ~]
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@lb01 ~]
2.查看指定表
-t 指定表
[root@lb01 ~]
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
3.清空防火墙规则
[root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~]
4.添加防火墙规则
[root@lb01 ~]
iptables
-t
filter
-A
INPUT
-p
tcp
--dport
22
-j
DROP
[root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~]
-I:insert, 向上添加
[root@lb01 ~]
5.删除防火墙规则
[root@lb01 ~]
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:111
[root@lb01 ~]
[root@lb01 ~]
[root@pinglb01 ~]
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:111
五、防火墙配置实例
1.禁止22端口访问
[root@lb01 ~]
2.拒绝IP访问
[root@lb01 ~]
-i 指定网卡
-s 指定源地址IP
[root@lb01 ~]
3.禁止IP网段访问
[root@lb01 ~]
4.只允许某个IP访问
[root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~]
-I 向上添加规则
-A 向下添加规则
5.拒绝端口范围
[root@lb01 ~]
[root@lb01 ~]
六、企业一般配置
1.配置前考虑
1.考虑防火墙开在哪台机器上
2.这台机器部署了哪些服务
nginx
keepalive
sshd
3.服务对应的端口和协议
111
vrrp (112端口)
4.其他端口全部拒绝
4.配置默认拒绝所有
[root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~]
配置好以后,不要清空防火墙规则,小心删除规则,因为我们最后一条配置的是默认拒绝所有,而清空防火墙规则不会更改其状态,还是默认拒绝所有,所以完犊子了
[root@lb01 ~]
2.防火墙规则永久生效
[root@lb01 ~]
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@lb01 ~]
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [1:176]
:POSTROUTING ACCEPT [1:176]
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [40:5168]
-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 -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -s 10.10.0.1/32 -i eth0 -p tcp -j ACCEPT
-A INPUT -s 10.10.0.0/24 -i eth0 -p tcp -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@lb01 ~]
七、iptables 转发
1.端口转发
[root@web01 ~]
[root@lb01 ~]
[root@lb01 ~]
[root@m01 ~]
[root@m01 ~]
-d 指定目的ip
DNAT 目标地址转换
--to-destination 目标地址转换指向
2.Ip转发
iptables -t nat -A PREROUTTNG -d 10.10.0.5 -j DNAT --to-destination 172.16.1.7
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A PREROUTTNG -d 172.16.1.0/24 -j SNAT --to-destination 10.10.0.5
3.内部共享上网
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A PREROUTTNG -s 172.16.1.0/24 -j SNAT --to-destination 10.10.0.5
4、企业面试题
1、详述iptales工作流程以及规则过滤顺序?
2、iptables有几个表以及每个表有几个链?
3、iptables的几个表以及每个表对应链的作用,对应企业应用场景?
4、画图讲解iptables包过滤经过不同表和链简易流程图并阐述。
5、请写出查看iptables当前所有规则的命令。
6、禁止来自10.0.0.188 ip地址访问80端口的请求
7、如何使在命令行执行的iptables规则永久生效?(service iptables save)
8、实现把访问10.0.0.3:80的请求转到172.16.1.17:80(iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8)
9、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。
10、写一个防火墙配置脚本,只允许远程主机访问本机的80端口(奇虎360面试题)
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -j DROP
11、写一个脚本解决DOS攻击生产案例
问题描述
写一个脚本解决DOS攻击生产案例:
==提示:==根据web日志或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,立即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。
防火墙命令为:iptables -I INPUT -s (源ip地址) -j DROP
思路
取到ip和ip访问次数
统计ip访问次数是否大于100次
判断出来后设置防火墙命令,并查看是否执行成功
根据实际情况进行优化
logfile=/usr/local/nginx/logs
last_minutes=1
start_time=`date -d"$last_minutes minutes ago" +"%Y-%m-%d"T"%H:%M:%S"`
echo $start_time
stop_time=`date +"%Y-%m-%d"T"%H:%M:%S"`
echo $stop_time
cur_date="`date +%Y-%m-%d`"
echo $cur_date
tac $logfile/access.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,1);if(t>=st && t<=et){print $1}}' |sort | uniq -c | sort -nr > $logfile/log_ip_top10
ip=`cat $logfile/log_ip_top10 | awk '{if($1>200)print $2}'`
for line in $ip
do
echo $line >> $logfile/getip.txt
echo $line
iptables -I INPUT -p tcp -m multiport --dport 80,443 -s $line -j DROP
done
mm:
t1='date -d "-1 min " +%Y:%H:%M'
log=/var/log/nginx/access.log
block_ip()
{
egrep "$t1:[0-5]+ " $log > /tmp/tmp_last_min.log
awk '{print $1}' /tmp/_last_min.log | sort -n | uniq -c | awk '$1>100 {print $2}' > /tmp/bad_ip.list
n=`wc -l /tmp/bad_ip.list | awk '{print $1}'`
if [ $n -ne 0 ]
then
for ip in `cat /tmp/bad_ip.list`
do
iptables -I INPUT -s $ip -j REJCT
done
11、写一个脚本解决DOS攻击生产案例
DIR="/var/log/nginx/access.log"
IPS_DIR="/var/log/nginx/IPS.txt"
DATE=`date +%F_%H_%M`
BACKUP_DIR="/var/log/nginx/backup"
NEW_FILE_NAME=$BACKUP_DIR/$DATE.txt
if [ ! -d $BACKUP_DIR ];then
mkdir -pv $BACKUP_DIR
fi
cp -r $DIR $NEW_FILE_NAME
>$DIR
awk '{print $1}' $NEW_FILE_NAME | sort | uniq -c | sort -n > ${IPS_DIR}
while read line
do
COUNT=`echo $line | awk '{print $1}'`
IP=`echo $line | awk '{print $2}'`
if [ $COUNT -gt 100 ];then
/usr/sbin/iptables -t filter -A INPUT -s $IP -p tcp -j DROP
fi
done < ${IPS_DIR}