iptables+squid透明代理+防火墙终极配置

以前做的一个 iptables+squid 出了问题,配置文件损坏了,发现再写一个还挺麻烦的,这里保存了一个挺好的文章,备查。



iptables+squid透明代理+防火墙终极配置





系统:
CentOS4.2
,三块网卡,两个内网,一个外网。双至强, 2GHz 2GB 内存。服务器主要开了 squid sshd ,其他的一律闭掉了。
eth0 192.168.100.1
eth1
192.168.168.12
eth2 A.B.C.D —— 外网地址
=====================================================================
squid
设定可以根据自己的情况来,我们假设其端口为 3128 ,在三块网卡上都有监听(不要绑定某一个 IP 或网卡)。
/etc/squid/squid.conf
http_port 3128
cache_mem 1000 MB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /opt/cache/squid 8000 16 256
cache_access_log /var/log/squid/access.log
cache_store_log /var/log/squid/store.log
dns_nameservers 210.77.192.88
maximum_object_size 409600 KB
maximum_object_size_in_memory 64000 KB
emulate_httpd_log on
ipcache_size 1024
ipcache_low 90
ipcache_high 95
fqdncache_size 1024
forwarded_for off
coredump_dir /opt/cache/squid/coredump


httpd_accel_port 80
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_single_host off
httpd_accel_uses_host_header on

acl all src 0.0.0 .0/0
acl lixiaedu100 src 192.168.100.0/24
acl lixiaedu168 src 192.168.168.0/24

http_access allow lixiaedu100
http_access allow lixiaedu168
http_access deny all

cache_effective_user squid
cache_effective_group squid
cache_mgr zhaobing8181@163.com

visible_hostname lixiaedu

======================================================================
iptables
设定。 iptables 的设定分为两部分,一是如何进行 SNAT ,二是在开设了 squid 的情况下如何进行安全防护的问题。
一、 SNAT

modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
加挂一些 iptables 的必要的模块,以便调用。

echo 1 > /proc/sys/net/ipv4/ip_forward
打开 转发 功能。让数据包可以在不同的网卡间 流动

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth2 -j SNAT --to A.B.C.D
iptables -t nat -A POSTROUTING -s 192.168.168.0/24 -o eth2 -j SNAT --to A.B.C.D
iptables -t nat -A PREROUTING -s 192.168.100.0/24 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -s 192.168.168.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
上面这四句比较重要,是进行透明代理的关键。前两句的作用是进行 源地址转换 ,也就是说要进行内网地址到外网地址的转换。执行了这两句,即使没有 squid ,内网机器也可以上网了。
后面两句是对从两个内网网卡进入的、 tcp 协议的、目的端口号是 80 的,做 端口重定向 。重定向到 3128 端口。这样, squid 就可以接到这个数据包了。
OK
!如果你的 squid 没有问题,而且你也执行了上面的语句,并且没有报错。那就恭喜你,一个 iptables+squid 的透明代理做成了。如果你不相信,有两个方法可以测试:一是登录: http://ipid.shat.net ,这是一个国外网站,可以显示你的外网 ip 地址,还有是否被代理过。二是在一台内网机器上下载一个文件,或者看一页图片很多而且较慢的网页,然后转到另一台内网机器上下载同样的文件或看刚才的图片网页。比

较一下速度,就能感觉出来了。

二、 firewall

如果你把这样一台服务器放到 internet 上,无异于是想 自杀 。防火墙没有任何的保护机制和过滤功能。很容易被各种攻击所击破。不要迷

Linux 的安全性,网管员的安全意识要比空喊 Linux 安全重要得多。

iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
首先,把三个表清空,把自建的规则清空。

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
设定 INPUT OUTPUT 的默认策略为 DROP FORWARD ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
先把 回环 打开,以免有不必要的麻烦。

iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
在所有网卡上打开 ping 功能,便于维护和检测。

iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
打开 22 端口,允许远程管理。(设定了很多的附加条件:管理机器 IP 必须是 250 ,并且必须从 eth0 网卡进入)

iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.168.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.168.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
上面这几句是比较头痛的,我做逐一解释。

iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
允许 192.168.100.0/24 网段的机器发送数据包从 eth0 网卡进入。如果数据包是 tcp 协议,而且目的端口是 3128 (因为 REDIRECT 已经把 80 改为 3128 了。 nat 表的 PREROUTING 是在 filter 表的 INPUT 前面的。)的,再而且,数据包的状态必须是 NEW 或者 ESTABLISHED 的( NEW 代表 tcp 三段式握手的 第一握 ,换句话说就是,允许客户端机器向服务器发出链接申请。 ESTABLISHED 表示通过握手已经建立起链接),通过。

iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
我们先来看这一句。现在你的数据包已经进入到 linux 服务器防火墙上来了。 squid 需要代替你去访问,所以这时,服务器就成了客户端的角色,所以它要使用 32768 61000 的私有端口进行访问。(大家会奇怪应该是 1024 65535 吧。其实 CentOS 版的 linux 所定义的私有端口是 32768 61000 的,你可以通过 cat /proc/sys/net/ipv4/ip_local_port_range ,查看一下。)再次声明:这里是 squid 以客户端的身份去访问其他的服务器,所以这里的源端口是 32768:61000 ,而不是 3128

iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
当然了,数据有去就有回。

iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
数据包还得通过服务器,转到内网网卡上。请注意,这里,是 squid 帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而 squid 是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是 3128 ,而不是 32768:61000

iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
当然, DNS 是不可缺少的。

iptables -A INPUT -i eth+ -p tcp --dport 80 -j LOG --log-prefix "iptables_80_alert" --log-level info
iptables -A INPUT -i eth+ -p tcp --dport 21 -j LOG --log-prefix "iptables_21_alert" --log-level info
iptables -A INPUT -i eth+ -p tcp --dport 22 -j LOG --log-prefix "iptables_22_alert" --log-level info
iptables -A INPUT -i eth+ -p tcp --dport 25 -j LOG --log-prefix "iptables_25_alert" --log-level info
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j LOG --log-prefix "iptables_icmp8_alert" --log-level info
当然了,来点日志记录会对网管员有所帮助。

至此,一个完整的访问过程就被我们分析过了。本篇中最主要的就是要说明 squid 在对内网机器和外网服务器中扮演了两种截然相反的角色。

这对大家来说不太好理解。我也是摸索了一段时间才成功的。愿我的文章抛砖引玉,能引起大家的共鸣和思索。
本篇文章欢迎大家转载,请保留作者信息。


一点说明:最近见到过一种情况,就是 squid 无法启动,或者说起动起来几秒钟就自动停掉。 messages 中说有 squid 遇到了 signal 25 ,所以停止。遇到这种问题,要查看 squid 的日志是不是太大了。我看了一下, access.log 1.6GB store.log 2GB 大小。看来是日至文件偏大。把两个文件转移或者改名后就可以了。


-----------------------------------------------------------------------

以下说一下我做的附加功能
1 如果不允许上网用户下载某种文件,可以在squid中做设置不服务
2 如果想定时清理squid的缓存,可以放脚本在cron中

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值