防火墙分类
硬件:
用途: 整个企业入口
三层路由: H3C 华为 Cisco(思科)
深信服
软件:
用途: 网站内部封ip
iptables 写入到Linux内核中以后服务docker
firewalld Centos7
云防墙
阿里云:安全组

名词

容器:瓶子罐子存放东西 表(table):存放链的容器链(chain):存放规则的容器规则(policy):准许或拒绝规则 | Netfilter | 表(tables) | 链(chains) | 规则(Policy) | | —- | —- | —- | —- | | 一栋楼 | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 | | iptables | nat/filter | | |

防火墙规则匹配流程

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

注: 屏蔽规则一般放在最上面 允许规则放在下面

表与链

四表五链
四表:filter表(**默认**) nat表 raw表 mangle表
nat表的功能一般在云服务器不能用 filter表可以

filter表

filter表 强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)
filter表示iptables默认使用的表,这个表定义了三个链( chains )
企业工作场景:主机防火墙
INPUT 负责过滤所有目标地址是本机地址的数据包通俗来说:就是过滤进入主机的数据包
FORWARD 负责转发流经主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍LVS NAT模式, net.ipv4.ip_forward=0
OUTPUT 处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包

NAT表

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

安装和使用

安装

  1. ~]# yum install iptables iptables-services -y
  2. 启动
  3. Centos7
  4. ~]# systemctl start iptables.service
  5. ~]# systemctl enable iptables.service
  6. Centos6
  7. ~]# /etc/init.d/iptables.service
  8. ~]# chkconfig iptables on

命令参数

  1. -n 不要吧ip端口转换成服务名 例如0.0.0.0/0 会自动转换成anywhere
  2. -t 指定表(默认是filter表)
  3. -I 添加规则(放在最前 写拒绝规则的时候使用)
  4. -A append 添加规则(放在最后) 后面指定链(INPUT..)
  5. -p 指定协议
  6. --dport dest)目标端口 指定端口后面需要指定协议 tcp/udp/icmp(ping)/all
  7. -j 处理的方法(DROP|ACCEPT)或者REJECT
  8. -D 删除规则
  9. -s source)指定源IP 范围 或者网段
  10. --line-number 显示行号
  11. -m multiport 可以添加多个端口

DROP 丢掉数据无返回信息
REJECT 丢掉数据返回信息
查看当前防火墙规则

  1. ~]# iptables -t nat -nL
  2. ~]# iptables -t filter -nL
  3. ~]# iptables -nL
  4. Chain INPUT (policy ACCEPT) <---默认规则 放行
  5. target prot opt source destination
  6. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
  7. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
  8. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  9. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
  10. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  11. Chain FORWARD (policy ACCEPT)
  12. target prot opt source destination
  13. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  14. Chain OUTPUT (policy ACCEPT)
  15. target prot opt source destination

防火墙关闭后 如果使用iptables -nL查看 , iptables会自动开启
模块加载

  1. modprobe ip_tables 是防火墙的核心模块,负责维护防火墙的规则表,通过这些规则,实现防火墙的核心功能。归纳起来,主要有三种功能:包过滤( filter ) NAT 以及包处理( mangle )
  2. modprobe iptable_filter 防火墙数据包过滤模块,实现对数据包的过滤与放行功能
  3. modprobe iptable_nat 防火墙数据包转发模块,用于对数据包进行修改,从而实现数据转发的目的
  4. modprobe ip_conntrack 主要用于修改应用层协议控制包,无比重要的作用就是实现nat
  5. modprobe ip_conntrack_ftp ftp服务nat映射相关的模块
  6. modprobe ip_nat_ftp ftp 服务nat映射相关的模块
  7. modprobe ipt_state 防火墙状态信息模块,在新版centos6系统中已经忽略此模块的加载

查看

  1. ~]# lsmod |egrep "nat|filter|ipt"
  2. iptable_nat 12875 0
  3. nf_nat_ipv4 14115 1 iptable_nat
  4. nf_nat 26787 1 nf_nat_ipv4
  5. ipt_REJECT 12541 2
  6. nf_reject_ipv4 13373 1 ipt_REJECT
  7. nf_conntrack 133053 4 nf_nat,nf_nat_ipv4,xt_conntrack,nf_conntrack_ipv4
  8. iptable_filter 12810 1
  9. ip_tables 27126 2 iptable_filter,iptable_nat
  10. libcrc32c 12644 3 xfs,nf_nat,nf_conntrack

重启服务后失效 可以写进/etc/rc.local

清空规则

  1. iptables -Z 清空所有规则,不会处理默认规则
  2. iptables -X 删除用户自定义的链
  3. iptables -F 链的计数器清零(数据包计数器与数据包字节计数器)

删除规则

只删除某一个规则
查看规则的行号

  1. ~]# iptables -nL --line-number
  2. Chain INPUT (policy ACCEPT)
  3. num target prot opt source destination
  4. 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
  5. 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
  6. 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  7. 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
  8. 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  9. Chain FORWARD (policy ACCEPT)
  10. num target prot opt source destination
  11. 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  12. Chain OUTPUT (policy ACCEPT)
  13. num target prot opt source destination

删除第一行规则

  1. ~]# iptables -D INPUT 1

添加规则举例

拒绝规则写在前面

filter表

黑名单模式

实现只能通过内网访问22端口

  1. iptables -A INPUT -p tcp ! -s 172.16.1.0/24 --dport 22 -j DROP

表示 不是172.16.1.0/24这个网段就拒绝

屏蔽端口

  1. # 只能访问80 443 22
  2. iptables -I INPUT -p tcp -m multiport ! --dport 80,443,22 -j DROP
  3. # 屏蔽范围端口
  4. iptables -I INPUT -p tcp -m muLtiport --dport 1024:2048 j DROP
  5. 测试是否成功 可以用 nc-kl 1025
  6. 然后另一台机器telnet

禁用某个IP

  1. ~]# iptables -I INPUT -p tcp -s 10.0.0.6 -j DROP

禁ping

  1. iptables -I INPUT -p icmp -j DROP

ICMP 协议 是ping的协议
ping在其中的类型是8 所以命令中准确点可以加上—icmp-type 8
通过内核参数也可以禁ping

  1. # 临时
  2. ~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
  3. 永久
  4. ~]# net.ipv4.icmp_echo_ignore_a11=1 写入到/etc/sysctl.conf
  5. ~]# sysct1 -P #生效

限制并发速率

--m limit 限制模块
-m limit --1imit 10/minute# 每分钟只能有10个数据包(单位可以是second/minute/hour)

白名单模式

只允许10网段通过

  1. iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT 只允许10网段通过
  2. iptables -P INPUT DROP # 修改默认规则为拒绝

nat表

共享上网

云服务器不能用 阿里云可以用NAT网关

  1. 需要把共享上网主机的内核转发模块打开net.ipv4.ip_forward=1
  2. iptables -t nat -A POSTROUTING -s 172.16.1.0/24 j SNAT --to-source 10.0.0.61
  3. #修改的是POSTROUTING链 源ip是172.16.1. 0/24 经过防火墙处理修改为10.0.0.61
  4. 然后另一台主机网关修改为10.0.0.61的内网IP

端口转发

用户访问a机器的一个端口 转发到b机器的一个端口

  1. iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9001 -j DNAT -- to-destination 172.16.1.7:22
  2. 访问10.0.0.619000端口转发到了172.16.1.722端口

规则的备份 及永久生效

永久生效

  1. ~]# iptables-save >/etc/sysconfig/iptables #启动默认找的配置文件
  2. 恢复
  3. ~]# iptables-restore </etc/sysconfig/iptables

备份

  1. ~]# iptables-save >>/root/rul
  2. [root@web03 ~]# ll
  3. total 8
  4. -rw-------. 1 root root 1499 Jan 10 14:42 anaconda-ks.cfg
  5. -rw-r--r-- 1 root root 472 May 14 10:55 rul
  6. ~]# cat rul
  7. # Generated by iptables-save v1.4.21 on Tue May 14 10:55:43 2019
  8. *filter
  9. :INPUT ACCEPT [0:0]
  10. :FORWARD ACCEPT [0:0]
  11. :OUTPUT ACCEPT [181:16663]
  12. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  13. -A INPUT -p icmp -j ACCEPT
  14. -A INPUT -i lo -j ACCEPT
  15. -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
  16. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  17. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  18. COMMIT
  19. # Completed on Tue May 14 10:55:46 2019
  20. ~]#
  21. ~]# iptables -X
  22. ~]# iptables -F
  23. ~]# iptables -Z
  24. ~]#
  25. ~]# iptables-restore </root/rul
  26. ~]# iptables -nL
  27. Chain INPUT (policy ACCEPT)
  28. target prot opt source destination
  29. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
  30. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
  31. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  32. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
  33. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  34. Chain FORWARD (policy ACCEPT)
  35. target prot opt source destination
  36. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  37. Chain OUTPUT (policy ACCEPT)
  38. target prot opt source destination