iptables防火墙实战

iptables防火墙实战

iptables

关闭两项功能:

1.selinux(生产中也是关闭的),ids入侵检测,md5指纹.

2.iptables(生产中看情况,内网关闭,外网打开)

大并发的情况,不能开iptables,影响性能,硬件防火墙.

安全优化:

1.尽可能不给服务器配置外网IP.可以通过代理转发.

2.并发不是特别大的情况再外网IP的环境,要开启iptables防火墙.

1.OSI7层模型以及不同层对应哪些协议?

2.TCP/IP三次握手,四次断开的过程,TCP HEADER.

3.常见服务端口要了如指掌.

image-20201129145742415

iptables企业应用场景

主机防火墙:filter表的INPUT链。

image-20201129200153973

局域网共享上网:nat表的POSTROUTING链。半个路由器,NAT功能。

image-20201129200849336

端口及IP映射:nat表的PREROUTING链,硬防的NAT功能。

image-20201129200232944

IP一对一映射。

image-20201129200338026

网络层防火墙

image-20201130233802727

包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等

应用层防火墙

应用层防火墙/代理服务型防火墙(Proxy Service)
将所有跨越防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的“链接”来实现
优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载

image-20201130233951400

可以做NAT映射:

1网关:局域网共享上网。

2IP或端口映射。

iptables主要工作在OSI七层的二、三四层,如果重新编译内核,
Iptables也可以支持7层控制squid代理+iptables

商用防火墙品牌

华为
深信服
思科
H3C
Juniper
天融信
飞塔
网康
绿盟科技
金盾

iptables工作流程

1.防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2.如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
3.如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4.防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。

iptables四表五链

iptables表(tables)和链(chains)
iptables>4个表(tables)=>5个链=(chains)==>规则(policy)
4表
filter(主机防火墙)
nat(端口或IP映射或共享上网)
mangle(配置路由标记 ttl tos mark)
raw
表:
filter:INPUT,OUTPUT,FORWARD
NAT:POSTROUTING,PREROUTING,OUTPUT
mangle:INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING
raw
链:
INPUT:进入主机的数据包。主机防火墙(filter表的INPUT链)
OUTPUT:流出主机的数据包。
FORWARD:流经主机的数据包。
PREROUTING:进入服务器最先经过的链,NAT端口或IP映射。(nat表的PREROUTING链)
POSTROUTING:在流出服务器最后经过的链,NAT共享上网。局域网共享上网(nat表的POSTROUTING链)

三种报文流向:

流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING

表与链对应关系

实际iptables包含4张表和五个链,但主要记住两张表即可``filternat`表即可。

image-20210306144628397

FILTER

image-20201230164554485

NAT

image-20201230164614496

iptables工作原理示意图

image-20201230164639014

image-20201230164846390

image-20201129155034634

iptables环境准备

安装iptables管理命令

[root@m01 ~]# vim /etc/yum.repos.d/CentOS-Base.repo
#http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64  删除阿里云自己的路径    
[root@m01 ~]# yum install iptables-services -y

加载防火墙的内核模块

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

查看已加载的模块

[root@m01 ~]# lsmod |egrep 'filter|nat|ipt'
ipt_REJECT             12541  0 
nf_nat_ftp             12770  0 
nf_conntrack_ftp       18638  1 nf_nat_ftp
iptable_filter         12810  0 
xt_nat                 12681  3 
iptable_nat            12875  1 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26146  3 nf_nat_ftp,nf_nat_ipv4,xt_nat
nf_conntrack          105745  7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
ip_tables              27240  2 iptable_filter,iptable_nat

启动防火墙

停止firewalld

systemctl stop firewalld
systemctl disable firewalld

开启iptables

systemctl start iptables.service
systemctl enable iptables.service

iptables基本操作命令

查看防火墙规则

[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

查看启动状态命令

​ iptables -nL --line-number
​ -n #<以数字的形式显示规则
​ -L #<
列表链里的所有规则
--line-number #<==打印规则序号
-t 指定表(default: filte)

清除防火墙规则

iptables -F     <- 清除所有规则,不会处理默认的规则
iptables -X     <- 删除用户自定义的链
iptables -Z     <- 链的计数器清零(数据包计数器与数据包字节计数器)
[root@m01 ~]# rpm -qc iptables
/etc/sysconfig/iptables-config

添加防火墙规则

iptables [-t table] -A chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -D chain rulenum   #<==根据规则号删除。
iptables [-t table] -D chain rule-specification
iptables  -t        <-指定表d(efault: `filter')
iptables  -A        <-把规则添加到指定的链上,默认添加到最后一行。
iptables  -I        <-插入规则,默认插入到第一行(封IP)。
iptables  -D        <-删除链上的规则

网络连接状态

NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的

删除某个规则

iptables -nL --line-numbers 查看规则号码
iptables -D INPUT 1 删除指定链上的指定序号

iptables A INPUT -p tcp -m state --dport 22 -j DROP
iptables -nL
iptables -nL --line-numbers
iptables -D INPUT 1

iptables实战

禁止某个端口访问

iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #开启放行22端口
禁止源地址是10.0.0.7的主机访问22端口
iptables -t filter -A INPUT -p tcp -s 10.0.0.7 --dport 22 -j DROP
禁止源地址是10.0.0.7的主机访问任何端口
iptables -t filter -A INPUT -p tcp -s 10.0.0.7 -j DROP
禁止源地址是10.0.0.8的主机访问80端口
iptables -t filter -A INPUT -p tcp -s 10.0.0.8 --dport 22 -j DROP
禁止除了10.0.0.7以外的地址访问80端口
iptables -t filter -A INPUT -p tcp ! -s 10.0.0.7 --dport 80 -j DROP
放行源地址是10.0.0.0/24的网段
iptables -t filter -A INPUT -p tcp  -s 10.0.0.0/24 --dport 80 -j ACCEPT
禁止10.0.0.253访问
[root@web01 ~]# iptables -I INPUT -p tcp -s 10.0.0.253 -i eth0 -j DROP
[root@web02 ~]# iptables -A INPUT -p tcp ! -s 10.0.0.2 -i eth0 -j DROP
-s       #<==指定源地址。 ! 取反。
-d       #<==指定目的地址。
-i       #<==进入的网络接口(eth0,eth1)。
-o       #<==出去的网络接口(eth0,eth1)。

规则解释:

-A INPUT #把这条规则添加到INPUT链的最后一行
-p       #<==指定过滤的协议-p(tcp,udp,icmp,all)  
-p tcp   #指定协议为tcp
-m state --state NEW  :匹配TCP的连接状态
-m tcp   --dport 22   :匹配TCP协议的目标端口
--dport     #<==指定目标端口(用户请求的端口)。
-j          #<==对规则的具体处理方法(ACCEPT,DROP,REJECT,SNAT/DNAT)
-j  ACCEPT  #放行规则
--sport     #<==指定源端口。
-s       #<==指定源地址或网段(192.168.1.0/24)。 ! 取反。
-d       #<==指定目的地址(nat表prerouting)。
-i       #<==进入的网络接口(eth0,eth1)。
-o       #<==出去的网络接口(eth0,eth1)。

禁止除跳板机以外的IP访问

iptables -I INPUT -p tcp ! -s 10.0.0.1 -j DROP

2条规则冲突,会以谁先谁为准

iptables -t filter -A INPUT -p tcp -s 10.0.0.7 --dport 22 -j DROP
iptables -t filter -A INPUT -p tcp -s 10.0.0.7 --dport 22 -j ACCEPT

优先级:

匹配频次最高的条件放前面

100次

80 90

22 10

禁止10.0.0.7访问22和80端口
iptables -I INPUT -p tcp -s 10.0.0.7 -m multiport --dport 22,80 -j DROP

匹配端口范围

iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP  #<==最佳

匹配ICMP类型

#禁止所有主机ping
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
放行10.0.0.7可以去ping
iptables -I INPUT 2 -p icmp --icmp-type 8 -s 10.0.0.7 -j ACCEPT
只允许10.0.0.7可以去ping
ACCEPT    icmp  --  10.0.0.7        0.0.0.0/0      icmptype 8
DROP      icmp  --  0.0.0.0/0       0.0.0.0/0      icmptype 8
等同于上一条,优化版,只要不是10.0.0.7就不允许ping
iptables -I  INPUT 2 -p icmp-type 8 ! -s 10.0.0.7  -j ACCEPT

案例:

封掉10.0.0.7

iptables -I INPUT -s 10.0.0.7 -j DROP

让10.0.0.7和SSH客户端(10.0.0.1)服务器可以Ping,其它的不能Ping

iptables -I INPUT -p icmp --icmp-type 8 -s 10.0.0.7 -j ACCEPT
iptables -I INPUT 2 -p icmp ! -s 10.0.0.1 --icmp-type 8 -j DROP

封掉3306端口

iptables -I INPUT -p tcp --dport 3306 -j DROP

iptables企业案例

部署一个安全的防火墙

两种思想:针对默认规则而言。
逛公园:黑名单
1、默认规则默认是允许的状态。
看电影:白名单
2、默认规则默认是不允许的状态。更安全。
看电影的思想更安全。

实战部署:

[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -X
[root@m01 ~]# iptables -Z
[root@m01 ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -P FORWARD DROP
[root@m01 ~]# iptables -P OUTPUT ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  172.16.1.0/24        0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

命令集合:

iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL

局域网共享上网

实验环境:
m01: 共享上网网关出口
web01: 只有内网地址,网关指向m01
实验步骤:
m01操作

[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
[root@m01 ~]# iptables -nL -t nat     
[root@m01 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@m01 ~]# sysctl -p 
[root@m01 ~]#iptables -F
[root@web01 ~]# iptables -nL
 Chain INPUT (policy DROP)
 target     prot opt source               destination

Chain FORWARD (policy DROP)
 target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination
-t nat                  :NAT表
-A POSTROUTING          :POSTROUTING链
-s 172.16.1.0/24        :源地址172.16.1.0/24
-j SNAT                 :SNAT改写源地址
--to-source 10.0.0.61   :将源地址改写成10.0.0.61
172.16.1.7发给百度的数据包格式
源端口:   80
目的端口: 80
源IP:    172.16.1.7
目的IP    百度的IP
网关      172.16.1.61

如果172.16.1.7想上网,需要改成如下的格式
10.0.0.61访问百度
源端口: 80
目的端口: 80
源IP:    10.0.0.61
目的IP    百度的IP
网关     10.0.0.2
 如果你的默认规则设置了拒绝所有,又执行了清除规则的语句-F
 那就意味着,所有的请求全部都拒绝了
 原因是-F不会改变默认规则

解决:
物理机:
1.去机房自己清空
2.让机房的人重启服务器,前提条件是规则没有写入配置里
云服务器:
直接通过控制台恢复
如何避免:
测试规则之前,先写个定时任务,每隔5分钟重启一次iptables

iptables -F
iptables -X
iptables -Z
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
iptables -nL -t nat  

FORWARD链默认为DROP的时候共享上网失效
解决方法:
法一: 添加2条规则

iptables -P FORWARD DROP
iptables -P FORWARD  ACCEPT

web01操作:

[root@web01 ~]# ifdown eth0
[root@web02 ~]# ssh 172.16.1.7
[root@web01 ~]#
[root@web01 ~]# ping www.baidu.com
[root@web01 ~]# ifup eth0
[root@web01 ~]# logout
[root@web02 ~]# 
[root@web01 ~]# cat >/etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=no
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
EOF
[root@web01 ~]# cat >/etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.7
GATEWAY=172.16.1.61
PREFIX=24
DNS1=10.0.0.2
EOF
[root@web01 ~]# systemctl restart network 
[root@web02 ~]# ssh 172.16.1.7
[root@web01 ~]# 
[root@web01 ~]# ip r
default via 172.16.1.61 dev eth1  proto static  metric 100 
172.16.1.0/24 dev eth1  proto kernel  scope link  src 172.16.1.7  metric 100 
[root@web01 ~]# route -n
[root@web01 ~]# cat /etc/resolv.conf    
nameserver 10.0.0.2

web01测试访问外网:

[root@web01 ~]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39: icmp_seq=1 ttl=127 time=7.70 ms
64 bytes from 14.215.177.39: icmp_seq=2 ttl=127 time=8.92 ms

端口映射

m01操作:

访问10.0.0.61的9000端口,跳转到172.16.1.7的22端口
访问10.0.0.61的9000端口的数据包格式
 源端口:        9000
 目的端口:   9000
 源IP:        10.0.0.1
 目的IP:       10.0.0.61
 
源端口:        22
 目的端口:     22
 源IP:        10.0.0.1
 目的IP:       172.16.1.7:22
iptables -t nat -A PREROUTING -d 10.0.1.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22

命令拆解:

表:nat
链:PREROUTING
目标IP:10.0.1.61
目标端口:9000
协议:tcp
动作:DNAT
目标IP:172.16.1.7
目标端口:22

访问测试:

iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
[C:\~]$ ssh 10.0.0.61:9000
root@10.0.1.61's password:
Last login: Tue Aug 20 09:38:42 2019 from 172.16.1.61
[root@m01 ~]# iptables -nL -t nat
[root@web01 ~]# 
[root@web01 ~]# ip r    

注意:
改写数据包的目标IP和端口
用到的是PREROUTING链

IP映射

[root@m01 ~]# 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
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            10.0.1.61            tcp dpt:9000 to:172.16.1.7:22
DNAT       all  --  0.0.0.0/0            10.0.1.62            to:172.16.1.7

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.61

保存命令:

 iptables-save
 iptables-save > iptables_m01
 iptables-restore < iptables_m01
 iptables-save > /etc/sysconfig/iptables

测试访问:

[C:\~]$ ssh root@10.0.0.62
Last login: Wed Aug 21 13:30:04 2019 from 10.0.0.1
[root@web01 ~]# hostname
web01
[root@web01 ~]#
posted @ 2021-03-06 14:48  上善若水~小辉  阅读(223)  评论(0编辑  收藏  举报