局域网内需要安装一台透明代理,用于上网。
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去。