第1章 Iptables 网络安全

1.1 Iptables 防火墙介绍

Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具

Netfilter一个系统的内核模块,通过netfilter内核控制硬件设备

Iptables相当于是一个控制软件

iptables+zebra+squid == 一台硬件防火墙

iptables主要工作在OSI七层的二、三、四层 实现应用层访问控制:nginx WAF实现应用访问控制

1.1.1 防火墙的基本工作原理

防火墙通过审查经过的每一个数据包, 判断它是否有相匹配的过滤规则, 根据规则的先后顺序进行一一比较, 直到满足其中的一条规则为止, 然后依据控制机制做出相应的动作. 如果都不满足, 则将数据包丢弃, 从而保护网络的安全。

1.1.2 iptables名词术语说明

容器:用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料

第一个容器:iptables(表)

第二个容器:表(链)

第三个容器:链(规则)

1.1.3 iptable工作流程(规则)

1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。

2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。

3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。

4. 防火墙的默认规则是所有规则执行完才执行的。

1.1.4 Iptables数据包过滤匹配流程

1、数据包从外网传送到防火墙后, 防火墙抢在IP层向TCP层传送前, 将数据包转发给包检查模块进行处理.

2、首先与第一个过滤规则比较.

3、如果与第一个模块相同, 则对它进行审核, 判断是否转发该数据包, 这时审核结果是转发数据包, 则将数据包发送到TCP层进行处理, 否则就将它丢弃.

4、如果与第一个过滤规则不同, 则接着与第二个规则相比较, 如果相同则对它进行审核, 过程与(3)相同.

5、如果与第二个过滤规则不同, 则继续与下一个过滤规则比较, 直到与所有过滤规则比较完成. 要是所有过滤规则都不满足, 就将数据包丢弃.

Iptables 网络安全_系统

 

1.1 iptables服务表和链的概念

1.1.1 表和链

iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。

1.1.2 filter表信息详细介绍
Iptables 网络安全_运维_02
1.1.1 NAT表详细介绍
Iptables 网络安全_系统_03
1.1.2 Mangle表详细介绍
Iptables 网络安全_Linux_04

 

1.1 iptables防火墙实践配置

1.1.1 iptables命令相关参数介绍

iptables -L -n -v --line-number

-L --- 显示防火墙规则信息,以列表形式显示

-n --- 显示防火墙规则信息,以数字形式显示

-v --- 以更详细的形式显示防火墙规则信息(排错时候有用)

--line-number --- 显示规则序号信息

iptables -L --- 以列表显示所有规则信息

iptables -L -n --- 以数字形式显示IP地址和端口号信息

iptables -nL

iptables -nL -v --- 显示详细规则信息

iptables -nL --line-number --- 显示规则序号信息

1.1.2 iptables防火墙策略清空处理

iptables -F --- 清空所有规则信息

iptables -X --- 清空所有自定义链信息

iptables -Z --- 清空计数器信息

计数器1:记录规则匹配了多少数据包

计数器2:记录规则匹配了多少流量信息

说明:以上三个清空操作完成,表示防火墙初始化过程完毕

1.1.3 实践配置01. 阻止用户访问22端口服务

iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

-t --- 指定表的信息

-A --- 在指定链上,添加规则信息

-p --- 指定协议信息(tcp udp icmp)

--dport -- 指定目标端口信息

--sport -- 指定源端口信息

-j -- 对数据包要做什么处理(ACCEPT DROP REJECT)

恢复连接方式:

01. 重启iptables,/etc/init.d/iptables restart

02. iptables -F 简单粗暴(企业中不推荐)

03. 删除指定有问题规则策略

iptables -t filter -D INPUT -p tcp --dport 22 -j DROP

iptables -t filter -D INPUT 1

1.1.4 实践配置02:只让eh0进来的流量可以访问22端口

iptables -A INPUT -i eth1 -p tcp --dport 22 -j DROP

-i --- 指定流量进入的接口信息(只能应用在INPUT链上)

-o --- 指定流量出去的接口信息(只能应用在OUTPUT链上)

1.1.5 实践配置03:只让10.0.0.0/24网段可以访问22端口

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

-s --- 指定源地址或源网段信息

-d --- 指定目标地址或目标网段信息

允许172.16.1.9主机可以访问172.16.1.8这个地址上的22端口服务

iptables -A INPUT -s 172.16.1.9 -d 172.16.1.8 -p tcp --dport 22 -j ACCEPT

iptables -I INPUT -s 172.16.1.9 -d 172.16.1.8 -p tcp --dport 22 -j ACCEPT

-A --- 追加/附加 将新设置的规则放在已有的规则后面

-I --- 插入 将新设置的规则插入到规则列表中(默认放在所有规则最前面)

-D --- 删除 删除指定规则信息

-R --- 替换/修改 修改相应规则策略

1.1.6 实践配置04:只允许10.0.0.1主机可以访问10.0.0.8服务器22端口

iptables -A INPUT -i eth0 -s 10.0.0.1 -d 10.0.0.8 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i eth0 -s 0.0.0.0/0 -d 10.0.0.8 -p tcp --dport 22 -j DROP

iptables -A INPUT -i eth0 ! -s 10.0.0.1 -d 10.0.0.8 -p tcp --dport 22 -j DROP (centos6)

iptables -A INPUT -i eth0 -s !10.0.0.1 -d 10.0.0.8 -p tcp --dport 22 -j DROP (centos5)

! --- 表示取反,或者排除

1.1.7 实践案例05:禁止23到80端口,都不允许10.0.0.1主机进行访问

iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp --dport 23:80 -j DROP

1.1.8 实践案例06:禁止23,24,30,80端口,都不允许10.0.0.1主机进行访问

iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp -m multiport --dport 23,24,30,80 -j DROP

-m extended match (may load extension) 指定加载扩展功能参数

multiport --- 不连续的多端口配置,扩展参数

icmp --- 进行icmp协议访问控制

state --- 指定匹配状态扩展模块

1.1.9 实践案例07:匹配ICMP类型

禁止ping策略原则

iptables -A INPUT -p icmp --icmp-type 8 -j DROP

iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP

iptables服务器是ping命令发起者或是接受者

发起者:

input链: 禁止icmp-type 0 iptables -A INPUT -i eth0 -p icmp --icmp-type 0 -j DROP

output链: 禁止icmp-type 8 iptables -A OUTPUT -o eth0 -p icmp --icmp-type 8 -j DROP

接受者:

input链: 禁止icmp-type 8 iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP

output链: 禁止icmp-type 0 iptables -A OUTPUT -o eth0 -p icmp --icmp-type 0 -j DROP

简化配置:

iptables -A INPUT -i eth0 -p icmp --icmp-type any -j DROP

iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type any -j DROP

iptables -A INPUT -p icmp --icmp-type 8

iptables -A INPUT -p icmp --icmp-type 8 -j DROP

iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT

说明:只有类型8是真正会影响ping,或者也可以采用any;了解很多icmp类型iptables -p icmp -h

icmp type8:Echo request——回显请求(Ping请求) 出去的信息

icmp type0: Echo Reply——回显应答(Ping应答) 回来的信息

1.1.10 实践案例08:状态机制配置

NEW

表示新建立连接的数据包状态

ESTABLISHED

表示新建立连接数据包发送之后,回复响应的数据包状态

RELATED

表示借助已经建立的链路,发送新的连接数据包

INVALID

无效无法识别的数据包

1.1.11 实践案例09:FTP服务器配置防火墙策略

防火墙服务配置在FTP服务器上时,需要配置以下策略

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

实现发现sent_syn状态

iptables -A INPUT -m state --state NEW -j DROP --- 防火墙所连接客户端上配置

实现发现sent_rcvd状态

iptables -I INPUT -i eth0 -s 10.0.0.201 -m state --state ESTABLISHED -j DROP --- 防护墙上配置的

1.1.12 实践案例10:对数据包进行限速处理

# 限制指定时间包的允许通过数量及并发数

-m limit

--limit n/{second/minute/hour}: --limit 6/min

解释:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时

--limit-burst [n]

解释:在同一时间内允许通过的请求”n”为数字,不指定默认为5

实现策略命令:

iptables -A INPUT -s 10.0.0.9 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT

iptables -A INPUT -s 10.0.0.9 -j DROP

1.1.13 实践案例11:企业防火墙应用案例

项目:部署一个最安全的企业级防火墙(案例)

两种思想:针对默认规则而言。

1、默认规则默认是允许的状态。

2、默认规则默认是不允许的状态。更安全。

1)保存防火墙配置文件信息

cp /etc/sysconfig/iptables{,.bak}

2)清除配置规则

iptables -F <- 清空iptables所有规则信息(清除filter)

iptables -X <- 清空iptables自定义链配置(清除filter)

iptables -Z <- 清空iptables计数器信息(清除filter)

3)别把自己踢出到门外

iptables -A INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT

4)配置防火墙filter上各个链的默认规则

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

-P --- 指定相应链的默认规则策略,是允许还是阻止

5)允许iptables服务端ping自己的网卡地址

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.1.0/24 -j ACCEPT

iptables -A INPUT -s 10.0.2.0/24 -j ACCEPT

如果防火墙上配置了FTP服务,需要配置网络状态机制(允许相应流量返回)

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

实现iptables策略配置永久保存

①. 利用防火墙启动脚本命令参数,实现永久保存

/etc/init.d/iptables save

②. 利用防火墙配置信息保存命令,实现永久保存

iptables-save >/etc/sysconfig/iptables

 
1.1.14 实例拓展:避免自己被踢出门外

01. 去机房重启系统或者登陆服务器删除刚才的禁止规则。

02. 让机房人员重启服务器或者让机房人员拿用户密码登录进去

03. 通过服务器的远程管理卡管理(推荐)

04. 先写一个定时任务,每5分钟就停止防火墙

05. 测试环境测试好,写成脚本,批量执行

1.2 防火墙NAT表配置说明

1.2.1 NAT表的作用

iptables NAT:(配置NAT表示就是配置以下两个链)

01. postrouting(内网---外网-NAT 源私网IP地址---源公网IP地址 端口转化)

路由之后,进行地址映射转换,把源地址进行转换(源私网地址==>源公网地址)

02. prerouting(外网---内网-NAT 目标公网IP地址---目标私网IP地址 映射目标端口)

路由之前,进行地址映射转换,把目标地址进行转换(目标公网地址==>目标变为私网地址)

1.2.2 iptables实现共享上网方法(postrouting)

配置内网主机

第一个历程:配置内网服务器,设置网关地址

/etc/init.d/iptables stop --- 内网服务器停止防火墙服务

ifdown eth0 --- 模拟关闭内网服务器外网网卡

setup --- 修改内网网卡网关和DNS地址信息

[root@oldboyedu42-lnb-02 ~]# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1

169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1

0.0.0.0 172.16.1.7 0.0.0.0 UG 0 0 0 eth1

说明:内网服务器网关地址指定为共享上网服务器内网网卡地址

配置iptables服务器

第一个历程:配置共享上网服务器,开启共享上网服务器路由转发功能

[root@oldboyedu42-lnb-02 ~]# vim /etc/sysctl.conf

[root@oldboyedu42-lnb-02 ~]# 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.8

-s 172.16.1.0/24 --- 指定将哪些内网网段进行映射转换

-o eth0 --- 指定在共享上网哪个网卡接口上做NAT地址转换

-j SNAT --- 将源地址进行转换变更

-j DNAT --- 将目标地址进行转换变更

--to-source ip地址 --- 将源地址映射为什么IP地址

--to-destination ip地址 --- 将目标地址映射为什么IP地址

扩展如果开启:forward默认drop策略,如果配置forward链

iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT

iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT

iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT

iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE <- 伪装共享上网

说明:在企业中如何没有固定外网IP地址,可以采取以上伪装映射的方式进行共享上网

总结:配置映射方法

01. 指定哪些网段需要进行映射 -s 172.16.1.0/24

02. 指定在哪做映射 -o eth0

03. 用什么方法做映射 -j SNAT/DNAT

04. 映射成什么地址 --to-source ip地址/--to-destination ip地址

1.2.3 iptables实现外网IP的端口映射到内网IP的端口

10.0.0.8 9000 === 172.16.1.9 22

需求:将网关的IP和9000端口映射到内网服务器的22端口

端口映射 10.0.0.7:9000 -->172.16.1.8:22

实现命令:

iptables -t nat -A PREROUTING -d 10.0.0.7 -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.201:22

iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 9000 -i eth0 -j DNAT --to-destination 172.16.1.8:22

(1)-d 10.0.0.8目标地址。

(2)-j DNAT 目的地址改写。

1.2.4 IP一对一映射

172.16.1.10 == 10.0.0.10

辅助IP:

ip addr add 10.0.0.81/24 dev eth0 label eth0:0 #<==辅助IP

iptables -t nat -I PREROUTING -d 10.0.0.81 -j DNAT --to-destination 172.16.1.51

iptables -t nat -I POSTROUTING -s 172.16.1.51 -o eth0 -j SNAT --to-source 10.0.0.81

检查:

ping 10.0.0.81 -t

tcpdump|grep -i icmp(两台机器上分别监测)

telnet 10.0.0.81 873(51上提前配好)

1.2.5 映射多个外网IP上网

方法1:

iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16

三层交换机或路由器,划分VLAN。

方法2:

iptables -t nat -A POSTROUTING -s 10.0.1.0/22 -o eth0 -j SNAT --to-source 124.42.60.11

iptables -t nat -A POSTROUTING -s 10.0.2.0/22 -o eth0 -j SNAT --to-source 124.42.60.12

扩大子网,增加广播风暴。

1.3 系统防火墙与网络内核优化标准参数

有关iptables的内核优化

调整内核参数文件/etc/sysctl.conf

以下是我的生产环境的某个服务器的配置:

------------解决time-wait过多-------------

net.ipv4.tcp_fin_timeout = 2

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_keepalive_time = 600

net.ipv4.tcp_max_tw_buckets = 36000

----------------------------------

net.ipv4.ip_local_port_range = 4000 65000

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.route.gc_timeout = 100

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

----------------------------------

#dmesg里面显示 ip_conntrack: table full, dropping packet.的错误提示,什么原因?如何解决?

#iptables优化

net.nf_conntrack_max = 25000000

net.netfilter.nf_conntrack_max = 25000000

net.netfilter.nf_conntrack_tcp_timeout_established = 180

net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120

net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60

net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120