iptables 防火墙实现
来源:互联网 发布:淘宝号小号查询 编辑:程序博客网 时间:2024/05/22 01:50
防火墙是什么?:
我们要讲防火墙,首先要了解什么是防火墙,其实防火墙就是设定一些规则来管制过滤进入到我们网 络内的主机IP数据包的一种机制!它可以限制你的文件传输服务 (FTP)可以限制主机可以通过的服务;还可以限制主机对外联等等。。。防火墙分为硬件防火墙和软件防火墙。我们下边说的为软件防火墙。
我们要知道,防火墙的规则是建立在内核上的,内核有提供Netfilter包过滤机制,netfilter的机制内核自建的,那我们又该如何操纵它呢?Linux6.x上为我们提供了iptables这个工具来实现对防火墙规则的设定,并提交给Netfilter来执行。iptables:用户空间的工具。写规则,并自动发往netfilter,netfilter:接收并生效规则。
[root@station153 ~]
# rpm -ql iptables 查看安装生成的文件
/
bin
/
iptables
-
xml
-
1.4
.
7
/
etc
/
rc.d
/
init.d
/
iptables iptables对应的启动服务
/
etc
/
sysconfig
/
iptables
-
config 对应的开机要配置参数
/
lib64
/
libip4tc.so.
0
-
1.4
.
7
iptables所需的库文件
/
lib64
/
xtables
/
libipt_CLUSTERIP.so
/
sbin
/
iptables
-
1.4
.
7
iptables的启动程序
/
sbin
/
iptables
-
restore
-
1.4
.
7
iptables的重载规则程序
/
sbin
/
iptables
-
save
-
1.4
.
7
iptables的保存规则的程序
/
usr
/
share
/
doc
/
iptables
-
1.4
.
7
iptables相关文档
/
usr
/
share
/
man
/
man8
/
iptables
-
1.4
.
7.8
.gz man文档
要学习防火墙首先我们要了解数据包进来出去的过程。
数据包在进入到我们的网卡没有经过路由决策时有PREROUTING链,在经过路由决策后可以经过INPUT链进入到本机应用层或者通过转发经由FORWARD链直接出去而不进入本机应用层,出去还需要经过POSTROUTING链,而进入本机后出来到达路由决策前具有OUTPUT链。
链是数据包流向经过的路径,那么我们如何使用这些链呢,防火墙规则里有多个表,而我们的链就是放在表里的规则上的。
规则的功能分为以下4种:
filter: 过滤功能,定义是否允许通过防火墙,INPUT,OUTPUT,FORWARD都需要用到过滤的功能
nat: 地址转换,启用connection_track模块;PREROUTING,POSTROUTINIG,FORWARD都需要用到转换的功能
mangle: 用于对数据包相关字段的修改;PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING都可以用到
raw: 目标是关闭nat表上启用的连接追踪功能;PREROUTING, OUTPUT都需要用到此功能
基本语法:
iptables [-t TABLE] COMAND CHAIN CRETIRIA -j TARGET
iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标
匹配条件:
filter
进入本机路由后进入本机路由前出去
接受丢弃PNAT
-p [-m] tcp:多端口匹配!可取反
[!] --source-ports,或 --soprt port[,prot:port]
--destination-ports,或 --dports
--ports
例子:
# 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字符串匹配,能够检测报文应用层中的字符串
字符匹配算法:kmp,bm
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING" :HEX_STRING为编码成16进制格式的字串
例子:
# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP基于时间做访问控制
专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
例子:
# 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
连接数限制,对每IP所能够发起并发连接数做限制;
专用选项:
[!]--connlimit-above N 小于N的连接数允许,大于拒绝
例子:
#iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP--state
状态检查
连接追踪中的状态检查:
NEW:新建立一个会话
ESTABLISHED:已建立的连接
RELATED:有关联关系的连接
INVALID:无法识别的连接
/proc/sys/net/nf_conntrack_max:调整连接追踪功能所能容纳的连接的最大数目
/proc/net/nf_conntrack:当前追踪的所有连接
/proc/sys/net/netfilter/*:不同协议或连接类型追踪时的属性
放行被动模式下的FTP服务:
1,装在模块/lib/modules/KERNER_VERSION/kernel/net/netfilter/
模块:nf_conntrack_ftp
2,放行请求报文:
(1)放行NEW状态对21端口请求的报文
(2)放行ESTABLISHED以及RELATED状态的报文
3,旅行相应报文:
(1)放行ESTABLISHED以及RELATED状态的报文网卡硬件地址:
选项参数:--mac-source 来源诸暨的MAC
例子:
#iptables -A INPUT -m mac
查看iptables的规则:
iptables [-t tables] [-L] [-nv]
[root@www~]
# iptables -L -nv
Chain
INPUT
(policy ACCEPT
131K
packets,
15M
bytes) Chain表示这就是
INPUT
链,policy是默认规则ACCEPT接受
pkts bytes target prot opt
in
out source destination
Chain FORWARD (policy ACCEPT
0
packets,
0
bytes) Chain表示这就是OUTPUT链,policy是默认规则ACCEPT接受
pkts bytes target prot opt
in
out source destination
Chain OUTPUT (policy ACCEPT
7962
packets,
1472K
bytes) Chain表示这就是FORWARD链,policy是默认规则ACCEPT接受
pkts bytes target prot opt
in
out source destination
-L -v选项各项含义:
设置iptables的默认策略
iptables [-t tables] -P [INPUT|OUTPUT|FORWARD] [ACCEPT|DROP|REJECT]
[root@www ~]
# iptables -P FORWARD DROP
[root@www ~]
# iptables -L -n
Chain
INPUT
(policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP) FORWARD的默认策略变为DROP
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
创建一条新的规则链基于IP
iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源 IP/网域] [-d 目标 IP/网域] -j [ACCEPT|DROP|REJECT|LOG]
例子:我们创建一条拒绝192.168.1.111的IP通过eth0网口来访问本机
创建一条新的规则链基于端口
iptables [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源 IP/网域] [--sport 端口范围] [-d 目标 IP/网域] [--dport 端口范围] -j [ACCEPT|DROP|REJECT]
例子:我们创建一条不许tcp协议网段为172.16.0.0的来访问本机的80端口。
iptables -A INPUT -p tcp -s 172.16.0.0/16 -d 192.168.1.123 --dport 80 -j DROP
也可以基于数据包类型:-p imcp
iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
常用的有 0: echo-reply, ping响应 、 8: echo-request, ping请求
拒绝被别人ping的话可以:
[root@www~]
# iptables -I INPUT -p icmp --icmp-type 8 -j DROP 拒绝ping插入第一条
[root@www~]
# iptables -L -nv
Chain
INPUT
(policy DROP
0
packets,
0
bytes)
pkts bytes target prot opt
in
out source destination
0
0
DROP icmp
-
-
*
*
0.0
.
0.0
/
0
0.0
.
0.0
/
0
icmp
type
8
0
0
DROP
all
-
-
eth0
*
192.168
.
1.111
192.168
.
1.123
0
0
DROP tcp
-
-
*
*
172.16
.
0.0
/
16
192.168
.
1.123
tcp dpt:
80
628
46744
ACCEPT tcp
-
-
*
*
0.0
.
0.0
/
0
0.0
.
0.0
/
0
tcp dpt:
22
0
0
ACCEPT
all
-
-
*
*
0.0
.
0.0
/
0
0.0
.
0.0
/
0
state RELATED,ESTABLISHED
Chain FORWARD (policy DROP
0
packets,
0
bytes)
pkts bytes target prot opt
in
out source destination
Chain OUTPUT (policy ACCEPT
17
packets,
1564
bytes)
pkts bytes target prot opt
in
out source destination
创建一条新规则基于状态
iptables -A INPUT [-m state] [--state 状态]
例子:创建一条规则,进入本机已建立的会话和与会话有关联关系的给与放行,其他的全拒绝
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
当然如果你在远程连接本机的话,你需要先放行自己的SSH会话,再将默认INPUT设为DROP,最后放行上边这条规则。
[root@www~]
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@www~]
# iptables -P INPUT DROP
创建一条自定义防火墙规则。
iptables [-t table] -N Chain
自定义链只可被应用。
iptables -t filter -N WEBChain
并被tcp 80端口出去的调用此规则。规则是拒绝192.168.1.123从tcp 80端口出去。
做SNAT转发,修改数据包来源报头:主要应付内部主机连接外网的方式
内部请求出去时:客户端所发出的封包表头中,来源会是172.16.18.5,然后传送到 NAT 这部主机; NAT 这部主机的内部接口 (172.16.18.6) 接收到这个封包后,会主动分析表头数据, 因为表头数据显示目的并非本机,所以开始经 过路由, 将此封包转到公网 IP 处(192.168.1.123); 主机透过 iptables 的 NAT table 内的 Postrouting 链将封包表头的来源伪装成为本机公网IP ,并且将两个不同来源 (172.16.18.5 及 公网IP) 的封包对应写入暂存内存当中, 然后将此封包传送出去了;
接受返回数据包时:在 Internet 上面的主机接到这个封包时,会将响应数据传送给那个公网IP的主机;当 NAT 服务器收到来自 Internet 的数据后,会分析该数据包的序号,并比对刚刚记录到内存当中的数据, 由于发现该封包为后端主机之前传送出去的,因此在 NAT Prerouting 链中,会将目标 IP 修改成为后端主机(172.16.18.5),然后发现目标已经不是本机, 所以开始透过路由分析封包流向;将数据传送到172.16.18.6 这个内部接口,然后再传送到最终目标主机上去!
做DNAT转发:内部作为服务器让外部网络访问。也就是目标地址转化
外部主机想要连接到目的端的WEB服务,则必须要连接到我们的 NAT 服务器上; 我们的 NAT 服务器设定 port 80转发 ,所以当 NAT 服务器接到这个封包后(源地址192.168.1.34|目标地址192.168.1.123), 会将目标地址在PREROUTING转为172.16.18.5,源地址不变 ,且将该封包相关信息记录下来,等待内部服务器的响应;172.16.18.5 会响应数据给192.168.1.34 ,当这个响应经过POSTROUTING时伪装源地址为192.168.1.123,目标地址不变(192.168.1.34)传送出去!
RAW表
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了. RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。 实际测试发现filter链仍然处理一些NOTRACK的包,但没有进行connect tracking,所以filter链条里必须将UNTRACKED状态的包放行
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。
所以解決方法一般有两个:
(
1
) 加大 ip_conntrack_max 值
vi
/
etc
/
sysctl.conf
net.ipv4.ip_conntrack_max
=
393216
net.ipv4.netfilter.ip_conntrack_max
=
393216
(
2
): 降低 ip_conntrack timeout时间
vi
/
etc
/
sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established
=
300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait
=
120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait
=
60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait
=
120
写防火墙规则时要注意:
(1)服务端:先进后出
(2)客户端:先出后进
(3)客户端端口是随机的,因此大多数场景下无须限定
iptables --> 语法检查 --> netfilter
规则立即生效
切记:先添加放行自己会话
规则文件:/etc/sysconfig/iptables (iptables文件可能不存在)
保存启用中的规则于规则文件中:
1、# iptables-save > /etc/sysconfig/iptables
2、# service iptables save
生效规则文件中的规则:
1、# iptables-restore < /etc/sysconfig/iptables
2、# service iptables restart
执行的操作:清空现有规则,读取并生效规则文件中的规则
防火墙简单设计:
(1)规则清零:清除所有已有规则 (iptables -F)
(2)设置默认策略:INPUT自定义链为DROP ,其他的默认ACCEPT.
(3)信任本机:由于lo对本机来说是相当重要的,因此lo必须设置为信任设备
(4)回应数据包:让本机发出的请求的相应包可以进入本机。(ESTABLISHED,RELATED)
(5)信任用户:给出你需要信任的用户,也可以没有。
写一个bash脚本来执行自己的防火墙规则
#vim iptablescript.sh
#!/bin/bash
#
#1,清除规则
iptables -F
iptables -Z
#2,设置默认策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#3,制定各项规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 172.16.0.0
/16
-j ACCEPT
#4,写入防火墙配置文件。
service iptables save
#或者 iptables-save > /etc/sysconfig/iptables(文件可能不存在)
#一个简单的防御防火墙
*ftp服务21号端口开启时开放RELATED关联时,必须装载nf_conntrack_ftp
---------------------------------------END--------------
- iptables 防火墙实现
- iptables实现网络防火墙(一)
- iptables实现网络防火墙(一)
- iptables实现网络防火墙(一)
- 用iptables实现包过虑型防火墙
- Android 网络防火墙的实现 Iptables解决方案
- 用Iptables实现Linux的防火墙功能
- Android 网络防火墙的实现-Iptables
- android网络防火墙的实现iptables解决方案
- Android 网络防火墙的实现 Iptables解决方案
- Android 网络防火墙的实现 Iptables解决方案
- iptables实现网络防火墙及地址转换
- iptables 实现主机防火墙(四表五链)
- Android 网络防火墙的实现 Iptables解决方案
- Linux 防火墙iptables 学习笔记(四)iptables实现NAT
- Linux防火墙iptables学习笔记(四)iptables实现NAT
- Linux 防火墙iptables 学习笔记(四)iptables实现NAT
- Linux 防火墙iptables 学习笔记(四)iptables实现NAT
- 杭电 HDU 1062 Text Reverse
- new和malloc的区别
- hello!lBackbone
- SharedPreference数据的读写操作
- 【字符串】Trie
- iptables 防火墙实现
- 2015,被自己秀了一脸真是醉了卧槽!
- Eclipse中文注释乱码解决
- 使用Eclipse构建Maven项目
- html初步
- BRISK描述特征构建Bag-of-feature
- JSON简介以及用法汇总
- MySQL中单引号、双引号和反引号的区别
- 【HTML5与CSS3基础】选择器querySelector和querySelectorAll