iptables噩梦级汇总

在这里插入图片描述

文章目录


前言

学好iptables的基础:
1、OSI7层模型以及不同层对应哪些协议?
2、TCP/IP三次握手,四次断开的过程,TCP HEADER,状态转换
3、常用的服务端口要非常清楚了解。
4、常用服务协议原理http协议,icmp协议

参考书籍资料:tcp/ip协议卷1


第一章 iptables防火墙简介

Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。特别是它可以在一台非常低的硬件配置服务器上跑的非常好(赛扬500HZ cpu 64M内存的情况下部署网关防火墙),提供近400人的上网服务丝毫不逊色企业级专业路由器防火墙。iptables+zebra+squid(企业常用网络开源产品)。

iptables是linux2.4及2.6内核中集成的服务。其功能与安全性比其老一辈ipfwadm,ipchains强大的多,iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,iptables也可以支持7层控制(squid代理+iptables)。

第二章 iptables名词和术语

不少刚接触到iptables的初学者可能会对iptables防火墙的相关名词搞的很晕,不知道其所云的具体意思,本节不会长篇大论,而是就最基本的能让大家容易快速理解和掌握的思路来描述:
容器:包含或者说属于的关系

2.1 什么是容器

谁不知道啊,容器就是装东西的,如(箱、包、坛)。没错,恭喜你答对了。词典里解释说,容器就是用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料。在iptables里的呢,就是用来描述这种包含或者说属于的关系。

2.2 什么是Netfilter/iptables?

Netfilter是表(tables)的容器。这样解释大家肯定还是晕。举个例子,如果把Netfilter看成是某个小区的一栋楼。那么表(tables)就是楼里的其中的一套房子。这套房子“表(tables)”属于这栋楼“Netfilter”。

2.3 什么是表(tables)?

表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables)。如上,如果把Netfilter看成是某个小区的一栋楼。那么表(tables)就是楼里的其中的一套房子。

2.4 什么是链(chains)?

链(chains)是规则(Policys)的容器。接上,如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等)。

2.5 什么是规则(Policy)?

规则(Policy)就比较容易理解了,就是iptables一系列过滤信息的规范和具体方法条款了。可以理解为柜子如何增加并摆放柜子东西等。
描述完了基本术语我们画个形象的表格帮同学进行记忆:

Netfilter表(tables)链(chains)规则(Policy)
一栋楼楼里的房子房子里的柜子柜子里衣服,摆放规则

第三章 iptables工作流程

前面介绍已经提到,iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。

数据包的流向是从左向右的。

在这里插入图片描述

工作流程小结:

  1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
  2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
  3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
  4. 防火墙的默认规则是所有规则执行完才执行的。
提示信息:
iptables防火墙规则的执行顺序默认从前到后(从上到下)依次执行,遇到匹配的规则就不再继续向下检查,只有需要到不匹配的规则才会继续向下进行匹配
重点:匹配上了拒绝规则也是匹配
[root@Jerome ~]# iptables -A INPUT -p tcp --dport 3306 -j DROP
[root@Jerome ~]# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
说明:此时telnet 10.0.0.148 3306是不通的,原因就是telnet请求匹配上了拒绝规则
iptables -A INPUT -p tcp --dport 3306 -j DROP,因此,不会再找下面的规则匹配了。
如果希望telnet 10.0.0.148 3306连通,可以把ACCEPT规则中的-A改为-I,即
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT,把允许规则放于INPUT链的第一行生效
默认规则是所有的规则执行完才会执行的

第四章 iptables表(tables)和链(chains)

描述完iptables术语后,相信大家对iptables的表和链有了初步的了解了。默认情况下,iptables根据功能和表的定义划分包含三个表,filter,nat,mangle,其每个表又包含不同的操作链(chains)。
实际iptables包含4张表和五个链,但主要记住两张表即可filter和nat表即可。

下面表格展示了表和链的对应关系。
1、表和链详细解释说明:

在这里插入图片描述

2、表和链的对应关系

在这里插入图片描述

下面利用思维导图辅助记忆

在这里插入图片描述

提示:所有链名必须要大写

4.1 filter表信息详细介绍

filter表和相关链信息说明

在这里插入图片描述

强调:对于filter表的控制是我们实现本机防火墙功能的重要手段,特别是对INPUT链的控制。

4.2 NAT表信息详细介绍

NAT表和相关链信息说明

在这里插入图片描述

4.3 Mangle表信息详细介绍

Mangle表和相关链信息说明

在这里插入图片描述

由于这个表与特殊标记相关,一般情况下,我们用不到这个mangle表,这里就不做详细介绍了,到高级版时再给大家讲解。(这里也给初学者一个建议:新手学习时最好抓住一个主线向前学,能够跑通路就好,不一定要面面俱到,不然很容易陷进去,而苦恼,甚至失去学习兴趣)

第五章 iptables表和链工作的流程图

下面的这张图清晰的描绘了netfilter对包的处理流程

在这里插入图片描述

iptables包处理流程图

在这里插入图片描述

抽象说明:上图可以用地铁1,2号线来描述:
1号线:主要是NAT功能
企业案例:

  1. 局域网上网共享(路由和网关),使用NAT的POSTROUTING链。
  2. 外部IP和端口映射为内部IP和端口(DMZ功能),使用NAT的PREROUTING链
    2号线:主要是FILTER功能,即防火墙功能FILTER INPUT FORWARD
    企业案例:
  3. 主要应用就是主机服务器防火墙,使用FILTER的INPUT链

第六章 iptables命令帮助信息

[root@Jerome ~]# iptables -V
iptables v1.4.7
[root@Jerome ~]# iptables -h		<- 如果要详细的查看帮助,man iptables
iptables v1.4.7

Usage: 
iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]						<- 其中-P等同于--policy规则
iptables -h (print this help information)

Commands:
Either long or short options are allowed.
提示:长格式或短格式命令都可用
--append		-A	chain					Append to chain
												添加链中的规则信息
--check			-C	chain					Check for the existence of a rule
--delete			-D	chain					Delete matching rule from chain
												删除链上匹配的规则
--delete			-D	chain rulenum			Delete rule rulenum (1 = first) from chain
												删除链上指定的规则序号(1=first)
--insert			-I	chain [rulenum]			Insert in chain as rulenum (default 1=first)
												在链中根据序号插入规则(默认插入规则序号为1=first)
--replace		-R	chain rulenum			Replace rule rulenum (1 = first) in chain
--list			-L	[chain [rulenum]]			List the rules in a chain or all chains
												列出一个链或所有链中的规则信息
--list-rules		-S	[chain [rulenum]]			Print the rules in a chain or all chains
--flush			-F	[chain]					Delete all rules in chain or all chains
												删除一个链或所有链中的规则信息(不含默认规则)
--zero			-Z	[chain [rulenum]]			Zero counters in chain or all chains
												一个链或所有链的计数器清零
--new 			-N	chain					Create a new user-defined chain
												创建新的用户定义链
--delete-chain	-X	[chain]					Delete a user-defined chain
												删除用户自定义的链
--policy			-P	chain target				Change policy on chain to target
												改变链上的最终默认规则策略
--rename-chain	-E	old-chain new-chain		Change chain name, (moving any references)

Options:
[!]	--proto			-p	proto					protocol: by number or name, eg. `tcp'
													指定协议信息,通过数字或名称表示,例如 tcp
[!]	--source			-s	address[/mask][...]		source specification
													指定源地址信息
[!]	--destination		-d	address[/mask][...]		destination specification
													指定目标地址信息
[!]	--in-interface		-i	input name[+]			network interface name ([+] for wildcard)
													指定匹配进入指定网络接口数据
	--jump			-j	target					target for rule (may load target extension)
													规则目标(可以加载扩展目标)
	--goto 			-g	chain					jump to chain with no return
	--match			-m	match					extended match (may load extension)
													扩展匹配(可以加载扩展参数)
	--numeric			-n							numeric output of addresses and ports
													地址和端口号的号码信息输出
[!]	--out-interface 	-o	output name[+]			network interface name ([+] for wildcard)
													指定匹配流出指定网络接口数据
		--table			-t 	table					table to manipulate (default: `filter')
													指定主要应用的表(默认应用filter表)
	--verbose			-v							verbose mode
													显示详细信息
		--line-numbers								print line numbers when listing
														当列出规则信息时,打印规则行号
		--exact			-x							expand numbers (display exact values)
														扩展数字(显示精确数值)
[!]	--fragment		-f							match second or further fragments only
	--modprobe=<command>						try to insert modules using this command
	--set-counters PKTS BYTES						set the counter during insert/append
[!]	--version			-V							print package version.

6.1 实际测试iptables规则

1. 启动和查看iptables状态

/etc/init.d/iptables start
iptables -L -n 或 iptables -nL

实例演示01:

[root@Jerome ~]# /etc/init.d/iptables start
iptables: Applying firewall rules:                         [  OK  ]
[root@Jerome ~]# iptables -L -n
Chain INPUT (policy ACCEPT)		<- 表示当所有规则都不匹配时,默认规则是什么
target		prot opt source				destination         
ACCEPT		all		-- 	0.0.0.0/0			0.0.0.0/0			state RELATED,ESTABLISHED 
ACCEPT		icmp	-- 	0.0.0.0/0			0.0.0.0/0           
ACCEPT 		all		-- 	0.0.0.0/0			0.0.0.0/0           
ACCEPT		tcp		-- 	0.0.0.0/0			0.0.0.0/0			state NEW tcp dpt:22 
REJECT		all		--	0.0.0.0/0			0.0.0.0/0			reject-with icmp-host-prohibited 
说明:以上信息为INPUT链下面的规则信息

Chain FORWARD (policy ACCEPT)
target		prot opt source				destination         
REJECT		all		--	0.0.0.0/0			0.0.0.0/0 		reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target		prot opt source				destination

提示:如果遇到下面的无法启动IPTABLES的情况
[root@Jerome ~]# /etc/init.d/iptables start
[root@Jerome ~]# /etc/init.d/iptables start
[root@Jerome ~]# /etc/init.d/iptables status
Firewall is stopped
解决:setup-->Firewall configuration-->enable

扩展说明:如果无法进入Firewall configuration解决方法
解决一:字符集没有进行设置 
[root@Jerome ~]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
# 需要进行设置即可
[root@Jerome ~]# export LC_CTYPE="en_US.UTF-8"
[root@Jerome ~]# export LC_ALL="en_US.UTF-8"

解决二:系统总线进行没有开启
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.FileNotFound: 
Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
# 开启系统总线服务即可,并且可以设置为开机自启动
[root@Jerome ~]# dbus-daemon --system
# dbus是一个消息传递系统,应用程序间可通过它来相互传递消息,dbus-daemon是一个守护进程
# 在rc.sysinit最后添加一行dbus-daemon --system,这样系统启动时,avahi就不会出问题了

iptables默认加载的内核模块
[root@Jerome ~]# lsmod |egrep "nat|filter"
Module				Size		Used	by
iptable_filter			2793	1 
ip_tables				17831	1		iptable_filter

[root@Jerome ~]# lsmod |egrep "nat|filter|ipt"
Module				Size		Used	by
iptable_filter			2793  	1 
ip_tables				17831  	1		iptable_filter
ipt_REJECT			2351	2
说明:默认防火墙相关加载的内核模块信息较少

可以通过命令加载如下模块到内核中:
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state			<- centos6版本系统中可忽略此模块的加载

# 模块加载完成后,在进行查看
[root@Jerome ~]# lsmod |egrep "nat|filter"
Module				Size		Used	by
nf_nat_ftp			3443	0 
nf_conntrack_ftp		12049	1		nf_nat_ftp
iptable_nat			5923	0 
nf_nat				22676	2		nf_nat_ftp,iptable_nat
nf_conntrack_ipv4	9186	5		iptable_nat,nf_nat
nf_conntrack			79537	6		nf_nat_ftp,nf_conntrack_ftp,iptable_nat,
										nf_nat,nf_conntrack_ipv4,xt_state
iptable_filter			2793	1 
ip_tables				17831	2		iptable_nat,iptable_filter
说明:确认已经新增加载上了很多的模块

扩展教学:lsmod查看内核模块命令说明在这里插入图片描述

加载的内核模块介绍说明:

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

2. 清除默认规则

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

实例演示02:

[root@Jerome ~]# iptables -F
[root@Jerome ~]# iptables --flush
提示:以上两条命令等价
[root@Jerome ~]# iptables -X
[root@Jerome ~]# iptables --delete-chain
提示:以上两条命令等价
[root@Jerome ~]# iptables -Z
[root@Jerome ~]# iptables --zero
提示:以上两条命令等价 
[root@Jerome ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
说明:所有规则策略已经清空,全部默认规则为接收允许

3. 配置禁止规则

禁止ssh默认22端口
官方语法
iptables -[ACD] chain rule-specification [options]
iptables -[ACD] chain rule-specification -t [table]
具体命令
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
说明:
01. iptables默认用的就是filter表,因此,以上两条命令等价;
02. 其中INPUT DROP要大写
03. --jump -j target for rule (may load target extension)
基本的处理行为:ACCEPT(接受) DROP(丢弃) REJECT(拒绝)
比较:DROP好于REJECT;捉迷藏问题分析,有响应表示拒绝,没响应表示丢弃
04. 命令行执行的规则,仅仅在内存里临时生效

实例演示:

[root@Jerome ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
[root@Jerome ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
说明:执行以上任意命令可以发现已经无法远程连接服务器了

# 配置规则后进行查看
[root@Jerome ~]# iptables -L -n
Chain INPUT (policy ACCEPT)		<- 表示当所有规则都不匹配时,默认规则是什么
target		prot opt source				destination         
DROP		all	 -- 	0.0.0.0/0				0.0.0.0/0			tcp dpt:22 

Chain FORWARD (policy ACCEPT)
target		prot opt source				destination         

Chain OUTPUT (policy ACCEPT)
target		prot opt source				destination
说明:生成了禁止ssh服务的22端口DROP策略

实例拓展:恢复刚才断掉的SSH连接
01. 去机房重启系统或者登陆服务器删除刚才的禁止规则。
02. 让机房人员重启服务器或者让机房人员拿用户密码登录进去
03. 通过服务器的远程管理卡管理(推荐)
04. 先写一个定时任务,每5分钟就停止防火墙
05. 测试环境测试好,写成脚本,批量执行
iptables -I INPUT -p tcp --dport 22 -j DROP
说明:利用-I参数,实现强行阻止访问22端口,将此规则放在第一位

# 删除配置的禁止连接22端口的规则
iptables -t filter -D INPUT -p tcp --dport 22 -j DROP
iptables -F
/etc/init.d/iptables restart

iptables -nL --line-number		<- 查看链的规则序号信息
iptables -D INPUT 1				<- 根据规则序号信息进行删除指定规则

禁止网段连入(禁止10.0.0.0网段)
iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
说明:iptables默认用的就是filter表,因此,以上两条命令等价

实例演示:

[root@Jerome ~]# iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
[root@Jerome ~]# iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
说明:执行以上任意命令可以发现10.0.0.0网段不能访问服务器主机了

实例拓展:

# 删除配置的禁止来源地址为10网段的命令
iptables -D INPUT -i eth0 -s 10.0.0.0/24 -j DROP
iptables -F
/etc/init.d/iptables restart
iptables -D INPUT 1

只允许指定网段连入(允许10.0.0.0网段)

iptables -A INPUT -i eth0 ! -s 10.0.0.0/24 -j DROP
iptables -t filter -A INPUT -i eth0 ! -s 10.0.0.0/24 -j DROP
说明:iptables默认用的就是filter表,因此,以上两条命令等价;并且要注意!放置位置

实例演示:

[root@Jerome ~]# iptables -A INPUT -i eth0 !-s 10.0.0.0/24 -j DROP
[root@Jerome ~]# iptables -t filter -A INPUT -i eth0 !-s 10.0.0.0/24 -j DROP
说明:执行以上任意命令可以发现10.0.0.0网段不能访问服务器主机了

实例拓展:

# 删除配置的禁止来源地址为10网段的命令
iptables -D INPUT -i eth0 -s 10.0.0.0/24 -j DROP
iptables -F
/etc/init.d/iptables restart
iptables -D INPUT 1

教学扩展:测试!非用法

01. 源地址不是10.0.0.101单个IP的禁止连接
iptables -t filter -I INPUT -i eth0 !-s 10.0.0.101 -j DROP
iptables -A INPUT -p all -i eth0 !-s 10.0.0.101 -j DROP		<- -p udp,tcp,icmp,all
iptables -t filter -I INPUT -p icmp --icmp-type 8 -i eth0 ! -s 10.0.0.101 -j DROP
提示:可以把自己的笔记本IP当做10.0.0.101 

02. 源地址不是10.0.0.0/24的网段禁止连接
iptables -t filter -I INPUT -i eth0 ! -s 10.0.0.0/24 -j DROP
iptables -t filter -I INPUT -i eth0 -s 10.0.0.0/24 -j ACCEPT
说明:以上两个命令作用等价

# 不允许指定网段以外主机访问服务52113端口,服务协议为tcp?
? iptables -A INPUT -p tcp --dport 52113 ! -s 10.0.0.0/24 -j DROP
? iptables -A INPUT -p tcp --dport 52113 ! -s 172.16.1.0/24 -j DROP
说明:可以任意排列组合,组合策略信息条件取交集

禁止用户访问服务端口(禁止访问80或3306端口–练习题)

iptables -A INPUT -p tcp -dport 80 -j DROP
iptables -t filter -A INPUT -p tcp -dport 80 -j DROP
说明:iptables默认用的就是filter表,因此,以上两条命令等价

提示说明:
使用-I和-A的顺序,防火墙的过滤根据规则顺序的
-A是添加规则到指定链的结尾,最后一条
-I是添加规则到指定链的开头,第一条;也可指定插入位置
一般封IP地址时,进行策略配置就需要利用-I参数

实例演示:

[root@Jerome ~]# iptables -A INPUT -p tcp --dport 80 -j DROP
[root@Jerome ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
说明:执行以上任意命令可以发现不能访问服务器主机80端口了

# 配置规则后进行查看
[root@Jerome ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP     tcp  --  0.0.0.0/0            	 0.0.0.0/0           tcp dpt:80 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
说明:生成了禁止访问服务器主机80端口DROP策略

实例拓展:

# 删除配置的禁止策略
iptables -D INPUT -p tcp -dport 80 -j DROP
iptables -F
/etc/init.d/iptables restart
iptables -D INPUT 1

企业应用:-A和-I说明

awk ‘{print $1}/app/log/access_log|sort|uniq -c|sort -rn -k1
iptables -A INPUT -p tcp -s 10.0.0.108 --dport 80 -j DROP
iptables -L -n
说明:采用-A封IP地址,会将策略放置在规则列表最后,可能会造成封不住
iptables -A INPUT -p tcp -s 10.0.0.108 --dport 80 -j DROP
iptables -L -n
说明:采用-I封IP地址,会将策略放置在规则列表最前面,会优先执行封IP策略

4. 流量匹配规则

匹配指定的协议

匹配指定协议外的所有协议

iptables -A INPUT ! -p tcp
iptables -I INPUT ! -p tcp -s 10.0.0.123 -j DROP
iptables -t filter -A INPUT ! -p udp -i eth0 ! -s 10.0.0.116 -j DROP

匹配主机源IP,目的IP

iptables -A INPUT -s 10.0.0.14
iptables -A INPUT -s ! 10.0.0.14
iptables -t nat -A PREROUTING -d 10.0.0.14
iptables -t nat -A PREROUTING ! -d 10.0.0.14

匹配网段

iptables -A INPUT -s 10.0.0.0/24
iptables -A INPUT ! -s 10.0.0.0/24

匹配单一端口

iptables -A INPUT -p tcp --sport 53
iptables -A INPUT -p udp --dport 53

匹配指定端口之外的端口

iptables -A INPUT -p tcp ! --dport 22
iptables -I INPUT -p tcp ! --dport 22 -s 10.0.0.123 -j DROP

匹配端口范围

iptables -A INPUT -p tcp --sport 22:80
iptables -I INPUT -p tcp --dport 21,22,23,24 -j ACCEPT	<- 语法错误
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP

实例测验1:测试匹配端口范围

[root@Jerome ~]# iptables -F
[root@Jerome ~]# iptables -t filter -A INPUT -p tcp --dport 20:1024 -j DROP
[root@Jerome ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP     tcp  --  0.0.0.0/0            	 0.0.0.0/0           tcp dpts:20:1024

# 测试结果:
01. SSH 22端口终端直接断掉
02. telnet连接80不通
[c:\~]$ telnet 10.0.0.8 80
Connecting to 10.0.0.8:80...

实例测验2:测试匹配列举端口范围

[root@Jerome ~]# iptables -F
[root@Jerome ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 80,90,100 -j DROP
[root@Jerome ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP     tcp  --  0.0.0.0/0            	 0.0.0.0/0           tcp dpts:20:1024
DROP     tcp  --  0.0.0.0/0            	 0.0.0.0/0           multiport dports 80,90,100
# 测试结果:
01. SSH 22端口终端直接断掉
02. telnet连接80不通
[c:\~]$ telnet 10.0.0.8 80
Connecting to 10.0.0.8:80...

匹配ICMP类型

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
http://www.cnitblog.com/yang55xiaoguang/articles/59581.html

匹配指定的网络接口

iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
记忆方法:
[!]	--in-interface		-i	input name[+]		network interface name ([+] for wildcard)
													指定匹配进入指定网络接口数据
[!]	--out-interface 	-o	output name[+]			network interface name ([+] for wildcard)
													指定匹配流出指定网络接口数据

匹配网络状态

-m state --state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
INVALID
meaning that the packet is associated with no known connection
NEW    
meaning that the packet has started a new connection, or otherwise associated with a connection 
which has not seen packets in both directions
ESTABLISHED
meaning that the packet is associated with a connection which has seen packets in both directions,
RELATED
meaning that the packet is starting a new connection, but is associated with an existing connection, 
such as an FTP data transfer, or an ICMP error.
说明:FTP服务是特殊的,需要配状态连接

允许关联的状态包通过(web服务不要使用FTP服务)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
说明:看电影出去WC或者接个电话,回来也要允许进入。

匹配网络限制策略

限制指定时间包的允许通过数量及并发数
-m limit --limit n/{second/minute/hour}: 
解释:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时
--limit-burst [n]
解释:在同一时间内允许通过的请求”n”为数字,不指定默认为5

iptables -I INPUT -s 10.0.1.0/24 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT

limit
This module matches at a limited rate using a token bucket filter.  A rule using this extension 
will match until this limit is reached (unless the ‘!’ flag is used).  It can be used in combination 
with the LOG target to give limited logging, for example.
这个模块使用令牌桶过滤器来匹配有限速率。使用这个扩展规则用来匹配可以到达的极限信息。
可以与日志结合使用,以提供极限的日志记录

--limit rate[/second|/minute|/hour|/day]
Maximum average matching rate: specified as a number, with an optional ‘/second’,/minute’,/hour’, 
or ‘/day’ suffix; the default is 3/hour.
最大平均匹配率,按照一定时间匹配

--limit-burst number
Maximum initial number of packets to match: this number gets recharged by one every time the limit  
specified above is not reached, up to this number; the default is 5.
要匹配的包的最大初始数量。这个数值可以通过积攒方式获得,在每一次指定的数值没有到达时,都会加一
直到获得指定的最大初始值数量。默认为5

6.2 企业配置iptables问题

1)	vpn服务(拨号到VPN服务器上,然后以VPN的内网地址去访问内部的机器)
2)	前端对外提供服务的机器SSH端口都做禁止外部IP访问限制,可以开启后端或者不对外提供服务的机器,保留SSH服务(更改root和SSH端口)。然后,平时先通过VPN连接跳板机,通过跳板机去连接其它机器。
3)	流量特别大的外网机器不要开防火墙,会影响性能,购买硬件防火墙

第七章 iptables企业环境配置步骤

环境配置主机防火墙的两种模式:(逛公园及看电影两种模式)
——>逛公园模式:
默认随便可以进出,对非法的分子进行拒绝
企业应用:企业配置上网网关路由
——>看电影模式:
默认没票进不去,花钱买票才能看电影
企业应用:服务器主机防火墙
很显然第二种模式更严格,更安全;逛公园及看电影两种模式本质就是防火墙的默认规则是允许还是拒绝。

1.清理当前所有规则和计数器

iptables -F
--flush			-F	[chain]					Delete all rules in chain or all chains
												删除一个链或所有链中的规则信息(不含默认规则)
提示:iptables -F 和 iptables --flush命令相同作用,既可以使用短格式也可以使用长格式

iptables -Z
--zero			-Z	[chain [rulenum]]			Zero counters in chain or all chains
												一个链或所有链的计数器清零

iptables -X
--delete-chain	-X	[chain]					Delete a user-defined chain
												删除用户自定义的链

# 实例演示:
[root@Jerome ~]# iptables -F
[root@Jerome ~]# iptables -X
[root@Jerome ~]# iptables -Z
[root@Jerome ~]# iptables -nvL
Chain INPUT (policy ACCEPT 56 packets, 3904 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 35 packets, 3168 bytes)
 pkts bytes target     prot opt in     out     source               destination

2. 配置允许SSH登陆端口进入

允许SSH服务端口开放连接(以下三种方式选择其一即可)
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
提示:此步是为了防止执行下面的步骤,把自己关在外面,除非你在本地主机处理,这步可以不做

3. 设置允许本机lo通讯规则

允许本机回环lo接口数据流量流出与流入
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

4. 设置默认的防火墙禁止和允许规则

# 设置默认DROP掉FORWARD,INPUT链,允许OUTPUT链
--policy			-P	chain target				Change policy on chain to target
												改变链上的最终默认规则策略

# 实例演示:
[root@Jerome ~]# iptables -P INPUT DROP
[root@Jerome ~]# iptables -P FORWARD DROP
[root@Jerome ~]# iptables -P OUTPUT ACCEPT
提示:此步完成后,所有的进入服务器的请求都将被阻挡。排除允许ssh可以连接登录策略
     设置了看电影的模式
[root@Jerome ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes	target    prot opt in		out		source			destination         
249 18124	ACCEPT  		tcp	--  *		*		10.0.0.0/24		0.0.0.0/0           tcp dpt:22 
2   176	ACCEPT	all		--  lo	* 		0.0.0.0/0			0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes	target    prot opt in		out		source			destination         

Chain OUTPUT (policy ACCEPT 11 packets, 1064 bytes)
pkts bytes	target     prot opt in	out		source			destination         
2   176	ACCEPT	all	--  *	lo		0.0.0.0/0			0.0.0.0/0

5. 开启信任的IP网段

# 允许IDC LAN/WAN和办公网IP的访问,及对外合作机构访问
iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT	<- 办公室固定IP段
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT		<- IDC机房的内网网段
iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT		<- 其它机房的内网网段
iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT		<- IDC机房的外网网段
iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT		<- 其它IDC机房的外网网段
提示:本步骤表示允许IDC LAN和办公网IP的无条件连接访问,因为是我们自己人,所以要信任通过
     但是对于外部用户还无法访问服务器的任何服务。

6. 允许业务服务端口对外访问(允许http服务无条件通过)

# 允许普通的外部服务80
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

7. 允许icmp类型协议通过

# 开启内外网利用icmp协议访问的策略
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 如果对内开,对外不开就用下面的方式
iptables -A INPUT -p icmp -s 172.16.1.0/24 -m icmp --icmp-type any -j ACCEPT

8. 允许关联的状态包通过(web服务不要使用FTP服务)

# 允许关联的状态包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
比喻:看电影出去wc或者接电话,回来也得允许进去

扩展教学:state参数信息说明
连接状态信息参数详细说明:

在这里插入图片描述

结论:通过其它服务器扫描配置防火墙策略服务器:
namp 10.0.0.19 -p 1-65535		<- 时间会长些

第八章 iptables永久保存配置信息

在上面的命令行配置中所有的命令结果仅仅存放于内存中,重启服务就会丢失。因此,我们有必要保存成配置文件。
方法一:永久保存iptables配置方法
[root@Jerome ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
方法二:永远保存iptables配置方法
[root@Jerome ~]# iptables-save >/etc/sysconfig/iptables
提示:/etc/sysconfig/iptables为iptables的默认配置文件路径
第一次保存可以覆盖,以后保存只能追加

第九章 iptables生产环境维护方法

生产中,一般第一次添加规则命令行或者脚本加入然后一次性保存成文件,然后以后就可以改配置文件管理。

[root@Jerome ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

生产中维护防火墙的方法:
日常调整规则信息

# 确认已有规则信息,并进行编辑修改
vim /etc/sysconfig/iptables						<- 编辑防火墙配置文件
-A INPUT -p tcp -m tcp --dport 873 -j ACCEPT		<- 编辑添加需要的规则

# 重新加载配置信息,使之生效
[root@Jerome ~]# /etc/init.d/iptables reload
iptables: Trying to reload firewall rules:                 [确定]
提示:规则策略需要进行测试,测试没有问题再放入配置文件中,命令行测试过再放入可以不用重启服务

自动控制异常流量

# 10.0.0.116这个机器总是攻击网站服务器或者在BBS里发垃圾帖子
# 手工封IP方法
iptables -I INPUT -s 10.0.0.116 -j DROP						<- 方法较粗暴,范围大
iptables -I INPUT -p tcp -s 10.0.0.116 --dport 80 -j DROP 	<- 方法较精细,范围小

# 自动封IP方法(分析web或应用日志,或网络连接状态封掉垃圾IP)
#!/bin/sh
/bin/netstat -an|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|\
head -10|grep -v -E ‘192.168|127.0|awk ‘{if ($2!=null && $1>4) {print $2}}>/home/shell/dropip
for i in $(cat /home/shell/dropip)
do
		/sbin/iptables -I INPUT -s $i -j DROP
    #-m limit --limit 20/min --limit-burst 6
		echo “$i kill at `date`” >>/var/log/ddos
done

第十章 iptabels生产环境脚本说明

见教案脚本信息。
【技巧】
	具备外网IP的服务器上,但是不对外提供服务最好要做源地址限制
	具备外网IP的服务器上,但是要对外提供服务不要做源地址限制,例如要开发80端口
【问题1】
企业硬件防火墙和iptables防火墙是否要同时用
可以同时使用
【说明】
企业硬件防火墙一般放在网关位置,相当于大厦的保安
但是,楼里的每个屋子还是需要有人或者锁门的(iptables)
【问题2】
IDC机房部署了硬件防火墙,我们的服务器可以不开防火墙吗
绝对不可以!大厦有保安,你的办公室就不锁门吗

第十一章 iptables实现共享上网方法

11.1 实现共享上网架构图规划

教室模拟企业上网拓扑结构在这里插入图片描述

对应实际企业办公上网场景逻辑图:在这里插入图片描述

对应实际IDC内网机器上网场景逻辑图:在这里插入图片描述

11.2 实验环境的配置需求准备

服务器网关需具备如下条件
1)	物理条件是具备双网卡,
建议eth0配置外网地址(这里是10.0.0.7,gw 10.0.0.254)
建议eth1配置内网地址(这里是172.16.1.7,内网卡不配GW)
	eth0:10.0.0.7
	MASK:255.255.255.0
	gw:10.0.0.254
	eth1:172.16.1.7
	MASK:255.255.255.0
	gw:不配
2)	确保服务器网关要可以上网(上网才能代理别的机器上网)。可以通过ping baidu.com或ping 223.5.5.5测试
3)	内核文件/etc/sysctl.conf里开启转发功能
在服务器网关 172.16.1.7机器上开启路由转发功能。编辑/etc/sysctl.conf修改内容为net.ipv4.ip_forward = 1,然后执行sysctl -p使修改生效。
	[root@Jerome ~]# sysctl -p
	net.ipv4.ip_forward = 1
4)	iptables的filter表的FORWARD链允许转发
	[root@Jerome ~]# iptables -P INPUT ACCEPT
	[root@Jerome ~]# iptables -P FORWARD ACCEPT
5)	不要filter防火墙功能,共享上网,因此,最好暂时停掉防火墙测试

11.3 防火墙内核模块确认加载

载入iptables内核模块,执行并放入rc.local中

[root@Jerome ~]# lsmod | egrep ^ip
iptable_filter				2793	1 
ip_tables					17831	2		iptable_nat,iptable_filter
ipt_REJECT				2351	2 
ipv6						336282	290		bridge,lockd

载入内核模块

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state			<- centos6版本系统中可忽略此模块的加载

# 模块加载完成后,在进行查看
[root@Jerome ~]# lsmod | egrep ^ip
iptable_nat				5923	0 
iptable_filter				2793	1 
ip_tables					17831	2		iptable_nat,iptable_filter
ipt_REJECT				2351	2 
ipv6						336282	290		bridge,lockd 
说明:实现共享上网必须要有iptables_nat模块

11.4 共享上网局域网机器配置

1)	局域网的机器有一块网卡即可,确保局域网的机器,默认网关设置了网关服务器的eth1内网卡IP(172.16.1.7)。把局域网机器的gateway设置为B的内网卡172网段的网卡IP,即172.16.1.19
2)	检查手段
分别ping网关服务器的内外网卡IP,都应该是通的就对了
3)	出公网检查除了PING网站域名外,也要PING下外网IP,排除DNS故障。
4)	ping 10.0.0.254 网关也是不通的
如上,请准备两台虚拟机A和B,其中A要有双网卡。A的内网卡的网段和B的网段一样。

网关服务器A:假设10.0.0.0/24为外部IP,172.16.1.0/24为内部IP

eth0:10.0.0.7
MASK:255.255.255.0
gw:10.0.0.254
eth1:172.16.1.7
MASK:255.255.255.0
gw:不配

内部服务器B:

eth1:172.16.1.19
MASK:255.255.255.0
gw:172.16.1.7		<- 网关B的内网卡IP

11.5 实验部署的测试步骤记录

  1. 登录B主机172.16.1.19看是否能访问外部页面(配好DNS)。如ping www.baidu.com
    正确结果:当前情况不通
  2. 在笔记本上分别测试telnet 172.16.1.7 22 看是否能连通。
  3. 在笔记本上分别测试ping 172.16.1.7 看是否能连通。
  4. 测试登录10.0.0.7看是否能访问外部页面。如ping www.baidu.com
  5. 在笔记本上分别测试telnet B 主机 172.16.1.19 22
  6. 在笔记本上分别测试ping 172.16.1.19 看是否能连通

11.6 根据逻辑图实现如下要求

1)	实现B可经过A,通过A主机访问互联网
提示:注意主机防火墙功能的影响。可以尝试在GW上先/etc/init.d/iptables stop后再加命令
2)	实际处理的局域网共享上网的NAT命令
网关服务器A实现局域网共享上网的两条命令

方法1:适合于有固定外网地址的环境

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT -to-source 10.0.0.7
-s	192.168.1.0/24				指定办公室或IDC内网网段
-o	eth0						为网关的外网卡接口
-j	SNAT --to-source 10.0.0.7		是网关外网卡IP地址

方法2:适合变化外网地址(ADSL)

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

为什么用POSTROUTING?
企业共享上网:

  1. 办公网共享上网(网关要有外网IP,否则用路由(zebra))
  2. IDC内网机器上网

企业上网到底需要不需要linux网关?

  1. 如果企业里有企业级路由器的情况下,可以不需要上网网关。使用网关只是解决路由器无法解决的需要(如 上网行为,IP及端口的映射 网关杀毒)
  2. IDC机房,大厦有固定外网IP的宽带,直接用网关解决上网及控制问题。

第十二章 iptables实现端口映射访问

把外部IP地址及端口映射到内部服务器地址及端口(和共享上网环境一样)
在10段主机可以通过访问A 10.0.0.7:80,即访问到172.16.1.19:9000,B提供的web服务,也可SSH(10.0.0.7:222--->172.16.1.7:52113),利用PREROUTING

B服务器配置web服务

1)	在172.16.1.19服务器上开启http服务监听9000端口,然后在网关服务器A上可以访问
curl http://172.16.1.19:9000  
Jerome
2)	具体转换命令
iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp -dport 80 -j DNAT -to-destination 172.16.1.9:9000
-d	10.0.0.7						指定提供访问的网关服务器外网接口地址
-dport	eth0					为网关的外网卡接口
-j DNAT --to-destination 10.0.0.7	将访问目标地址做映射

强调:有个别同学说网关服务要开启80服务,但不需要对外服务?
测试结果:网关开启httpd 80后
此时:来自80端口的请求转发依然会转发到后端的服务器。但是当iptables nat规则删除后,此时就到达了http服务监听的80端口,所以显示的是默认的页面。

企业应用场景:
1)	把访问外网IP及端口的请求映射到内网某个服务器及端口(企业内部)
2)	硬件防火墙,把访问LVS nginx 外网VIP及80端口的请求映射到IDC负载均	衡服务器内部IP及端口上(IDC机房的操作)

iptables常用企业案例:

  1. linux主机防火墙(表:FILTER 链:INPUT)
  2. 局域网机器共享上网(表:NAT 链:POSTROUTING)
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7
  3. 外部地址和端口,映射为内部地址和端口(表:NAT 链:PREROUTING)
    iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.8:9000

第十三章 iptables实现地址一对一映射

实现10网段外网IP和内网192段IP一对一映射
内部局域网生产映射案例:实现外部IP 1.1.1.1 一对一映射到内部server 10.0.0.8
网关服务器地址:eth0_1.1.1.2 eth1_10.0.0.254

a) 在路由器网关上绑定1.1.1.1,可以是别名的方式

# 配置别名IP实践:
ifconfig eth0:1 1.1.1.1 netmask 255.255.255.0 up
ifconfig eth0:1 1.1.1.1/24 up

b) 在路由器网关上配置地址映射策略

-A PREROUTING -d 1.1.1.1 -j DNAT --to-destination 10.0.0.8
-A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 1.1.1.1
-A POSTROUTING -s 10.0.0.0/255.255.240.0 -d 1.1.1.1 -j SNAT --to-source 10.0.0.254

# linux网关路由器实践操作
iptables -t nat -A PREROUTING -d 10.0.0.29 -j DNAT --to-destination 192.168.1.8
iptables -t nat -A POSTROUTING -s 192.168.1.8 -o eth0 -j SNAT --to-source 10.0.0.29
telnet 10.0.0.29 多端口测试
说明:实现192端机器和10网段机器互相访问

第十四章 iptables防火墙生产应用场景总结

1)	局域网共享上网
适合做企业内部局域网上网网关,以及IDC机房内网的上网网关(nat POSTROUTING)
2)	服务器主机防火墙
适合IDC机房具有外网IP的服务器(主要是fileter INPUT的控制)
3)	把外部IP地址及端口映射到局域网内部
可以一对一IP映射,也可以针对某一个端口映射
也可能是IDC把网站的外网VIP及网站端口映射到负载均衡器上(硬件防火墙nat PERROUTING)
4)	办公路由器+网关功能(zebra路由+iptables过滤及NAT+squid正向透明代理80+ntop/iftop/iptraf流量查看+tc流量控制限速)
5)	邮件的网关

问题1:生产环境应用

a) 用于办公网PC共享上网,所有内部电脑地址通过网关公网IP或PPPOE共享上网
局域网共享上网的两种方法:
方法1:适合于有固定外网地址进行共享上网:

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT -to-source 10.0.0.7
-s	192.168.1.0/24				指定办公室或IDC内网网段
-o	eth0						为网关的外网卡接口
-j	SNAT --to-source 10.0.0.7		是网关外网卡IP地址

方法2:适合变化外网地址(ADSL),当然有固定地址也可以用

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

b) IDC机房内网服务器通过网关出网
内部服务器时间同步及出网抓取内容等

问题2:生产环境应用

用于没有外网地址的内网服务器,映射为公网IP后对外提供服务,也包括端口的映射

问题3:IP地址一对一映射

用于没有外网地址的内网服务器,映射为公网IP后对外提供服务。例如:ftp服务需要一对一映射

共享上网封IP方法:

iptables -I FORWARD -s 10.0.0.26 -j DROP
iptables ${deal} FORDWARD -m mac --mac-source ${strIPmac} -j DROP

iptables防护墙应用:

  1. 主机防火墙
  2. 网关的应用(IP映射,端口映射)
  3. 过滤信息,监控限制流量及员工上网行为(squid正向代理缓存加过滤+ntop图形流量监控+tc流量限制+iptraf/iftop流量查看)
    如果IPTABLES的服务器升级内核可以实现类似squid的过滤的功能
  4. 网关装杀毒软件监听9999端口(网关杀毒)
    -A PREROUTING -i eth0 -d 211.167.253.109 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.10.6:9025
  5. 结合zebra配置企业级路由器

第十五章 iptables映射多个外网IP上网

iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16
iptables -t nat -A POSTROUTING -s 172.16.1.0/255.255.240 -o eth0 -j SNAT --to-source 124.42.60.103-124.42.60.106
iptables -t nat -A POSTROUTING -s 192.168.1.0/22 -o eth0 -j SNAT --to-source 10.0.0.241-10.0.0.249

解决问题:

  1. 2000人访问可能被封
  2. 65535 端口资源有限

第十六章 iptables防火墙内核优化相关参数

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

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

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.ip_local_port_range = 4000    65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
#以下参数是对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

cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close_wait
60

扩展知识:dmesg里面显示 ip_conntrack: table full, dropping packet.的错误提示.如何解决

C64:
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
参考资料:http://oldboy.blog.51cto.com/2561410/1336488

开启上述配置进行内核优化,可能出现如下报错信息
error: "net.bridge.bridge-nf-call-ip6tables"isan unknown key
error: "net.bridge.bridge-nf-call-iptables"isan unknown key
error: "net.bridge.bridge-nf-call-arptables"isan unknown key
这个错误是由于自动处理可载入的模块bridge没有自动载入
解决办法是自动处理可载入的模块ip_conntrack 

解决方式:
modprobe bridge
echo "modprobe bridge">> /etc/rc.local

附录一:Iptables防火墙计数器说明

如何统计某个应用的网络流量(包括网络流入量和网络流出量)问题,可以转换成如何基于端口号进行网络流量统计的问题。大部分网络应用程序都是传输层及以上的协议,因此基于端口号(tcp, udp)统计网络流量基本能覆盖到此类需求。

1. iptables防火墙模拟测试环境

利用iptables实现基于端口的流量统计是一种比较简单可行的方案。它可以对流经每一条规则的包数量和流量进行计数。例如要对常规的Web服务器进行流量统计,可以设置如下规则:
root@Jerome:~# iptables -A INPUT -p tcp --dport 80
root@Jerome:~# iptables -A OUTPUT -p tcp --sport 80

 第一条规则表示,在INPUT链上添加一条规则,该条规则对所有来自外部网络的、与本机80端口通信的请求有效,即网络流入量
 第二条规则相反,它用于统计从本机80端口发出的网络流量,即网络流出量。
因为我们的目的是统计流量,故此处可以省略ACCEPT或DROP之类的动作

2. iptables防火墙查看测试结果

查看流量计数时,只要加上-nvx参数即可:
root@Jeromme:~# iptables -nvx -L
Chain INPUT (policy ACCEPT 320 packets, 33045 bytes)
pkts     bytes target     prot opt in     out     source  	destination         
0        785  			tcp  --  *      *   		0.0.0.0/0   	0.0.0.0/0 		tcp dpt:80
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts     bytes target     prot opt in     out     source  	destination         
 
Chain OUTPUT (policy ACCEPT 311 packets, 33711 bytes)
pkts     bytes target     prot opt in     out     source  	destination         
0        1252			tcp  --  *      * 		0.0.0.0/0   	0.0.0.0/0 		tcp spt:80

iptables的-vx参数表示详细信息,可以以字节为单位显示包数量和网络流量,-n参数表示以数字方式表示ip地址和端口号等,不加的话 iptables会默认将ip反解为主机名,例如127.0.0.1用localhost表示,端口号显示为协议号,例如80显示成http, 5672显示成amqp。

3. iptables防火墙计数统计应用

利用iptables规则统计网络流量可以保证应用在关闭重启后统计数据不丢失,但是对于主机重启的情况,它就无能为力了,因为默认情况下主机重启 iptables规则会清空,即使使用开机任务等方式重建iptables规则,流量计数器也会清零。解决此类问题一个变通的方法是定期将网络流量值保存到文件,并清0重新计数,定期更新的时间越短,机器重启造成的流量计数丢失问题影响越小(特别涉及计费相关的业务)。

创建一个crontab任务,定期将流量统计追加至文件,例如:
root@Jerome:~# iptables -vxn -L >> file
也可以选择直接将流量值追加到文件:
root@Jerome:~# iptables -vxn -L | awk '{print $2}' >> file
当写入文件成功后,记得将流量值清0:
root@Jerome:~# iptables -Z
-Z参数支持指定链名称和规则索引号,例如下列命令表示清空INPUT链的第一条规则的流量计数器。
root@Jerome:~# iptables -Z INPUT 1
Reference:
[1] iptables man page: http://ipset.netfilter.org/iptables.man.html.

附录2. Iptables防火墙状态机制

1. 防火墙状态机制说明

状态机制是iptables中较为特殊的一部分,这也是iptables和比较老的ipchains的一个比较大的区别之一,运行状态机制(连接跟踪)的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙。状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。
在iptables上一共有四种状态,分别被称为NEW、ESTABLISHED、INVALID、RELATED,这四种状态对于TCP、UDP、ICMP三种协议均有效。下面,我们来分别阐述四种状态的特性。

NEW
meaning that the packet has started a new connection, or otherwise associated with a connection which has not seen packets in both directions
NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接的第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。在这里插入图片描述

ESTABLISHED
meaning that the packet is associated with a connection which has seen packets in both directions
ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。在这里插入图片描述

RELATED
meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error.
RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是 RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有关联的,如果没有在iptables的策略中配置RELATED状态,FTP-data的连接是无法正确建立的,还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。在这里插入图片描述

INVALID
meaning that the packet is associated with no known connection
INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西,因为防火墙认为这是不安全的东西在这里插入图片描述

2. 防火墙状态机制详述

每个状态相对于不同的第四层协议来讲,稍微有些区别,对于TCP协议来说,当防火墙收到第一个数据包,也就是SYN报文时,将该会话标记为NEW状态,在系统的/proc/net/目录下,可以查阅文件nf_conntrack,这是在内存空间里存放防火墙当前状态表的临时文件,对于NEW状态的记录如下:

cat /proc/net/nf_conntrack
tcp 6 117 SYN_SENT src=10.0.0.8 dst=10.0.0.7 sport=1031 dport=22 [UNREPLIED] src=10.0.0.7 dst=10.0.0.8 sport=23 dport=1031 use=1

# 模拟现实以上信息方法:在远程登录主机上配置以下策略
iptables -A OUT -p tcp --sport 22 -d 10.0.0.8 -j DROP

从上面的记录可以看出,SYN_SENT状态被设置了,这说明连接已经发出一个SYN包,但应答还没发送过来,这可从[UNREPLIED]标志看出,当服务器端回应了SYN/ACK包后,状态表改写为

tcp 6 57 SYN_RECV src=10.0.0.8 dst=10.0.0.7 sport=1031 dport=22 src=10.0.0.7 dst=10.0.0.8 sport=22 dport=1031 use=1

# 模拟现实以上信息方法:在防火墙主机上配置以下策略
iptables -A INPUT -i eth0 -s 10.0.0.7 -m state --state ESTABLISHED -j DROP

现在我们已经收到了相应的SYN/ACK包,状态也变为SYN_RECV,这说明最初发出的SYN包已正确传输,并且SYN/ACK包也到达了防火墙。 这就意味着在连接的两方都有数据传输,因此可以认为两个方向都有相应的回应。

接下来,TCP三次握手的随后一个报文ACK包也到达了防火墙,防火墙上的状态表变成了:
tcp 6 431999 ESTABLISHED src=10.0.0.8 dst=10.0.0.7 sport=1031 dport=22 src=10.0.0.7 dst=10.0.0.8 sport=23 dport=1031 use=1

附录3. Iptables防火墙企业实战考题

1. 企业实战考题一总结

写一个脚本解决DOS攻击生产案例(请用至少两种方法实现)
提示:根据web日志或者网络连接数,监控当某个IP并发连接数或者短时间内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:

iptables -I INPUT -s 10.0.1.10 -j DROP
问题处理思路:
01. 取到IP和IP访问次数
02. 统计IP访问次数是否大于100
03. 执行防火墙命令

根据思路编写脚本:

[ -f /etc/init.d/functions ] && . /etc/init.d/functions

function ipt(){
awk{print $1}’ /server/scripts/access.log|sort|uniq -c|sort -nr -k1 >/tmp/tmp.log

exec < /tmp/tmp.log
while read line
do
		IP=`echo $line|awk{print $2}`
		if [ `echo $line|awk{print $1}` -ge 100 -a `iptables -L -n|grep “$IP”|wc -l` -lt 1`];then
			iptables -I INPUT -s $IP -j DROP
			RETVAL=$?
			if [ $RETVAL -eq 0 ];then
				action “iptables -I INPUT -s $IP -j DROP” /bin/true
				echo “$IP” >> /tmp/ip_$(date +%F).log
			else
				action “iptables -I INPUT -s $IP -j DROP” /bin/false
			fi
		fi
done
}
function del(){
exec < /tmp/ip_$(date +%F -d ‘-1day’ ).log
while read line
do
		if [ `iptables -L -n|grep$line|wc -l` -ge 1 ];then
			iptables -D INPUT -s $line -j DROP
		fi
done

main(){
flag=0
while true
do
		sleep 180
		((flag++))
		ipt
		[ $flag -ge 480 ] && del && flag=0   #表示480*180秒,一天后删除封的IP地址信息
done
}
main

总结

以上便是有关iptables的所有涉及,参考了很多资料,然后大多数来自教材,本文仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeromeyoung666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值