Iptables
IPTables 表与链的功能
IPTables中一共有三张表,分别为filter表,nat表,mangle表
1》filter表主要用于过滤的作用,在IPTables中几乎所以的过滤都在这个表内完成,它是IPTables中默认执行的表。
filter表中一共有三条链:INPUT链,FORWARD链,OUTPUT链
INPUT链:过滤所有目标地址是本机的数据包
FORWARD链:过滤所有路过本机的数据包,也就是目的地址和源地址都还是本机的数据包。
OUTPUT链:过滤所有由本机产生的数据包,也就是源地址是本机的数据包。
2》nat表主要用于网络地址转换,对于一个流的数据包只会经过这个表一次,也就是说在如果一个包被允许了转换,那么它后面而来的数据包就不会再nat,而是直接自动的随第一个被转换的数据包流过。
Nat主要有三个转换的方式:DNAT SNAT MASQUERADE
DNAT: 改变数据包的目的地址,把外网的一个地址重定向到内网的一台主机上。
SNAT: 改变数据包的源地址,使内网的用户可以连接到外网
MASQUERADE:与SNAT功能相似,只是在NAT的时候,它会查找本机的一个地址池,而不像SNAT一样,只使用一个固定的地址。
Nat也有三个链:PREROTING链 POSTROUTING链 OUTPUT链
PREROUTING链:可以在数据包到达防火墙的时候改变包的目标地址
POSTPUT链: 在数据包就要离开防火墙时改变数据包的源地址
OUTPUT链:可以改变产生的数据包的目标地址
3》mangle表主要用于修改数据包,它可以修改数据包的TOS TTL MARK等,这个表平常使用不多,不再多做说明。
案例配置
公司有三个部门
工程部门
2
.1
1
--
2
.20
软件部门
2
.21-
2
.30
经理办
2
.31-
2
.40
上班时间 (周一---周五 08:20:00)
工程部门 上班时间ftp 不允许http qq 迅雷 下班后无限制
软件部门
上班时间
允许
http
但
不允许非法站点sina
,也不允许浏览图片
,不允许使用迅雷 ,连接数 最多3个
,
下班后无限制
经理办公室 http qq 都可以,下班后无限制
拓扑图
![](https://i-blog.csdnimg.cn/blog_migrate/5b1f98f1caafa3189c1b94b149a511dc.png)
注:本实验在开始时,系统已经重新编译了内核模块,并且加入也time iprange layer7等功能,如果没有重新编译内核加入上面的功能,一些功能会不能实现的。
1.首先关闭防火墙,我们不需要使用防火墙的默认规则,不必开启防火墙,关闭之后,系统只会匹配我们自己设置的iptables规则。
2.我们在做实验室之前要做到全网的互通,在通信的基础之上才能对其进行控制,达到实验的目的
因为我们的网络是内网需要与外网相连接,所以要对其进行SNAT转换
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth1 -j MASQUERADE
因为我们这台服务器上有多个网卡接口,所以指定与远程网络相接的接口eth1,让所有的流量从这个接口出去。
3.先允许ssh,我们使用ssh连接进入系统
[root@localhost ~]# iptables -A INPUT -s 192.168.101.114 -p tcp --dport 22 -j ACCEPT[root@localhost ~]# iptables -A OUTPUT -d 192.168.101.114 -p tcp --sport 22 -j ACCEPT
4.现在我们把各个表都设置成为拒绝状态,在全部拒绝的状态下,我们再根据要求开启各个功能。
[root@localhost ~]# iptables -t filter -P INPUT DROP
[root@localhost ~]# iptables -t filter -P OUTPUT DROP
[root@localhost ~]# iptables -t filter -P FORWARD DROP
我们按照实例要求进行分解完成
(1)
上班时间 (周一---周五 08:20:00)
工程部门 上班时间ftp 不允许http qq 迅雷 下班后无限制
1》上班时间允许FTP
[root@localhost ~]# iptables -t filter -A INPUT -m iprange --src-range 192.168.2.11-192.168.2.20 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
[root@localhost ~]# iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT //对请求做回应
[root@localhost ~]# modprobe ip_nat_ftp //加载ftp模块
2》不允许HTTP QQ 迅雷
在上面的设置中因为没有允许通信,所以本身就不能上qq等,但为了学习与实验,我就把代码直接写出来,仅供参考。
禁止HTTP: [root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.2.11-192.168.2.20 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 80 -j DROP
禁止QQ,对QQ的禁止,一般的iptables功能是很难实现的,我们需要使用7层的功能,这需要在编译内核使用系统支持此功能
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.2.11-192.168.2.20 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto qq -j DROP
禁止迅雷
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.2.11-192.168.2.20 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto xunlei -j DROP
3》
下班后无限制
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.2.11-192.168.2.20 -m time --timestart 20:01 --timestop 07:59 -j ACCEPT
(2)
软件部门
上班时间
允许
http
但
不允许非法站点sina
,也不允许浏览图片
,不允许使用迅雷 ,连接数 最多3个
,
下班后无限制
1》上班时间允许http,但是不允许sina也不允许图片
对于这类的限制,在iptables上实现起来比较困难,但是如果把它使用代理服务器squid来实现的话,可能就会容易很多。Squid服务器安装就不在陈述,自己实现,我们直接进行要求的实现。
我们先在squid上配置好要实现的内容
[root@localhost ~]# vim /etc/squid/squid.conf
加入如下内容
acl soft src 192.168.2.21-192.168.2.30
acl worktime time MTWHF 8:00-20:00
acl pic urlpath_regex -i \.jpg$
acl url url_regex -i sina
http_access allow soft worktime !pic !Url
dns_nameservers 222.88.88.88 222.85.85.85
visible_hostname 192.168.101.129
并且还要在squid服务器上设置透明代理,在配置文件中修改成下面的一句
http_port 3128 transparent
在 iptables 上对来自内网的流量进行端口的转换,把端口80上的流量全都代理到squid服务器的3128端口上,再转发出去。
[root@localhost ~]# iptables -t nat -R PREROUTING 1 -m iprange --src-range 192.168.2.21-192.168.2.30 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 80 -j REDIRECT --to-ports 3128
我们在连接外网的时间,都是使用域名对外进行连接,因此要使内网用户能够解析到域名,这就需要使用DNS服务器,所以我们要在iptables 上进行nat,使用DNS可以直接nat出去,这样就可以进行DNS的解析了。在第一步已经允许了所有数据包的nat,所以这步可以不要,写上只是为了了解其中的一些原理,它是没有数据包的匹配的。
[root@localhost ~]# iptables -t nat -A POSTROUTING -m iprange --src-range 192.168.2.21-192.168.2.30 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -o eth1 -p udp --dport 53 -j MASQUERADE
现在你解析一下DNS,你会发现,你仍然不能对DNS进行解析,因为在对DNS进行NAT之后,你的iptables 并没有允许你可以进行53端口流量的通行,所以凡是到达53端口的流量,仍然会全部仍掉,也就是达不到目的网络。我们可以对端口53的DNS流量进行转换,使其能够通过。
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.2.21-192.168.2.30 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p udp --dport 53 -j ACCEPT
做过这一步,你应该可以对域名进行解析,但是你会发现你还是不能连通外网,这是因为,当我们的数据包发送出去的时候,它是要先进入本服务器的3128端口的,但是iptables我们设置的是阻止全部的流量,所以在我们没有指定的允许它通过的时候,数据包是被阻止的,我们可以定义规则,让其数据包通过,这个时候我们使用的链是表filter中的INPUT与OUTPUT链,数据包是直接进入3128端口,没有进行转发,我们不能使用FORWARD链。
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 3128 -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
还在还要做一步,因为现在做的只是让内网用户可以与squid进行访问,但是,如果squid中没有缓存的话,那么squid会使用自己的80端口与外网进行互通,外网的数据发送到squid中,squid服务器再把数据发送给客户端,但是现在squid还不被允许从80端口发送及收取数据包,所以我们要下定义允许它们收发的规则
[root@localhost ~]# iptables -t filter -A OUTPUT -p tcp --dport 80 -s 192.168.101.129 -j ACCEPT //因为是在本地发送的,所以使用squid服务器外网ip
[root@localhost ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
2》
不允许使用迅雷 ,连接数最多3个
对于不使用迅雷,我们还是要使用iptables layer7来实现
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.2.21-192.168.2.30 -m time --timestart 8:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto xunlei -j DROP
设置连接数
设置连接数时在iptables 上总是设置不正确,不知道怎么回事,还请大神们帮忙给说下,所以我这在squid代理服务器上写了下面的一句规则
acl connlimit maxconn 3
http_access deny connlimit
但是这写我的不知道是不是因为缓存的作用,总是在打开三个网页之前就不能再打开网页了。
3》
下班后无限制
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.2.21-192.168.2.30 -m time --timestart 20:01 --timestop 07:59 -j ACCEPT
(3)
经理办公室 http qq 都可以,下班后无限制
,这也就是说,对经理办公室不用进行设置
,一条命令就可以了
[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 192.168.2.31-192.168.2.40 -j ACCEPT
本文转自 guodong810 51CTO博客,原文链接:http://blog.51cto.com/guodong810/1097499,如需转载请自行联系原作者