前言 在大企业中防火墙角色主要交给硬件来支持,效果自然没话说只是需要增加一点点成本,但对于大多数个人或者互联网公司来说选择系统自带的iptables或者第三方云防火墙似乎是更加合适的选择,通过一些合理的优化和灵活的配置,我们也可以很轻松实现硬件防火墙的部分功能,够用就好。
建立防火墙白名单机制很重要
 
基础知识 Netfilter 与 iptables 的关系 Linux 系统在内核中提供了对报文数据包过滤和修改的官方项目名为 Netfilter,它指的是 Linux 内核中的一个框架,它可以用于在不同阶段将某些钩子函数(hook)作用域网络协议栈。Netfilter 本身并不对数据包进行过滤,它只是允许可以过滤数据包或修改数据包的函数挂接到内核网络协议栈中的适当位置。这些函数是可以自定义的。
iptables 是用户层的工具,它提供命令行接口,能够向 Netfilter 中添加规则策略,从而实现报文过滤,修改等功能。Linux 系统中并不止有 iptables 能够生成防火墙规则,其他的工具如 firewalld 等也能实现类似的功能。
使用 iptables 进行包过滤 iptables 策略是由一组有序的规则建立的,它告诉内核应该如何处理某些类别的数据包。每一个 iptables 规则应用于一个表中的一个链。一个 iptables 链就是一个规则集,这些规则按序与包含某种特征的数据包进行比较匹配。
表 iptables 默认有 4 个表
nat 表(地址转换表) 
filter 表(数据过滤表) 
raw 表(状态跟踪表) 
mangle 表(包标记表) 
 
链 每个表都有一组内置链,用户还可以添加自定义的链。最重要的内置链是 filter 表中的 INPUT、OUTPUT 和 FORWARD 链。
INPUT 链(入站规则) 
OUTPUT 链(出站规则) 
FORWARD 链(转发规则) 
PREROUTING 链(路有前规则) 
POSTROUTING 链(路由后规则) 
 
下图展现了一个数据包是如何通过内核中的 net 和 filter 表的:
iptables的4表5链 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 iptables  -->1 )要实现那种功能:判断添加在那张表上2 )报文流经的路径:判断添加在那个链上1 )同类规则(访问同一应用):匹配范围小的放上面2 )不同类规则(访问不同应用):匹配到报文平率较大的放上面3 )将可以由条规则描述的多个规则合并为一个4 )设置默认策略:raw  -->mangle  -->nat  -->
匹配 每个 iptables 规则都包含一组匹配和一个目标动作,后者定义了复合规则的数据包应该采取什么处理行为。iptables 匹配指定是数据包必须匹配的条件,只有当数据包满足所有的匹配条件时,iptables 才能根据规则的目标所指定的动作来处理该数据包。
每个匹配都在 iptables 的命令行中指定。下面是一些常用的基本匹配:
参数 
作用 
 
 
-P 
设置默认策略 
 
-F 
清空规则链 
 
-L 
查看规则链 
 
-A 
在规则链的末尾加入新规则 
 
-I num 
在规则链的头部加入新规则 
 
-D num 
删除某一条规则 
 
-s 
匹配来源地址IP/MASK,加叹号“!”表示除这个IP外 
 
-d 
匹配目标地址 
 
-i网卡名称 
匹配从这块网卡流入的数据 
 
-o网卡名称 
匹配从这块网卡流出的数据 
 
-p 
匹配协议,如TCP、UDP、ICMP 
 
–dport num 
匹配目标端口号 
 
–sport num 
匹配来源端口号 
 
防火墙的匹配规则 
匹配即可停止 
匹配有先后顺序 
默认规则的优先级最低 
 
基础语法 
表名作用:
 
raw:高级功能,如:网址过滤。
规则链作用:
 
INPUT链:处理输入数据包。
动作作用:
 
accept:接收数据包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 #规则的观察与清除[-t tables]  [-L]  [-nv] table  ,例如 nat 或 filter  ,若省略此项目,则使用默认的 filtertable  的规则[-t tables]  [-FXZ] "自定义"  的 chain (应该说的是 tables )啰;[-AI 链名]  [-io 网络接口]  [-p 协议]  [-s 来源IP/网域]  [-d 目标IP/网域]  -j [ACCEPT|DROP|REJECT|LOG] "插入"  或 "累加" 2 ~5  号i  :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;p  协定:设定此规则适用于哪种封包格式all  。192.168 .0.100 192.168 .0.0 /24 , 192.168 .0.0 /255.255 .255.0  均可。192.168 .100.0 /24  表示不许 192.168 .100.0 /24  之封包来源;#TCP , UDP 的规则比对:针对端口设定[-AI 链]  [-io 网络接口]  [-p tcp,udp]  [-s 来源IP/网域]  [--sport 埠口范围]  [-d 目标IP/网域]  [--dport 端口范围]  -j [ACCEPT|DROP|REJECT] --sport  埠口范围:限制来源的端口号码,端口号码可以是连续的,例如 1024 :65535 --dport  埠口范围:限制目标的端口号码。#iptables  外挂模块:mac 与 state[-m state]  [--state 状态] --state  :一些封包的状态,主要有:#ICMP  封包规则的比对:针对是否响应 ping 来设计[-p icmp]  [--icmp-type 类型]  -j ACCEPT--icmp-type  :后面必须要接 ICMP 的封包类型,也可以使用代号,8   代表 echo request 的意思。
注意事项与规律
 
可以不指定表,默认为 filter 表 
可以不指定链,默认为对应表的所有链 
除非设置默认策略,否则必须指定匹配条件 
选项 / 链名 / 目标操作用大写字母,其余都小写 
 
配置iptables白名单机制 
配置iptables白名单是相对简单有效的管理手段
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 iptables  -F0 :0 ]0 :0 ]0 :0 ]10.0.0.0 /8  -j ACCEPT172.16.0.0 /12  -j ACCEPT192.168.0.0 /16  -j ACCEPT180.168.36.198  -j ACCEPT 180.168.34.218  -j ACCEPT 222.73.202.251  -j ACCEPT 80  -j ACCEPT 22  -j ACCEPT1     ACCEPT     all  --  0.0.0.0 /0             0.0.0.0 /0            2     ACCEPT     all  --  0.0.0.0 /0             0.0.0.0 /0            state RELATED,ESTABLISHED 3     ACCEPT     icmp --  0.0.0.0 /0             0.0.0.0 /0            4     ACCEPT     all  --  10.0.0.0 /8            0.0.0.0 /0            5     ACCEPT     all  --  172.16.0.0 /12         0.0.0.0 /0            6     ACCEPT     all  --  192.168.0.0 /16        0.0.0.0 /0            7     ACCEPT     all  --  180.168.36.198        0.0.0.0 /0            8     ACCEPT     all  --  180.168.34.218        0.0.0.0 /0            9     ACCEPT     all  --  222.73.202.251        0.0.0.0 /0            10    ACCEPT     tcp  --  0.0.0.0 /0             0.0.0.0 /0            tcp dpt:80  11    ACCEPT     tcp  --  0.0.0.0 /0             0.0.0.0 /0            tcp dpt:22  12    DROP       all  --  0.0.0.0 /0             0.0.0.0 /0            1     DROP       all  --  0.0.0.0 /0             0.0.0.0 /0            1     ACCEPT     all  --  0.0.0.0 /0             0.0.0.0 /0    
设置crontab脚本 
便于运维集中化管理扩展
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 vim /root/ start_iptables.sh/sbin/i ptables -P INPUT ACCEPT/sbin/i ptables -F/sbin/i ptables -X/sbin/i ptables -A INPUT -i lo -j ACCEPT  /sbin/i ptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT /sbin/i ptables -A INPUT -p icmp -j ACCEPT/sbin/i ptables -A INPUT -s 10.0 .0.0 /8  -j ACCEPT/sbin/i ptables -A INPUT -s 172.16 .0.0 /12  -j ACCEPT/sbin/i ptables -A INPUT -s 192.168 .0.0 /16  -j ACCEPT/sbin/i ptables -A INPUT -s 180.168 .36.198  -j ACCEPT /sbin/i ptables -A INPUT -s 180.168 .34.218  -j ACCEPT /sbin/i ptables -A INPUT -s 222.73 .202.251  -j ACCEPT /sbin/i ptables -A INPUT -p tcp --dport 80  -j ACCEPT /sbin/i ptables -A INPUT -p tcp --dport 22  -j ACCEPT/sbin/i ptables -A INPUT -j DROP /sbin/i ptables -A FORWARD -j DROP /sbin/i ptables -A OUTPUT -j ACCEPT 755  /root/ start_iptables.sh0  0  * * * /root/ start_iptables.sh
CentOS7配置iptables 1 2 3 4 5 6 7 8 9 10 system ctl stop firewalldsystem ctl disable firewalldsystem ctl start iptablessystem ctl enable iptables
开启Linux路由转发 1 2 3 4 5 6 0  > /proc/ sys/net/i pv4/ip_forward            1  > /proc/ sys/net/i pv4/ip_forward            'net.ipv4.ip_forward=1'  >> /etc/ sysctl.conf
配置NAT Tunnel 
俗称跳板机
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 # 配置iptables:PREROUTING ACCEPT [6:504] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [1:52] :POSTROUTING ACCEPT [1:52] :INPUT DROP [1029028:53321694] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [44723822:21524638399] 
常用的iptables配置文件 1 2 3 4 5 6 7 8 9 # dnatA  PREROUTING -s 1.1.1.1 /30,2.2.2 .2  -p tcp --dport 10000  -j DNAT --to-destination 10.71.12.89 :80 A  POSTROUTING -d 1.1.1.1  -j SNAT --to-source 2.2.2.2 A  POSTROUTING -o bond1 -j SNAT --to-source 3.3.3.3 A  POSTROUTING -j MASQUERADEA  INPUT -s 10.65.200.90  -p tcp -m multiport --dports 10050,10051  -j ACCEPTA  INPUT -s 10.65.200.90  -p tcp -m multiport --dports 10050:10060  -j ACCEPT
Ansible管理iptables 
核心先规范好iptables模板格式,然后利用ansible blockinfile中的marker批量修改
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 *filter :INPUT  DROP  [0 :0 ]:FORWARD  ACCEPT  [0 :0 ]:OUTPUT  ACCEPT  [0 :0 ]-A  INPUT  -p  ipv4  -j  ACCEPT -A  INPUT  -p  vrrp  -j  ACCEPT -A  INPUT  -p  igmp  -j  ACCEPT -A  INPUT  -d  224.0 .0 .18  -j  ACCEPT -A  INPUT  -p  tcp  --dport  80  -j  ACCEPT -A  INPUT  -p  tcp  --dport  443  -j  ACCEPT -A  INPUT  -s  xxx  -p  tcp  --dport  22  -j  ACCEPT -A  INPUT  -s  xxx  -p  tcp  --dport  22  -j  ACCEPT -A  INPUT  -s  xxx  -p  tcp  --dport  22  -j  ACCEPT -A  INPUT  -s  10.10 .8 .151 /32      -p  tcp  --dport  22  -j  ACCEPT -A  INPUT  -s  10.10 .70 .149  -p  tcp  -m  tcp  --dport  38422  -j  ACCEPT -A  INPUT  -s  169.254 .0 .0 /16    -j  DROP -A  INPUT  -s  224.0 .0 .0 /4       -j  DROP -A  INPUT  -d  224.0 .0 .0 /4       -j  DROP -A  INPUT  -s  240.0 .0 .0 /5       -j  DROP -A  INPUT  -d  240.0 .0 .0 /5       -j  DROP -A  INPUT  -s  0.0 .0 .0 /8         -j  DROP -A  INPUT  -d  0.0 .0 .0 /8         -j  DROP -A  INPUT  -d  239.255 .255 .0 /24  -j  DROP -A  INPUT  -d  255.255 .255 .255   -j  DROP -A  INPUT    -m  state  --state  INVALID  -j  DROP -A  OUTPUT   -m  state  --state  INVALID  -j  DROP -A  INPUT  -p  tcp  --tcp-flags  SYN,FIN  SYN,FIN  -j  DROP -A  INPUT  -p  tcp  --tcp-flags  SYN,RST  SYN,RST  -j  DROP -A  INPUT  -p  icmp  --icmp-type  echo-reply  -j  ACCEPT -A  INPUT  -p  icmp  --icmp-type  destination-unreachable  -j  ACCEPT -A  INPUT  -p  icmp  --icmp-type  redirect  -j  ACCEPT -A  INPUT  -p  icmp  --icmp-type  echo-request  -j  ACCEPT -A  INPUT  -p  icmp  --icmp-type  time-exceeded  -j  ACCEPT -A  INPUT  -i  lo  -j  ACCEPT -A  INPUT  -m  state  --state  RELATED,ESTABLISHED  -j  ACCEPT COMMIT --- -  hosts:  all become:  yes gather_facts:  no tasks: -  name:  backup  iptables copy: src:  /etc/sysconfig/iptables dest:  /etc/sysconfig/iptables.bak remote_src:  yes -  name:  add  iptables  line  for  internal  logic  service blockinfile: path:  /etc/sysconfig/iptables insertafter:  '^:OUTPUT ACCEPT' marker:  "# {mark} iptables whitelist only for internal logic service" block:  |           -A INPUT -s 10.0.0.0/8 -j ACCEPT -  name:  reload  service service:  name=iptables  state=reloaded tags: -  reload