天天看點

squid3.0+iptables配置全過程詳解

squid3.0+iptables配置全過程詳解

在網上翻了很多資料。都是squid2.6的,真正用squid3.0的很少或根本就是錯誤的。

是以想寫一個以備忘及抛磚引玉。其中可能有手誤之處。

環境:CentOS 5.2

iptables為系統自帶(版本是:iptables v1.3.5)。

三張網卡

其中eth0(192.168.0.2),eth1(192.16810.11為内網。eth2為外網.

squid:squid-3.0.STABLE10.tar.gz

下載下傳位址:http://www.squid-cache.org/

wget -c http://www.squid-cache.org/Versi ... 3.0.STABLE10.tar.gz

下載下傳的檔案放在/usr/local/src目錄中

#cd /usr/local/src

#wget -c http://www.squid-cache.org/Versi ... 3.0.STABLE10.tar.gz

#tar -zxvf squid-3.0.STABLE10.tar.gz

# cd squid-3.0.STABLE10

我是把configure寫成一個批處理

這裡的configure注意要增加--enable-linux-tproxy  --enable-linux-netfilter支援透明正向代理

要不會在安裝後啟動時中的cache,提示不支援transparent

#vi config.sh

複制以下内容到config.sh

#!/bin/bash

      ./configure --prefix=/usr/local/squid \

       --enable-gnuregex --enable-carp --enable-async-io=80 \

       --enable-storeio=aufs,diskd,ufs,null --enable-removal-policies=heap,lru \

       --enable-icmp --enable-delay-pools --enable-useragent-log --enable-snmp \

        --enable-arp-acl --enable-htcp --enable-underscores --enable-auth \

       --enable-external-acl-helpers=ip_user,ldap_group --enable-x-accelerator-vary \

       --enable-ssl --enable-cache-digests --enable-poll \

        --enable-linux-tproxy  --enable-linux-netfilter --with-pthreads  \

      --with-aio --with-filedescriptors=65536 \

        --enable-err-languages="Simplify_Chinese English" \

      --enable-default-err-language="Simplify_Chinese" \

#chmod 775 config.sh

#./config.sh

#make

#make install

squid3.0安裝完畢。

現在設定squid.conf

#cd /usr/local/squid

建立squid的使用者及組

#groupadd squid

#useradd squid -g squid -m -s /sbin/nologin

#vi etc/squid.conf

squid.conf 配置檔案如下:

#http_port 3128 transparent vhost vport(這一個在上面的配置裡面有,隻是要改成這樣)

cache_mem 1000 MB

cache_swap_low 90

cache_swap_high 95

#cache_dir ufs /opt/cache/squid 8000 16 256

cache_dir ufs /usr/local/squid/var/cache 1000 16 256

cache_access_log /var/log/squid/access.log

#cache_store_log /var/log/squid/store.log

cache_store_log /usr/local/squid/var/logs/store.log

dns_nameservers 218.104.128.106

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

#coredump_dir /usr/local/squid/var/cache

#acl all src 0.0.0.0/0

acl normal  src 192.168.0.0/24

acl wluser src 192.168.10.0/24

acl my src 192.168.0.9

http_access allow my

http_access allow normal

http_access allow wluser

http_access deny all

cache_effective_user squid

cache_effective_group squid

cache_mgr [email protected]

visible_hostname No1.proxy

上面要注意的是:

1.http_port 3128 transparent vhost vport(這一行寫的才是支援透明代理的,寫2.6的五行寫法不一樣)

在squid.conf的875行.我的寫法如下,增加accel(加速),具體參數說明見squid.conf中的875行以上的幾行,有說明。

http_port 3128   transparent accel  vhost vport

(以下是squid 2.6的寫法

httpd_accel_port 80

httpd_accel_host virtual

httpd_accel_with_proxy on

httpd_accel_single_host off

httpd_accel_uses_host_header on

原來的squid.conf預設有 http_port 3128這一行。在後面加上transparent這一個參數)

2.有注釋掉的幾行是在squid.conf本來有的。可以查找到之後更改後面的參數就可以了。

3.#acl all src 0.0.0.0/0把這行注釋掉。要不好像會監聽0.0.0.0,沒有測試過,隻不過我是把他給注釋掉了。

具本的每一行的意思。可以見網上的文章,很多就不啰嗦了,或見squid.conf.

建立squid的cache的目錄及更改權限。要不會運作不了。

#mkdir /var/log/squid

#chown -R squid:squid /var/log/squid

#chown -R squid:squid /usr/local/squid/var/

#mkdir /usr/local/squid/var/cache

#chmod -R 777 var/cache

#chmod -R 777 /usr/local/squid/var/

第一次啟動時要建立緩存目錄

#/usr/local/squid/sbin/squid -z

成功會提示:

Creating Swap Directories

然後出現每個檔案及目錄的位置

測試Squid運作狀況

#/usr/local/squid/sbin/squid -NCd1

成功後将出現"Ready to serve requests",否則請檢查配置檔案.

如下:

2008/11/24 22:59:27| Starting Squid Cache version 3.0.STABLE10 for i686-pc-linux-gnu...

2008/11/24 22:59:27| Process ID 13445

2008/11/24 22:59:27| With 1024 file descriptors available

2008/11/24 22:59:27| Performing DNS Tests...

2008/11/24 22:59:27| Successful DNS name lookup tests...

或提示:

2008/11/25 19:39:05| Squid is already running!  Process ID 2356

那麼就說明squid已經安裝成功了

#ps -aux| grep squid

看下squid程序在不。

iptables中的設定注意打開3128端口和加入以下幾句

iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0

#以下$INET_IP為外網的IP位址,進行内網位址到外網位址的轉換

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth2 -j SNAT --to $INET_IP

   129  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth2 -j SNAT --to $INET_IP

#把從eth0.eth1 目的80端口的資料包重定向到3128端口,其中第一行為我内網的網關位址。可有可無。

#iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

iptables -t nat -A PREROUTING -s 192.168.0.0/24 -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128

iptables -t nat -A PREROUTING -s 192.168.10.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128

上面這四句比較重要,是進行透明代理的關鍵。前兩句的作用是進行“源位址轉換”,也就是說要進行内網位址到外網位址的轉換。執行了這兩句,即使沒有squid,内網機器也可以上網了。

後面兩句是對從兩個内網網卡進入的、tcp協定的、目的端口号是80的,做“端口重定向”。重定向到3128端口。這樣,squid就可以接到這個資料包了。

OK!如果你的squid沒有問題,而且你也執行了上面的語句,并且沒有報錯。那就恭喜你,一個iptables+squid的透明代理做成了。如果你不相信,有兩個方法可以測試:一是登入:http://ipid.shat.net ,這是一個國外網站,可以顯示你的外網ip位址,還有是否被代理過。

#外網eth2 IP僞裝

iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

另外要注意載入的子產品:

modprobe ip_tables

modprobe iptable_nat

modprobe iptable_filter

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

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

具體詳細的iptables的配置如下(其中加入我自已的一些過濾及端口,可根據需要選擇。比如22,21,80等端口,及蠕蟲過濾等)

#cat agent

#!/bin/bash

INET_I

INET_IP="x.x.x.x"

LAN_I

LAN_IP="192.168.0.2"

LAN_IP_RANGE="192.168.0.0/24"

IPT="/sbin/iptables"

modprobe ip_tables

modprobe iptable_nat

modprobe iptable_filter

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

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

iptables -F

iptables -X

iptables -F -t mangle

iptables -t mangle -X

iptables -F -t nat

iptables -t nat -X

iptables -t nat -F

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -i ! eth1 -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT     -p udp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT     -p tcp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT     -p icmp -m state --state ESTABLISHED,RELATED  -j ACCEPT

iptables -A INPUT     -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT     -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT     -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT  -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT   -p tcp --sport 22 -j ACCEPT

iptables -A INPUT -i eth1 -p udp --sport 53 -j ACCEPT

iptables -A INPUT  -p tcp --dport 53 -j ACCEPT

iptables -A OUTPUT  -p udp --sport 53 -j ACCEPT

iptables -A OUTPUT  -p udp --dport 53 -j ACCEPT

iptables -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT

iptables -A OUTPUT -o eth1 -p tcp --dport 80 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

iptables -A FORWARD -p tcp --dport 4444 -j DROP

iptables -A FORWARD -p udp --dport 4444 -j DROP

iptables -A FORWARD -p tcp --dport 445 -j DROP

iptables -A FORWARD -p udp --dport 445 -j DROP

iptables -A FORWARD -p tcp --dport 69 -j DROP

iptables -A FORWARD -p udp --dport 69 -j DROP

iptables -A FORWARD -p tcp --dport 135 -j DROP

iptables -A FORWARD -p udp --dport 135 -j DROP

iptables -A FORWARD -p tcp --dport 139 -j DROP

iptables -A FORWARD -p udp --dport 139 -j DROP

iptables -A OUTPUT -p tcp --sport 31337 -j DROP

iptables -A OUTPUT -p tcp --dport 31337 -j DROP

iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

iptables -A OUTPUT   -p icmp -j ACCEPT

iptables -A INPUT   -p icmp -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

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

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

iptables -A INPUT -i eth1 -s 192.168.10.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth1 -d 192.168.10.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 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

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth2 -j SNAT --to $INET_IP

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth2 -j SNAT --to $INET_IP

iptables -A INPUT  -p tcp --dport 3128 -j ACCEPT

iptables -A OUTPUT   -p tcp --sport 3128 -j ACCEPT

iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0

iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

iptables -t nat -A PREROUTING -s 192.168.0.9 -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128

iptables -t nat -A PREROUTING -s 192.168.0.0/24 -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128

iptables -t nat -A PREROUTING -s 192.168.10.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128

iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

#iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

儲存及更改agent的權限及運作。

#chmod 775 agent

#./agent

#/etc/init.d/iptables save

#/etc/init.d/iptables restart

轉載于:https://blog.51cto.com/emperorpenguins/468671

繼續閱讀