iptables防火墙

版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin

1.iptables 执行过程

1.防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后 进行过滤的。
2. 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数 据包就不再向下匹配新的规则。
3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4. 防火墙的默认规则是所有规则都匹配完才会匹配的

2.表与链

1 简介

iptables 是 4表伍链
4表: filter 表 nat表 raw表 mangle表
伍链: INPUT OUTPUT FORWARD PREROUTING POSTROUTING
pre.... 之前
post .....之后

2 每个表说明

2.1filter表

实现防火墙功能: 屏蔽或准许 端口 ip
强调:主要和主机自身相关,真正负责主机防火墙功能的 (过滤流入流出主机的数据包) filter表示iptables默认 使用的表,这个表定义了三个链(chains) 企业工作场 景:主机防火墙
INPUT链:负责过滤所有目标地址是本机地址的数据包 通俗来说: 就是过滤进入主机的数据包 (能否让数据包进入服务器)

2.2nat表

实现nat功能 实现共享上网(内网服务器上外网) 端口映射和ip映射
nat:负责网络地址转换的,即来源与目的IP地址和port 的转换。 应用:和主机本身无关,一般用于局域网共享上网 或者特殊的端口转换服务相关。
工作场景: 1. 用于企业路由(zebra)或网关(iptables),共 享上网(POSTROUTING) 2. 做内部外部IP地址一对一映射(dmz),硬件防 火墙映射IP到内部服务器,ftp服务 (PREROUTING) 3. WEB,单个端口的映射,直接映射80端口 (PREROUTING) 这个表定义了3个链,nat功能 相当于网络的acl控制。和网络交换机acl类似
PREROUTING链:在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等就是收信时,根据规则重写收件人的地址。例如:把公网IP:xxx.xxx.xxx.xxx映射到局域网的 xx.xx.xx.xx服务器上。 如果是web服务,可以报80转换为局域网的服务器 9000端口上
POSTROUTING链:在数据包离开防火墙时进行路由判断之后执行的规 则,作用改变数据包的源地址,源端口等。 写好发件人的地址,要让家人回信时能够有地址可 回。 例如。默认笔记本和虚拟机都是局域网地址,在出 网的时候被路由器将源地址改为了公网地址。 生产应用:局域网共享上网。

3.环境准备及相关命令

1.环境准备

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/ip6tables
/etc/sysconfig/iptables                   #防火 墙的配置文件
/usr/lib/systemd/system/ip6tables.service
/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   # 恢复

#防火墙相关模块 加载到内核中(临时)

[root@m01 ~]# modprobe ip_tables
[root@m01 ~]# modprobe iptable_filter
[root@m01 ~]# modprobe iptable_nat
[root@m01 ~]# modprobe ip_conntrack
[root@m01 ~]# modprobe ip_conntrack_ftp
[root@m01 ~]# modprobe ip_nat_ftp
[root@m01 ~]# modprobe ipt_state

#永久

[root@m01 ~]# cat >>/etc/rc.local<<EOF
> modprobe ip_tables
> 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'
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

关闭自带防火墙并启动iptables

[root@m01 ~]# systemctl stop firewalld
[root@m01 ~]# systemctl disable firewalld
[root@m01 ~]# systemctl start iptables.service 
[root@m01 ~]# systemctl enable iptables.service 
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

#查看filter表中的规则 ,默认查看的是filter表

[root@m01 ~]# iptables -nL

#查看指定表中的规则

[root@m01 ~]# iptables -t nat -nL

2.iptables命令参数

参数 含义
-L 显示表中的所有规则
-n 不要把端口 或ip反向解析为名字
-t 指定表 不指定默认是filter表
-A 追加 加入准许类规则 使用-A
-I insert 把规则加在链的第1条 拒绝类规则放在所有 规则最上面 拒绝类 -I
-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
-i input 输入的时候 从哪个网卡进来
-o ouput 输出的时候 从哪个网卡出去
-j 满足条件后的动作:DROP/ACCEPT/REJECT DROP REJECT拒绝 DROP 把数据丢掉 不会返回信息给用户 REJECT 拒绝 返回拒绝信息
-F 清除所有规则,不会处理默认的规则
-X 删除用户自定义的链
-Z 链的计数器清零(数据包计数器与数据包字节计数器)

3 配置filter表规则

3.1正式配置之前先清空规则

[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -X
[root@m01 ~]# iptables -Z
[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         

3.2禁止访问22端口

[root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP  ###拒绝用户访问22端口(危险,一会要跑机房)
#此时发现Xshell已经无法进行操作了
#进入机房
#查看规则并加上序号
[root@m01 ~]# iptables -t filter -nL --line-number
#删除规则
iptables -t filter  -D INPUT  1   #根据序号删除

3.3 封ip 屏蔽某个ip

#拒绝10.0.0.7访问     

[root@m01 ~]# iptables -t filter -I INPUT -s 10.0.0.7 -j DROP
[root@m01 ~]# iptables  -t filter -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       all  --  10.0.0.7             0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

#拒绝某个网段的访问

[root@m01 ~]# iptables -I INPUT -s 172.16.1.0/24 -j DROP 
[root@m01 ~]# iptables  -t filter -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       all  --  172.16.1.0/24        0.0.0.0/0           
2    DROP       all  --  10.0.0.7             0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination     

#禁止网段连入(禁止10.0.0.0/24网段访问 8888端口)

[root@m01 ~]# iptables -I INPUT  -s 10.0.0.0/24  -p tcp  --dport 8080 -j DROP 
[root@m01 ~]# iptables  -t filter -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.0.0.0/24          0.0.0.0/0            tcp dpt:8080
2    DROP       all  --  172.16.1.0/24        0.0.0.0/0           
3    DROP       all  --  10.0.0.7             0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination       

3.4只允许指定网段连入(允许172.16.1.0网段)

#方法1: 利用 ! 进行排除

[root@m01 ~]# iptables -I INPUT ! -s 172.16.1.0/24  -j DROP

#方法2: 修改链默认规则 修改为拒绝 添加准许

[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)####已经变为拒绝了
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
#测试完成后 修改回去
[root@m01 ~]# iptables  -P INPUT ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

3.5 指定多个端口

#指定多个端口

-m multiport   -p tcp   --dport 80,443
[root@m01 ~]# iptables -t filter -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT 
[root@m01 ~]# iptables -nL

3.6匹配ICMP类型

###通过防火墙设置

[root@m01 ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP 
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

###通过内核参数设置

[root@m01 ~]# echo "net.ipv4.icmp_echo_ignore_all = 1" >> /etc/sysctl.conf
[root@m01 ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
[root@m01 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1

3.7 限制并发及速率

-m limit 限制模块

-m limit –limit 10/minute     #每分钟只能有10个数据包 每6秒 生成

iptables -I INPUT  -p icmp  -m limit –limit 10/minute    –limit-burst 5   -j ACCEPT

3.8 防火墙规则的保存与恢复

iptables-save 默认输出到屏幕

iptables-restore 加上文件

写入到/etc/sysconfig/iptables

####保存

[root@m01 ~]# iptables-save >/etc/sysconfig/iptables
[root@m01 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Fri May 28 16:52:58 2021
*nat
:PREROUTING ACCEPT [55:8594]
:INPUT ACCEPT [27:6329]
:OUTPUT ACCEPT [113:7357]
:POSTROUTING ACCEPT [113:7357]
COMMIT
# Completed on Fri May 28 16:52:58 2021
# Generated by iptables-save v1.4.21 on Fri May 28 16:52:58 2021
*filter
:INPUT ACCEPT [30:2576]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [364:46616]
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -p icmp -m icmp --icmp-type 8 -j DROP
COMMIT
# Completed on Fri May 28 16:52:58 2021

###删除后的恢复

[root@m01 ~]# iptables -D INPUT 1
[root@m01 ~]# iptables -D INPUT 1
[root@m01 ~]# iptables -D INPUT 1
iptables: Index of deletion too big.
[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         
[root@m01 ~]# iptables-restore < /etc/sysconfig/iptables
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
DROP       icmp --  10.0.0.0/24          0.0.0.0/0            icmptype 8
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

4. nat表规则

4.1 实现共享上网

##防火墙配置

[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.7 -j SNAT --to-source 10.0.0.61 
[root@m01 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@m01 ~]#  sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.ip_forward = 1

##web端配置

[root@web01 ~]# echo GATEWAY=172.16.1.61 >> /etc/sysconfig/network-scripts/ifcfg-eth1
[root@web01 ~]# ifdown eth1 && ifup eth1

4.2 实现端口转发

##防火墙配置

[root@mb01 ~]# iptables -t nat -I PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
[root@mb01 ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.ip_forward = 1
###然后用xshell连接测试一下吧

 

posted @ 2022-04-12 20:54  kirin(麒麟)  阅读(1056)  评论(0编辑  收藏  举报
Δ