版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者: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连接测试一下吧