## 防火墙的配置
>[success] 服务器中,防火墙的配置是十分必要的!
在这里以Centos的iptables为例,进行讲解
### iptables 介绍(iptables 内置了4个表,5个链)
#### 五个规则链
1. PREROUTING (路由前)
2. INPUT (数据包流入口)
3. FORWARD (转发管卡)
4. OUTPUT(数据包出口)
5. POSTROUTING(路由后)
>[danger] 这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。
### 四个表(提供特定功能)
1. fileter 用于数据的过滤
2. nat 用于对数据包的源、目标地址进行修改
3. mangle 用于数据包进行高级修改
4. raw 该项优先级最高,但一般不做设置,一量设置一般是为了不再让iptables做数据包的连接跟 踪。
### 防火墙的策略
>[success]防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略
### 使用率较高的功能
>[success] 现在用的比较多个功能有3个
1. filter 定义允许或者不允许的
2. nat 定义地址转换的
3. mangle功能:修改报文原数据
### iptables 的规则是针对表和链进行操作的,但不是所有表在所有链上都能做防火墙设置
>[danger] 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
### iptables 基本命令
**查看是否安装防火墙**
~~~
whereis iptables
~~~
**查看防火墙规则列表**
~~~
iptables -L
~~~
**临时清空防火墙(重启失效)**
~~~
iptables -F
~~~
**永久保存防火墙配置**
~~~
service iptables save
~~~
**启动防火墙**
~~~
service iptables start
~~~
**重启防火墙**
~~~
service iptables restart
~~~
**停止防火墙**
~~~
service iptables stop
~~~
**查看iptables状态**
~~~
service iptables status
~~~
**查看iptables是否开机启动**
~~~
chkconfig iptables --list
~~~
**设置iptables开机启动/不启动**
~~~
chkconfig iptables on
chkconfig iptables off
~~~
### iptables语法
#### iptablse介绍
名称:iptables
使用权限:root(其它用户需要授权)
使用方式:iptalbes [-t 表格名称] 指令 条件 [目标|链]
说明:显示当前登录系统用户的信息,可以轻松显示登录账号,使用的终端,登录时间和来源IP
参数:iptables的参数较多,分为指令集,目标集和条件集。
#### 指令集表
| 参数 | 含义 |
| --- | --- |
| -N | 建立一个新的(自定义)链 |
| -P | 改变一条链的原则 |
| -F | 清除一条链中的所有规则 |
| -I | 在链内的某一个位置插入(insert)一条新规则 |
| -D | 在链内某个位置删除一条规则 |
| -X | 删除一个空链 |
| -L | 列出一个链中的规则 |
| -A | 在一个链的最后面新增(append)一条规则,也要追加规则 |
| -R | 在链内某个位置替换(replace)一条规则 |
#### 目标集表
| 参数| 含义|
| -- |--|
| ACCEPT| 通过链检验,接受这个数据包|
| DROP| 未通过链检验,立即丢弃这个封包|
| QUEUE| 将封包重导至本机队列|
| RETURN| 通过链的检验,回到原来的链中|
| TOS| 改变封包TOS字段的值|
| REJECT| 未通过链检验,丢弃数据包|
| SNAT| 改变封包来源IP字段的值|
| DNAT| 改变封包目标IP字段的值|
| MASQUERADE| 动态地根据中由参数修改Source socket|
| TTL| 改变封TTL字段的值|
#### 条件集表
| 参数|含义|
|--|--|
| -i -o| 网络接口匹配|
| -p| 匹配所属协议(tcp、udp、icmp等,可以使用all指定所有协议)|
| -m state| 清除一条链中的所有规则|
| --tcp-flags| 封包类型|
| --icmp-type| 封包类型|
| -s| 匹配数据包源IP|
| --sport| 匹配数据包的源端口|
| --dport| 匹配数据包的目的端口|
| INPUT| 封包在防火墙中的流向|
| OUTPUT| 封包在防火墙中的流向|
| FORWARD| 封包在防火墙中的流向|
| -j| 跳至目标或自定义链|
### 常用规则
>[success]最为常用的就是追加新规则
#### 语法:
~~~
iptables -A chain firewall-rule
# -A chain 指定要追加的规则链
# firewall-rule 为具体的规则参数
~~~
#### 常用实例:
1. 插入一条规则允许22号端口的所有数据进入
~~~
shell>iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
# -I: 插入规则
# INPUT: 输入链
# 3: 规则排序
#-p tcp:指定表,指定协议规则
# dport 22:指定端口
# -j ACCEPT 运行
~~~
>[danger]防火墙规则设置后立即生效,所以在设置一些规则的时侯必须谨慎,比如说ssh,一旦我们自身采用的是远程访问,但是又拒绝了ssh的INPUT,我们马上会被拒之门外。
2. 防止别人ping
~~~
shell>iptables -A INPUT -p icmp -j DROP
~~~
>[danger]规则设置原则:
规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的
### 防火墙执行顺序
>[danger]在这里一定要注意,防火墙规则,是按照从上到下的顺进行匹配的,如果遇到匹配的就执行,如果没有匹配的,就继续执行下一条。
所以,如果规则中,同时写了如下两条件:
~~~
iptables -A INPUT -p icmp -j DROP
iptables -A INPUT -p icmp -j ACCEPT #这一条是无效的
~~~