开源的基于数据包过滤的网络安全策略控制工具。web
centos6.9 --- 默认防火墙工具软件iptablesshell
centos7 --- 默认防火墙工具软件firewalld(zone)vim
iptables主要工做在OSI七层的2、3、四层,若是从新编译内核,iptables也能够支持7层控制(squid代理+iptables)。centos
iptables是采用数据包过滤机制工做的,因此它会对请求的数据包的包头数据进行分析,并根据咱们预先设定的规则进行匹配来决定是否能够进入主机。安全
一、防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。服务器
二、若是匹配上了规则,即明确代表是阻止仍是经过,此时数据包就不在向下匹配新规则了。网络
三、若是全部规则中没有明确代表是阻止仍是经过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则获得明确的阻止仍是经过。架构
四、防火墙的默认规则是对应链的全部的规则执行完之后才会执行的(最后执行的规则)。ssh
表(tables)socket |
链(chains) |
|
Filter |
This is the default table (if no -t option is passed) 这是默认表 |
|
INPUT |
for packets destined to local sockets 对于指定到本地套接字的包,即到达本地防火墙服务器的数据包 |
|
FORWARD |
for packets being routed through the box 路由穿过的数据包,即通过本地防火墙服务器的数据包 |
|
OUTPUT |
for locally-generated packets 本地建立的数据包 |
|
NAT |
This table is consulted when a packet that creates a new connection is encountered 当遇到新建立的数据包链接时将参考这个表 |
|
PREROUTING |
for altering packets as soon as they come in 一进来就对数据包进行改变 |
|
OUTPUT |
or altering locally-generated packets before routing 本地建立的数据包在路由以前进行改变 |
|
POSTROUTING |
for altering packets as they are about to go out 在数据包即将出去时改变数据包信息 |
|
Managle |
This table is used for specialized packet alteration 这个表专门用于改变数据包 |
|
INPUT |
for packets coming into the box itself 进入到设备自己的包 |
|
FORWARD |
for altering packets being routed through the box 对路由后的数据包信息进行修改 |
|
PREROUTING |
for altering incoming packets before routing 在路由以前更改传入的包 |
|
OUTPUT |
for altering locally-generated packets before routing 本地建立的数据包在路由以前进行改变 |
|
POSTROUTING |
for altering packets as they are about to go out 在数据包即将离开时更改数据包信息 |
|
raw |
此表用处较少,能够忽略不计 |
filter (做用:主机防火墙) 默认的表。***** nat (做用:端口或IP映射或共享上网)***** mangle (配置路由标记 ttl tos mark) raw (忽略)
filter表(默认的表,做用:主机防火墙)
INPUT:进入主机的数据包
OUTPUT:本地建立的数据包
FORWARD:路由穿过的数据包,即通过本地防火墙服务器的数据包
NAT表(做用:端口或IP映射或共享上网)
PREROUTING:一进来就对数据包进行改变
OUTPUT:本地建立的数据包在路由以前进行改变
POSTROUTING:在数据包即将出去时改变数据包信息
mangle表(配置路由标记 ttl tos mark)
INPUT:进入到设备自己的包
FORWARD:对路由后的数据包信息进行修改
PREROUTING:在路由以前更改传入的包
OUTPUT:本地建立的数据包在路由以前进行改变
POSTROUTING:在数据包即将离开时更改数据包信息
filter表 |
强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出,流经主机的数据包)filter表示iptables默认使用的表,这个表定义了三个链(chains ) 企业工做场景:主机防火墙 |
INPUT |
负责过滤全部目标地址是本机地址的数据包 通俗来讲:就是过滤进入主机的数据包 |
FORWARD |
负责转发流经主机的数据包。起转发的做用,和NAT关系很大,后面会详细介绍 LVS NAT 模式,net ipv4.ip_forward=l |
OUTPUT |
处理全部源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包 |
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 |
在数据包离开防火墙时进行路由判断以后执行的规则,做用改变数据包的源地址,源端口等。 写好发件人的地址,要让家人回信时可以有地址可回。 例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路甶器将源地址改成了公网地址。 生产应用:局域网共享上网。 |
一、主机防火墙(filter表的INPUT链)。
二、局域网共享上网(nat表的POSTROUTING链)。半个路由器,NAT功能。
三、端口及IP映射(nat表的PREROUTING链),硬防的NAT功能。
四、IP一对一映射。
-I(大写i 插入) -A(追加) -R(替换) -D(删除) -L(列表显示)
-I将会把规则放在第一行,-A将会放在最后一行。
例子:
iptables –t filter -A INPUT -p tcp --dport 22 -j DROP iptables –t filter -A INPUT -p tcp --dport 3306 -j DROP iptables –t filter -I INPUT -p tcp --dport 80 -j DROP
说明:前两句就算是先执行,第三句也会是第一行
-L 查看iptables控制策略列表信息
-n 查看iptables控制策略列表里面的ip地址和端口信息,不翻译,以数字表示
--line-number 查看iptables策略信息时,显示每条规则序号信息
-v 查看iptables策略详细信息(进出口)
[root@iptables ~]# iptables -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination
-F 清除全部规则,不会处理默认的规则
-X 删除用户自定义的链
-Z 清除链的计数器(数据包计数器与数据包字节计数器)
-A 向指定链添加相应规则,默认从规则号结尾进行添加(添加最后)
-I 向指定链中插入规则,默认插入到第一条规则之上
-p 指定访问数据的协议类型(tcp、udp、icmp)
--dport 指定目标端口信息
--sport 指定源端口信息
-j 执行操做的动做(ACCEPT、DROP(丢弃)、REJECT(拒绝))
-D 删除指定链里面的规则策略
-i 指定数据流量进入接口信息(只能配置在INPUT链)
-o 指定数据流量流出接口信息(只能配置在OUTPUT链)
-s 指定数据流量源地址或网段信息
-d 指定数据流量目标地址或网段信息
! 表示控制策略取反
-m 表示增长扩展匹配功能
禁止10.0.0.0网段连入:
iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
能够不指定 -t filter 由于默认就是filter表
-i:流量进入的接口(从eth0进入)
-s:源地址
源地址不是10.0.0.150的单个IP的禁止链接:
iptables -t filter -A INPUT -i eth0 !-s 10.0.0.150 -j DROP
禁用icmp协议:
iptables -t filter -A INPUT -p icmp --icmp-type 8 -i eth0 -s 10.0.0.0/24 -j DROP
禁止访问响应服务端口:
以22端口为例
iptables -A INPUT -p tcp --dport 22 -j DROP 在默认表中的INPUT链中追加策略:禁止22端口访问
删除某规则:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT --- 删除指定规则 iptables -D INPUT 2 --- 根据规则行号,删除相应的规则
禁止网段连入:
例子:禁止192.168.17.0网段访问10.0.0.7主机
iptables -A INPUT -s 192.168.17.0/24 -d 10.0.0.7 -j DROP
例子:禁止某个192.168.17.0网段不能访问服务器主机的22端口
iptables -A INPUT -s 192.168.17.0/24 -d 10.0.0.7 -p tcp --dport 22 -j DROP
匹配指定协议之外的全部协议:
! 表示取反
iptables -A INPUT ! –p tcp –s 10.0.0.0/24 -j DROP centos6写法
-p ! tcp centos5写法
设置连续多端口控制策略:
iptables -A INPUT -p tcp --dport 22:80 -j DROP
设置不连续多端口控制策略:
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP
-m --- 表示增长扩展匹配功能 multiport 实现不连续多端口扩展匹配
对网络数据传输进行限速:
iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -j DROP --limit n/{second/minute/hour}: 解释:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时 --limit-burst [n] 解释:在同一时间内容许经过的请求”n”为数字,不指定默认为5
两种思想:对于默认策略为容许状态,防火墙规则就至关于黑名单;对于默认策略为禁止状态,防火墙规则就至关于白名单。
首先清空默认规则,而后设置远程链接规则,防止本身被踢出,更改默认规则
iptables -F iptables -X iptables -Z iptables -A INPUT -p tcp --dport 22 -j ACCEPT --- 防止被踢出门外 iptables -P INPUT DROP iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
被指安全白名单策略
iptables -A INPUT -i lo -j ACCEPT --- 让本身能够ping本身 iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT --- 容许哪些网站服务能够访问 iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT --- 容许架构内部服务进行访问 iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT --- 容许一些合做企业的外网服务器进行访问
这几条就是最简单的企业防火墙部署
[root@iptables ~]# /etc/init.d/iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@iptables ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Wed Jan 17 16:12:23 2018 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [82:9632] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT -A INPUT -s 172.16.1.0/24 -j ACCEPT COMMIT # Completed on Wed Jan 17 16:12:23 2018
iptables-save >/etc/sysconfig/iptables
# 容许关联的状态包经过(web服务不要使用FTP服务)
new说明这个包是咱们看到的第一个包,意思就是,这是conntrack模块看到的某个链接的第一个包,它即将被匹配了。好比,咱们看到一个SYN包,是咱们所留意的链接的第一个包,就要匹配它。
表示新创建链接的数据包状态
ESTABLISHED已经注意到两个方向上的数据传输,并且会继续匹配这个链接的包。处于ESTABLISHED状态的链接是很是容易理解的。只要发送并接到应答,链接就是ESTABLISHED的了。一个链接要从new变为ESTABLISHED,只须要接到应答包便可,无论这个包是发往防火墙的,仍是要由防火墙转发的。ICMP的错误和重定向信息包也被看做是ESTABLISHED,只要他们是咱们所发出的信息的应答。
表示新创建链接数据包发送以后,回复响应的数据包状态
RELATED是个比较麻烦的状态,当一个链接和某个已处于ESTABLISHED状态的链接有关系时,就会被认为是RELATED的了。换句话说,一个链接要想是RELATED的,首先要有一个ESTABLISHED的链接。这个ESTABLISHED链接再产生一个主链接以外的链接,这个新的链接就是RELATED的了,固然前提是conntarck模块要能理解RELATED。
表示借助已经创建的链路,发送新的链接数据包
INVALID说明数据包不能被识别属于哪一个链接或没有任何状态。有几个缘由能够产生这种状况,好比,内存溢出,收到不知属于哪一个链接的ICMP错误信息。通常地,咱们DROP这个状态的任何东西,由于防火墙任务这是不安全的东西。
无效没法识别的数据包
防火墙服务配置在FTP服务器上时,须要配置如下策略
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
route add default gw 172.16.1.200 --- 首先在内网服务器设置网关(网关为拥有外网网卡的防火墙服务器内网地址)
在防火墙服务器开启路由转发功能
[root@iptables ~]# vim /etc/sysctl.conf [root@iptables ~]# sysctl -p net.ipv4.ip_forward = 1
实现内网访问外网的NAT映射
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.200 -s 172.16.1.0/24 --- 指定将哪些内网网段进行映射转换 -o eth0 --- 指定在共享上网哪一个网卡接口上作NAT地址转换 -j SNAT --- 将源地址进行转换变动 -j DNAT --- 将目标地址进行转换变动 --to-source ip地址 --- 将源地址映射为何IP地址 --to-destination ip地址 --- 将目标地址映射为何IP地址
需求:将网关的IP和9000端口映射到内网服务器的22端口
端口映射 10.0.0.88:9000 -->172.16.1.8:22
实现命令:
iptables -t nat -A PREROUTING -d 10.0.0.88 -p tcp --dport 9000 -i eth0 -j DNAT --to-destination 172.16.1.8:22 -d 10.0.0.8目标地址 -j DNAT 目的地址改写
效果:链接88服务器的9000端口,会自动跳转链接到8服务器的22端口
[e:\~]$ ssh 10.0.0.88 9000 Connecting to 10.0.0.88:9000... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Last login: Wed Jan 17 09:48:56 2018 from 172.16.1.88 [root@web01 ~]#