iptables+squid经典配置实例
实验背景
小诺公司内部搭建了web服务器和FTP服务器,为了满足公司需求,要求使用Linux构建安全、可靠的防火墙。具体要求如下:
1、 防火墙自身要求安全、可靠,不允许网络中任何人访问;防火墙出问题,只允许在防火墙主机上进行操作。
2、 公司内部的web服务器要求通过地址映射发布出去,且只允许外部网络用户访问web服务器的80端口,而且通过有效的DNS注册。
3、 公司内部的员工必须通过防火墙才能访问内部的web服务器,不允许直接访问。
4、 FTP服务器只对公司内部用户起作用,且只允许内部用户访问FTP服务器的21和20端口,不允许外部网络用户访问。
5、 公司内部的员工要求通过透明代理上网(不需要在客户机浏览器上做任何设置,就可以上网)
6、 内部用户所有的IP地址必须通过NAT转换之后才能够访问外网。
实验网络拓扑图
![200906211245592173182.png](https://i-blog.csdnimg.cn/blog_migrate/64660a8c71aea5771283bc2466419b2b.png)
实验原理:
----------------netfilter/iptables架构---------------------
iptables默认具有5条规则链:PREROUTING、POSTROUTING、FORWARD、INPUT、OUTPUT
iptables默认的规则表以及对应的规则链:
filter:INPUT、FORWARD和OUTPUT。
nat:PREROUTING、POSTROUTING和OUTPUT。
mangle:PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD。
nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因,对这一点,后面会有更加详细的讨论。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。
mangle表主要用来mangle数据包。我们可以改变不同的包及包头的内容,比如 TTL,TOS或MARK。注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。PREROUTING在包进入防火墙之后、路由判断之前改变包,POSTROUTING是在所有路由判断之后。 OUTPUT在确定包的目的之前更改数据包。INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包。FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改变数据包的 TTL,TOS或MARK,而不是其源目地址。NAT是在nat表中操作的。
filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。
![200906211245592190507.png](https://i-blog.csdnimg.cn/blog_migrate/905c5c84974858238e6b433692faf575.png)
实验步骤:
实验思想:先将进出防火墙的策略设置到最严格,然后一步步添加需要放行的策略。
一、Linux下iptables的具体设置
1、 清空filter表和nat表中的配置策略。
清空所选的系统表filter中的默认链(不影响默认策略):iptables -F (INPUT OUTPUT FORWARD),不加参数,表示全部清除
清空所选的系统表nat中的默认链(不影响默认策略):iptables -F (PREROUTING、POSTROUING、OUTPUT) –t nat ,不跟参数,表示全部清除
删除表中的自定义规则链:iptables -X <自定义规则链名1、链名2....>
指定链的所有计数器归零:iptables -Z (INPUT OUTPUT FORWARD)
2、 放行filter表的默认OUTPUT链,阻止FORWARD链和INPUT链。全部放行nat表中的PREROUTING链、POSTROUTING链以及OUTPUT链。(设置完成之后,目前的状态是只允许数据从内网出去,不允许外网任何数据进来。)
设置默认策略规则: iptables -P -t (nat、filter、mangle) (INPUT OUTPUT FORWARD) <DROP、ACCEPT>
3、 将内网web服务器的IP地址映射到防火墙连接外网接口的IP地址上。
设置完成之后,外网用户就可以通过80端口访问防火墙外网接口的IP地址。并能够将目的IP地址转换为内网web服务器的IP地址,但是还不能够访问web服务器。
格式:iptables -t nat -A PREROUTING -p tcp -d 防火墙对应外网的IP --dport 80 -j DNAT --to-destination web服务器的IP地址
4、 放行转发访问内网web服务器的数据包
设置完成之后,外网用户就可以通过80端口访问防火墙外网接口的IP地址,并且能够将外网IP地址映射为内网web服务器的IP地址,进而访问内部web服务器。
格式:iptables –A FORWARD –p tcp –d 内网web服务器的IP地址 --dport 80 –j ACCEPT
5、 将内网web服务器的IP地址映射到防火墙连接内网接口的IP地址上。
设置完成之后,内网用户就可以通过访问防火墙内网接口的IP地址来访问内部web服务器。为什么不直接让内网用户通过内网IP地址直接访问呢?是为了增加内网Web服务器的安全性。
格式:iptables -t nat -A POSTROUTING -p tcp -d http服务器的IP地址 --dport 80 -j SNAT --to-source 防火墙对应内网的IP地址
6、 在防火墙中添加透明代理设置的规则。
设置完成之后,内网用户访问外网的web服务器的80端口都转换为内网代理服务器squid的默认端口3128。只要代理服务器能够访问互联网,内网用户也就可以访问互联网。
格式:iptables –t nat –A PREROUTING –s 子网地址/子网掩码 -p tcp --dport 80 -j REDIRECT – –to-posts 3128
7、 设置Linux作为网关服务器。
设置完成之后,内网所有IP地址如果访问外网都映射为防火墙外网接口的IP地址。
格式:iptables –t nat –A POSTROUTING –s 子网地址/子网掩码 -o 外部接口 -j MASQUERADE
8、 保存iptables的配置。
当管理员已经对Linux防火墙设置完毕,并且需要永久保存防火墙的设置时,需要使用iptable-save命令将设置内容保存到一个指定的文件中。默认配置文件在/etc/sysconfig/iptables中。当重新启动系统之后,需要使用 iptables-restore命令将保存的文件重新恢复到/etc/sysconfig/iptables中。
二、Linux下squid的具体设置
1、squid服务器的初始化
第一次使用squid服务器之前需要先使用squid –z命令对squid服务器进行初始化。其主要作用是在squid服务器的工作目录“/var/spool/squid/”中建立需要的子目录。
只有在第一次启动squid服务器之前才需要进行服务器的初始化工作,如果不手动执行squid –z命令,squid服务脚本在第一次启动服务时也会自动完成相应的初始化工作,再启动squid脚本程序。
注意:在配置squid之前,要确保主机具有完整的域名。
1、编辑squid服务器的配置文件
修改服务端口,squid服务器的服务端口使用http_port配置项设置,其默认值是3128,为了用户使用方便,可以添加服务端口8080或其它端口。
修改缓冲内存数量,squid服务器的性能和squid服务器使用的缓冲内存数量有很大关系,使用内存越多,squid服务器的性能会越好。一般设置cache_mem的值设置为服务器物理内存的三分之一到四分之一比较合适,cache_mem默认的设置只有8MB。
设置squid的工作目录,squid服务器缓存的内容只有很少的一部分是保存在缓冲内存中的,而代理服务中使用的所有文件都会保存在squid的工作目录中。在squid.conf配置文件中使用cache_dir设置squid服务器的工作目录路径和属性。
“100 16 256”分别表示目录中最大的容量是100MB,目录中的一级子目录的数量为16个,二级子目录为256个。
squid工作目录的容量和子目录的数量也会在一定程度上影响squid服务器代理服务的性能,在实际应用中可根据实际情况适当扩大工作目录的总容量。
在squid.conf配置文件中默认只允许本机使用squid服务器,这种策略也体现了squid服务器默认设置的严谨。为了让局域网所有用户能够通过squid的代理服务访问外部网页,需要设置访问控制列表,在acl *条目下添加 “acl clients src 子网地址/子网掩码”
在squid.conf文件的http_access deny all设置行之前添加如下设置:http_access allow clients。并添加提供透明代理的相关功能,需要进行如下配置:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
设置完成之后,重新启动squid服务,使squid.conf配置文件生效。
Squid服务启动后,使用netstat命令可以看到squid服务程序在3128端口进行代理服务的监听,这与通常的代理服务器使用8080端口是不同的。
测试略!!
转载于:https://blog.51cto.com/feilong0663/1357728