squid+iptables 实现透明代理

 局域网内需要安装一台透明代理,用于上网。

1. 配置iptables

设置iptables的NAT表,使内部计算机可以通过NAT连到外网

 

增加以下几行:

*nat

:PREROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

-A POSTROUTING -s 192.168.106.0/24 -o eth2 -j SNAT --to x.x.x.x

COMMIT

这样,内部计算机已经可以通过iptables ,以NAT的方式访问外网。

2.安装squid

centos 中有squid 的rpm包,可以用yum install squid进行安装

3.iptables透明代理配置

squid 默认的代理端口是3128,所以我们需要在iptables中增加以下几行:

在nat 表中COMMIT之前再增加

-A PREROUTING -s 192.168.106.0/24 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

把内网出去访问80端口的数据跳转到3128端口

在filter表中修改为以下:

 

 

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -i lo -j ACCEPT

-A OUTPUT -o lo -j ACCEPT

-A INPUT -p icmp --icmp-type any -j ACCEPT

-A INPUT -i eth0 -s 192.168.106.251 -p tcp --dport 22 -j ACCEPT

-A OUTPUT -o eth0 -d 192.168.106.251 -p tcp --sport 22 -j ACCEPT

-A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT

-A INPUT -i eth2 -p udp --sport 53 -j ACCEPT

-A INPUT -i eth0 -s 192.168.106.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT

-A OUTPUT -o eth2 -p tcp --sport 32768:61000  -m state --state NEW,ESTABLISHED -j ACCEPT

-A INPUT -i eth2 -p tcp --dport 32768:61000  -m state --state ESTABLISHED -j ACCEPT

-A OUTPUT -o eth0 -d 192.168.106.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

 

 

 

其中32768:61000是centos 的本地端口范围

4.配置squid.conf

按照网上找到的文章配置一番后,运行出现access denied的错误

修改squid.conf

找到http_access 这段

在http_access deny all之前增加内部网络地址

 

acl our_networks src 192.168.0.0/16

http_access allow our_networks

再设置http_port 3128 transparent

OK了,基本上已经实现透明代理功能,其它就是一些安全方面的设置及优化了

 

从安全性方面考虑,可以建以下iptables脚本

 

#!/bin/sh

echo '1' > /proc/sys/net/ipv4/ip_forward

IPT=/sbin/iptables

 

################################Clear ip rules#####################

 

$IPT -F -t filter

 

$IPT -X -t filter

 

$IPT -F -t mangle

 

$IPT -X -t mangle

 

$IPT -F -t nat

 

$IPT -X -t nat

 

 

################################Default policy#####################

 

$IPT -P FORWARD ACCEPT

 

$IPT -P INPUT DROP

 

$IPT -P OUTPUT DROP

 

################################User rules##########################

 

$IPT -t nat -A PREROUTING -s 192.168.0.0/16 -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128

$IPT -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth2 -j SNAT --to-source 221.136.80.203

 

$IPT -t filter -A INPUT -i lo -j ACCEPT

$IPT -t filter -A OUTPUT -o lo -j ACCEPT

 

$IPT -t filter -A INPUT -i eth0 -s 192.168.106.251 -p tcp --dport 22 -j ACCEPT

$IPT -t filter -A OUTPUT -o eth0 -d 192.168.106.251 -p tcp --sport 22 -j ACCEPT

 

$IPT -t filter -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT

$IPT -t filter -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT

 

$IPT -t filter -A INPUT -i eth1 -s 192.168.0.0/16 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT

$IPT -t filter -A OUTPUT -o eth1 -d 192.168.0.0/16 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT

$IPT -t filter -A INPUT -i eth2 -s 192.168.0.0/16 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT

$IPT -t filter -A OUTPUT -o eth2 -d 192.168.0.0/16 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT

 

$IPT -t filter -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT

$IPT -t filter -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT

 

$IPT -t filter -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT

$IPT -t filter -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT

=====================================================

按照上面的脚本运行后就可以通过squid和iptables访问外网了,但是我这里的环境中有内网的网站,访问内网时就会出现问题,所以还需要修改一下

$IPT -t nat -A PREROUTING -s 192.168.0.0/16 -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128

修改成:

$IPT -t nat -A PREROUTING -s 192.168.0.0/16 -d ! 192.168.106.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128

意思是目标地址不是内网的80端口访问时跳到3128squid去。

 

 

 

你可能感兴趣的:(职场,iptables,squid,休闲)