Iptables

一、防火墙基础知识

1、防火墙是什么

工作于主机或网络边缘,对于进出的定义的报文的规则做检查,进而对被规则匹配到的报文作为相应处理的

套件

2、防火墙的作用

防火墙的作用主要是防***,防恶意***,有点类似于acl机制。主要针对服务器或者保护局域网中的主机。

防火墙主要作用是不防病毒和***的,但是有一定的防护作用。

3、防火墙的分类

主机防火墙:工作在主机上的软件防火

网络防火墙:工作在网络边缘保护局域网,在网络中检测 ip 首部 tcp首部 帧首部

应用层网关防火墙:让消息报文进入到防火墙检测应用层报文,过沥恶意,优点,比较安全,缺点效力较低

ids  ***检测系统   监控系统、如果有***或者恶意的马上处理掉

ips  ***防御系统   翁中捉鳖  根据防tcp/udp通信协议,可以让它进到防火墙中,但是他出不了防火墙,过

沥了它的响应报文

honeypot  蜜罐      诱捕  服务器伪装了它的真实端口,故意开放假的端口让来***的报文消息有去无回

4、Iptables  liunx 防火墙组件

   iptables  不是防火墙,是一套组件是工作在网络层的防火墙组件

5、防火墙报文工作原理图

wps_clip_p_w_picpath-26630

6、写规则时应该注意什么

流向:

与本机进程通信:

流入: -->PREROUTING-->INPUT
流出:  -->OUTPUT-->POSTROUTING
经由本机转发:
请求:-->PREROUTING-->FORWARD-->POSTROUTING
响应:-->PREROUTING-->FORWARD-->POSTROUIING

规则中如果限定原地址、目标地址、源端口、目标端口等与流向相关的设定

写规则时要注意:

服务端:先进后出

客户端:先出后进

客户端端口是随机的,因此大多数场景下无须限定

iptables --> 语法检查 --> netfilter(执行)

规则立即生效

7、表和链的概念

四表    raw   mangle   nat     filter

表是容器,表是由链组成的,表有优先级之分,优先级排列是  raw   mangle   nat     filter,

iptables在过沥报文是先由表到链匹配规则,一张表一张表的匹配,同一张表中的链的规则如果相似,或者

冲突,最后生效的是排在链上面靠前的那条规则。

五钩: 对报文检测的条件卡哨、报文来了、根据规则条件来判断报文允不允许通过。实际内置在linux内核中

的五个函数,也叫链,链上可以写规则。linux开机默认启动(kernel 2.2以上版本才有)

作用

Raw 目标是关闭nat表上启用的连接追踪功能

mangle 修改tcp/ip报文首部的某些信息 比如ttl

nat  地址转换,启用connection_track;

Filter  过滤,定义是否允许通过防火墙

PREROUTING:路由前

INPUT:到达本机内部的报文必经之路

FORWARD:由本机转发的报文必经之路

OUTPUT:由本机发出的报文的必经之路

POSTROUTING:路由后

8、表和链的关系图

filter:   INPUT,   FORWARD,   OUTPUT
nat:   PREROUTING(SNAT),  POSTROUTING(DNAT),  OUTPUT
mangle:    PREROUTING,    INPUT,   FORWARD,   OUTPUT,   POSTROUTING
raw:   PREROUTING,    OUTPUT

9、写规则的语法

wps_clip_p_w_picpath-16532

写规则:先确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件

二、常见iptables规则的书写

方向Ssh服务
白名单 安全
先全部堵上,在发通行证     一般******可以堵截到,没发通行证给他
反弹***不能堵截,因为它已经在你的主机之中,要堵的话,只能在OUTPPUT链上堵截
黑名单 不安全
先全部放行,在拉黑部分
写规则时的角度
客户端时   要先出后进   比如  dns 解析
服务端时   要先进后出   限制别人来访问自己

(一)、ssh的设置

全局是做白名单

本机ip地址是 192.168.1.146

要求只允许允许192.168.0.0的网段来连接ssh服务

Iptables  -A INPUT -s 192.168.0.0/24 -d 192.168.1.146 -p tcp -dport 22 -j ACCEPT
Iptables  -A OUTPUT -s 192.168.1.146 -d 192.168.0.0/24 -p tcp -sport 22 -j ACCEPT
Iptables  -P  INPUT  DORP
Iptables  -P  OUTPUT  DORP
Iptables  -P  FORWARD  DORP

1、做放行规则时是一定要有进有出,不然放行不成功

2、记住在做默认策略是一定要先放行ssh 服务,不然你没放行ssh,就先DORP,你连不上去

3、修改规则时,一定不能修改你的ssh为DORP,或者删除,不然,你连不上你的ssh,默认策略是DORP,

不允许任何人连接进来的

4、清除所有规则时一定要先放行ssh默认策略,不然你清除了你ssh连接的规则,策略却是拒绝的,你依然

连接不了

以上错误如果犯了的话

解决方法

1、虚拟机的话直接   service   iptables  restart
2、真实环境中的话最好写一个任务计划
Crontab -e  5 * * * * service iptables restart
3、打电话给机房操作
几个比较重要的操作命令
Wath  -n  1 ‘Iptables -L -n  -v’ 刷新查看iptables数据包的情况
查看规则排列   iptables -L -n -v --lines-number
修改规则为第几条 iptables -t 表 -R  链   1-n  规则
I 和 A 的区别
I 默认不加序号为插入第一行
A 默认为添加规则到链的最后一条

(二)、开启本机内网的icmp

Iptables -I INPUT -i lo -j ACCEPT
Iptables -I OUTPUT -i lo -j ACCEPT
限制icmp的
Iptables  -A INPUT -s 192.168.0.0/24 -d 192.168.1.146 -p icmp  -dport  -j ACCEPT
Iptables  -A OUTPUT -s 192.168.1.146 -d 192.168.0.0/24 -p icmp  -sport  -j ACCEPT

允许自己可以ping别人,别人不能ping自己

--icmp-type 8  请求
--icmp-type 0  应答
Iptables  -A OUTPUT -s 192.168.1.146 -p icmp --icmp-type 8 -j ACCEPT
Iptables  -A  INPUT -d 192.168.1.146 -p icmp --icmp-type 0 -j ACCEPT
DNS
Iptables  -A OUTPUT -s 192.168.1.146 -p tcp -dport 53 -j ACCEPT
Iptables  -A INPUT -d 192.168.1.146 -p tcp -sport 53 -j ACCEPT

多端口规则 -m multiport

--dports

--sports

对用户开启ssh和web服务

# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport  --dports 22,80 -j ACCEPT
# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport  --sports 22,80 -j ACCEPT
IP地址范围规则 -m iprange
--src-range
--dst-range
允许172.16.100.1-172.16.100.100的网段的用户来访问telnet
# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.
100.100 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.
16.100.100 -j ACCEPT
(三)、显示扩展模块
字符串匹配string:
字符串匹配,能够检测报文应用层中的字符串
字符匹配检查高效算法
kmp, bm
专用选项:
--algo {kmp|bm}  算法
--string "STRING"   匹配到的子串
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串; 另一只格式的子串
1、前提允许用户来访问web
2、白名单中加黑名单要放在web前面,不然他不显示
3、可以让用户来请求进来,但是防火墙不给以回应
# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
拒绝用户访问有“sex”子串的服务
基于时间做访问控制 time: 
专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]  起始时间
--datestop  结束时间
--timestart hh:mm[:ss] 一天的起始时间
--timestop hh:mm[:ss] 一天的结束时间
--weekdays day[,day] 一周的那几天
Mon,  Tue,  Wed,Thu,  Fri,Sat,Sun
# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40
--weekdays Mon,Tue,Thu,Fri -j REJECT
拒绝用户在一周的 Mon,Tue,Thu,Fri早上8点20 到晚上18点40访问服务器172.16.100.7的web服务  由于进
来的已经拒绝了,出去的也就不用拒绝,再者默认策略是拒绝的
连接数限制,对每IP所能够发起并发连接数做限制; connlimit:
专用选项:
[!] --connlimit-above [n]
例子:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP 
只允许用户连接ssh的数量最多为两个
速率限制   limit: 
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
例子:
# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5
-j ACCEPT
只允许用户ping  icmp请求每分钟20个回应 ,如果从来没有ping过的用户允许加5个回应

三、基本命令解释

1、规则的工作机制和保存

iptables --> 语法检查 --> netfilter(执行)
规则立即生效
切记:先添加放行自己会话
规则文件:/etc/sysconfig/iptables
保存启用中的规则于规则文件中:
# iptables-save > /etc/sysconfig/iptables
# service iptables save
生效规则文件中的规则:
# iptables-restore < /etc/sysconfig/iptables
# service iptables restart

2、执行的操作:清空现有规则,读取并生效规则文件中的规则

COMMAND:
链:
-F:flush, 清空规则链;
-N:new, 自建一条链
-X: delete, 删除一条自定义的空链
-Z:zero,计数器归零
-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;
-E:重命名自定义链
3、链中的规则:
-A  添加一条规则
-I   插入一条规则
-D   删除一条规则
-R   修改一条规则
4、查询:
-L:以列表方式显示
-n: 数字格式显示主机地址和端口;
-v: 详细格式,-vv, -vvv
--line-numbers: 显示规则编号
-x: exactly,不要对计数器的计数结果做单位换算,而显示其精确值

wps_clip_p_w_picpath-3481

wps_clip_p_w_picpath-9135

iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标

5、匹配条件

1)通用匹配:
-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;
--src, --source
-d 地址:指定报文目标IP地址匹配的范围;
--dst, --destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;
-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD
-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING
2)扩展匹配
(1)隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
-p tcp: 指定tcp协议
-p udp: 指定udp协议
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目标端口
--tcp-flag 要检查标志位列表(用逗号分隔)  必须为1的标志位列表(逗号分隔)
例如:--tcp-flags syn,ack,rst,fin synall none
--syn
-p udp [-m udp]
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0: echo-reply, ping响应
8: echo-request, ping请求
(2)显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;
-m 扩展模块名称
模块:iptables,netfilter各拥有一部分代码
multiport: 多端口匹配
可用于匹配非连续或连续端口;最多指定15个端口;
专用选项:
state: 状态检查
专用选项:

--state 的概念

连接追踪中的状态:是iptables的一个模块,有一个模板,能够记录用户来连接服务的基本状态。 他可以记录tcp、udp、icmp等多种协议的状态连接

NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接

应用注意

进来的连接只允许的状态有  new  established 这两种状态

出去的连接状态只允许有   established

开启连接状态 时  应该注意  不能再服务器压力比较大的机子上开启

要开启的话要修改连接追踪的设置

好处优化防火墙的规则条目

实际应用 放行ssh  web  ping

Iptables -A INPUT -d 192.168.1.146 -m multiport --dports 22,21,80 -m  state --state NEW -j ACCEPT
Iptables -I INPUT -m state  --state   ESTABLISHED -j ACCEPT
Iptables -I OUTPUT -m state  --state  ESTABLISHED -j ACCEPT
Iptables  -P  OUTPUT  DORP
Iptables  -P  FORWARD  DORP
Iptables -A INPUT -d 192.168.1.146 -p --icmp-type 8 -j  ACCEPT
Modprobe  nf_conntrack-ftp
Iptables -A INPUT -d 192.168.1.146 -p tcp  -m state --state RELATED -j ACCEPT
Iptables -R OUTPUT 1 -s 192.168.1.146 -p tcp  -m state --state ESTABLISHED RELATED -jACCEPT

写规则的优化

优化规则:尽量减少规则条目,彼此不相关的匹配机会较多放在上面,属于同一功能匹配规更严格放在上面;

配置修改

调整连接追踪功能所能容纳的连接的最大数目:

/proc/sys/net/nf_conntrack_max
当前追踪的所有连接
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:

放行被动模式下的FTP服务:

1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模块:nf_conntrack_ftp
2、放行请求报文:
(1)放行NEW状态对21端口请求的报文;
(2) 放行ESTABLISHED以及RELATED状态的报文
3、旅行响应报文:
(1) 放行ESTABLISHED以及RELATED状态的报文
处理目标:
内置目标:
DROP 删除
REJECT 丢弃返回信息
ACCEPT  访问
创建自定义链:
iptables [-t table] -N chain
删除自定义且0引用的空链
iptables [-t table] -X chain
重命名自定义链:
iptables [-t table] -E old_name new_name
Iptables -t fitler -N http_in
Iptables -A http_in -d 192.168.1.7 -p tcp --dport 80 -m iprange --src-range  192.168.100.1-
192.168.100.100 -j DORP
Iptables -A http_in -d  192.168.1.7 -p tcp --dport 80 -m state --state NEW -j ACCEPT
Iptables -A INPUT -m state  --state  ESTABLISHED -j ACCEPT
Iptables -t fitler -N ssh_in
Iptables -A ssh_in -d 192.168.1.146 -p tcp --dport 22 -m state NEW -j ACCEPT
Iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

子链调用主链

Iptables -A INPUT -d 192.168.1.146 -p tcp --dport 80 -j http_in  实现跳转
子链处理不了的返回给主链
Iptables -A http_in -j RETURN
Iptables -A INPUT -d 192.168.1.146 -p tcp --dport 22 -j ssh_in
Iptables -P INPUT DORP
Iptables -P OUTPUT DORP
Iptables -P FORWARD DORP

便于管理的话,可以直接直接清除那条链

不过注意要先放行默认策略

也可以不清空,保存在某个地方

Iptables-save > /root/iptables

删除自定义的空链,且0引用

Iptables  -t -X chain

有引用的话,要删除规则

Iptables -t  tables  -D  chain   xx

以上的都是主机防火墙

四、网络防火墙

实际应用中是主机防火墙和网关防火墙配合使用

环境搭建好

Vmware1 :172.16.1.143/16  客户端

Vmware2 :eth0  192.168.1.146/25   eth1  172.16.1.140/16  网关防火墙

Vmware3 :eth0  192.168.1.149/25  web服务

准备环境的搭建

wps_clip_p_w_picpath-9840

Vmware1  设置ip和默认路由

wps_clip_p_w_picpath-22994

Vmware2

Ip设置

wps_clip_p_w_picpath-11432

网卡设置

wps_clip_p_w_picpath-19816

开启路由转发

Vim /etc/sysctl.conf

wps_clip_p_w_picpath-16085

重启生效

Sysctl -p

Vmware3

Ip设置

wps_clip_p_w_picpath-20791

网卡设置

wps_clip_p_w_picpath-259

环境测试

wps_clip_p_w_picpath-11257

Vaware1 测试网页

wps_clip_p_w_picpath-28280

把iptables中的规则给删除避免对实验的影响

五、网关防火墙设置

1、[root@www ~]# iptables -P FORWARD DROP 防火墙关闭转发功能
客户端访问不了
[root@www ~]# iptables -A FORWARD -s 192.168.1.149 -j ACCEPT
[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -j ACCEPT


再用防火墙做规则就可以访问啦

开发远程web和ssh

清空上面两条

[root@www ~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -p tcp --dport 80 -m state --state NEW -j ACCEPT
[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -p tcp --dport 20 -m state --state NEW -j ACCEPT

安全连接放开了可以打开了网页服务和ssh

开放远程ftp

[root@www ~]# iptables -A FORWARD -d 192.168.1.149 -p tcp --dport 21 -m state --state NEW -j ACCEPT
[root@www ~]# Modprobe  nf_conntrack-ftp
[root@www ~]#iptables -R FORWARD 1 -p tcp  -m state --state ESTABLISHED RELATED -j ACCEPT

自动装载模块

wps_clip_p_w_picpath-17798

网络防火墙SNAT及DNAT设置

SNAT

实验 工作示意图如上

环境搭建现在反过来

Vmware1 做web

Vmware2 做snat转发  开启转发

Vmware3 做客户端

Ip 还是原来的

Vmware3测试

wps_clip_p_w_picpath-27313

Vmware2 做snat

[root@www ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.1.140

来自192.168.1.0这个网络的源地址都把他的源地址改为172.1.16.140 适用 于静态ip转发

[root@www ~]# iptables -t nat -I POSTROUTING 1 -s 192.168.1.0/24 -j MASQUERADE 适用于静态自动转发

Vmware3 访问vmware1测试转发

wps_clip_p_w_picpath-10846

Vmware1查看转发结果

wps_clip_p_w_picpath-4924

DNAT 转发和上面环境一样不过把防火墙规则清除

防火墙上添加规则

Vmware2

[root@www ~]# iptables -t nat -A PREROUTING -d 172.16.1.140 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.149

Vmware1访问vmware3

Vmware3上日志测试结果

wps_clip_p_w_picpath-163