!squid の時間を http://www.gpm.jp/pukiwiki/tito/index.php?squid%A4%CE%A5%ED%A5%B0%A4%CE%BB%FE%B9%EF #! /usr/bin/perl while( <>){ chop; ($time, $rest) = /([0-9.]+)[ ]+(.*)/; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $mon++; $year += 1900; ### print "$year-$mon-$mday $hour:$min:$sec $rest\n"; printf ( "%04d-%02d-%02d %02d:%02d:%02d $rest\n", $year,$mon,$mday,$hour,$min,$sec) } ! Windows のプロクシーを コマンドラインで CMDを開き次のコマンドを reg query “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings” /v ProxyServer reg query “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings” /v ProxyOverride !PROXY_PAC https://developer.mozilla.org/ja/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file 自分のIPによってプロクシを変える function FindProxyForURL(url,host) { var myipaddr = myIpAddress(); var proxy = 'DIRECT'; if (isInNet(myipaddr, "192.168.25.0", "255.255.255.0")) { // NET1 proxy = "PROXY pxy01:8080" } else if (isInNet(myipaddr, "10.10.0.0", "255.255.0.0")) { // NET2 proxy = "PROXY pxy10:8080" } else { proxy="DIRECT'; } return proxy; } !squid で透過型PROXY 最初に、まずはsquid.confのコメントを読んでください。 それがもっとも信頼すべき情報です。 しかし以下に示す方法は1999/7現在では正しい筈です。 透過プロキシ/キャッシュを構成するには以下の4つの手順を踏む必要があります: 1. 他のアドレスであっても受け付けるバージョンのSquidをコンパイルして実行してください。 幾つかのオペレーティングシステムでは、接続をハイジャックして宛先アドレスを見分けるようにシステムを構成する必要があります。 Linuxではこれは自動的に行われます。 *BSDベースのシステムではおそらく --enable-ipf-transparent オプションをつけて Squid を構成する必要があります。 (以前に Squid をこ構成しているなら make clean で構成をきれいにしてから実行してください) 2. Squid の設定で接続を受け入れるようにします。 あなたはSquidの設定を変更して接続をハイジャックして宛先アドレスを見分けるようにしなくてはいけません。 Squid.conf での重要な設定項目は: http_port 8080 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on 3. あなたのキャッシュサーバでパケットを受けられるようにしてください。  あなたのキャッシュホストはどんな宛先であってもポート80のパケットを受け入れるように構成しなくてはなりません。 もしかするとIPフィルタリングがカーネルに組み込まれていて、これを使ってすべてのポート80のパケットを受け入れるようできるかも知れません。 Linuxではこれはiptables(カーネル2.4)、ipchains(2.2)またはipfwadm(2.0)、FreeBSDではipfwyaと呼ばれています。 他のBSDベースのシステムではip filter や ipnat と云われているかもしれません。(FreeBSD3.xからはipfwでなくip filter や ipnat がサポートされています) 4. キャッシュサーバにパケットを送ってください。 これには幾つかの方法があります。 第1に、もしあなたのプロキシマシン常にパケットが通る位置(パケットパス)にある(例えばプロキシマシンがインターネットへのルータとして機能している)ならあなたは何もしなくて構いません。 もし、プロキシがパケットパス上にないなら、ルータやスイッチをつかってパケットをプロキシへ集める必要があります。 あなたがCISCOのルータを使っているなら、IOSの"route maps"機能で実現できるかも知れません。 また、あなたは Alteon ACE-director や Foundry Networks 社等の Layer-4 と呼ばれるスイッチを使うことで集めることもできます。 最後として、スタンドアロンのルータやロードバランサ製品やルーティング機能を持ったアクセスサーバなどを使うこともできるでしょう。 注意: * 以下の参考例では、キャッシュサーバの80ポートに送られてきたパケットを自身の8080ポートにリダイレクトする場合を想定します。 * httpd_accel_host の virtual はマジックワードです。  * httpd_accel_with_proxy on はinterception proxy(透過プロキシ)モードの場合に有効にする必要があります。 interception proxy モードでは通常のプロキシと共に80ポートによる透過プロキシとして機能します。 * httpd_accel_uses_host_header on にする事で、interceptionモードにおいてキャッシュを正しく機能させ、ホスト名によってキャッシュオブジェクトが正しくキャッシュされるようになります。 17.1 Solaris, SunOS, BSDシステムによる透過プロキシ/キャッシュ メモ: FreeBSD3.x以前ではip filterではなく代わりに内蔵の ipfw 機能を使ってください。後述のFreeBSD節を参照してください。FreeBSD3.0以上では、以下のように設定できます。 IPフィルターのインストール もし既に、 IP Filter パッケージ がインストールされていないならこれを入手してインストールしてください。(FreeBSDを普通にインストールするとipフィルターはインストールされています) ip-filter の設定 ip-filterを設定して、プロキシマシンでポート80のパケットを受け取れるように設定してください。 以下ではテストの為、すべてのパケットを受け入れるルールを設定します。 /etc/ipf.rules に対する設定 # pass in all pass out all なお実際のフィルタルールは使う環境に合わせて安全な設定を行ってください。 ip-filterがシステム起動時に設定されるように起動スクリプトを設定してください。 FreeBSD3.x以降では、/etc/rc.conf ファイで以下のように記述します。 ipfilter_enable="YES" ipfilter_rules="/etc/ipf.rules" ipfilter_flags="" ipnatの設定 /etc/ipnat.rules に対する設定: # Redirect direct web traffic to local web server. rdr de0 192.168.1.2/32 port 80 -> 192.168.1.2 port 80 tcp # Redirect everything else to squid on port 8080 rdr de0 0.0.0.0/0 port 80 -> 192.168.1.2 port 8080 tcp ここで、de0 はLANインターフェース名なのでifconfigコマンドで、インターフェース名は確認してください。  この例では、自分宛のhttpパケット(80)はそのまま自分自身のWebサーバに渡して以外のパケットを8080へ渡すように設定しています。 それ以外のアドレス宛の80ポートへのパケットは8080へリダイレクトします。 (もしかしたら、apacheなどの受付ポートを81とかにして、最初のルールを rdr de0 192.168.1.2/32 port 80 -> 192.168.1.2 port 81 tcp とかにする方がより良いかも知れません。) スタートアップスクリプトを編集してipnatを有効にします。 例えばFreeBSDでは/etc/rc.confで次のように指定します: ipnat_enable="YES" ipnat_program="/sbin/ipnat -CF -f" file ipnat_rules="/etc/ipnat.rules" ipnat_flags="" ip-filterとipnatの設定が終わった一度リブートして設定を有効にしてください。 設定ができているかは、 # ipfstat -i # ipfstat -o # ipnat -l で確認できます。 Squidの設定 ■Squid-2の場合 Squid-2(beta25以降)ではIPフィルターをサポートします。 この為には configure を次のように実行します。 ./configure --enable-ipf-transparent そして squid.conf で次のように指定しいます: http_port 8080 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on ノート: ポートは8080でなくても構いませんが、必ず/etc/ipnat.rules での指定を合わせてください。 ■Squid-1.1の場合 Quinton Dolan's Squid page.によるパッチを適用することでSquid-1.Xも利用できます。 squid.conf では次のように指定します: http_port 8080 httpd_accel virtual 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on Quinton Dolan.、ありがとう。 17.2 Linux 2.0 と ipfwadm での透過プロキシ/キャッシュ Rodney van den Oever による 注意: 透過プロキシ/キャッシュはLinux 2.0.30では動かない。 Linux 2.0.29で十分に動作する。もしあなたが最近の 2.2.xのカーネルを使うなら ipchains で構成すべきです。 これについては後述します。 警告: このテクニックにはいくつかの欠陥があります。 1. メソッドとしてHTTPプロトコルしかサポートしません。 FTPやgopherはサポートしません。 firewallingとリダイレクションをサポートする為のカーネルコンパイルオプションがあります。 これらの重要なパラメータは/usr/src/linux/.configの中で、 # # Code maturity level options # CONFIG_EXPERIMENTAL=y # # Networking options # CONFIG_FIREWALL=y # CONFIG_NET_ALIAS is not set CONFIG_INET=y CONFIG_IP_FORWARD=y # CONFIG_IP_MULTICAST is not set CONFIG_IP_FIREWALL=y # CONFIG_IP_FIREWALL_VERBOSE is not set CONFIG_IP_MASQUERADE=y CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_ALWAYS_DEFRAG=y # CONFIG_IP_ACCT is not set CONFIG_IP_ROUTER=y とします。 また、IPフォワードを有効にする為に、スタートアップスクリプトで次のように指定してください。 echo 1 > /proc/sys/net/ipv4/ip_forward Linux IP Firewall and Accounting ページに行って、ipfwadmのソースを入手してインストールしてください。ipfwadmはバージョン2.3.0よりも小さいバージョンでないと働かないかもしれません。 あなたは、ipfwadmを使ってリダイレクションを設定します。 私はブート時にインターフェースを整える/etc/rc.d/rc.inet1(Slackware)から走るスクリプトにこの規則を加えました。  /etc/rc.d/rc.firewall : #!/bin/sh # rc.firewall Linux kernel firewalling rules FW=/sbin/ipfwadm # Flush rules, for testing purposes for i in I O F # A # If we enabled accounting too do ${FW} -$i -f done # Default policies: ${FW} -I -p rej # Incoming policy: reject (quick error) ${FW} -O -p acc # Output policy: accept ${FW} -F -p den # Forwarding policy: deny # Input Rules: # Loopback-interface (local access, eg, to local nameserver): ${FW} -I -a acc -S localhost/32 -D localhost/32 # Local Ethernet-interface: # Redirect to Squid proxy server: ${FW} -I -a acc -P tcp -D default/0 80 -r 8080 # Accept packets from local network: ${FW} -I -a acc -P all -S localnet/8 -D default/0 -W eth0 # Only required for other types of traffic (FTP, Telnet): # Forward localnet with masquerading (udp and tcp, no icmp!): ${FW} -F -a m -P tcp -S localnet/8 -D default/0 ${FW} -F -a m -P udp -S localnet/8 -D default/0 これでLANからのどんな宛先のポート80へのパケットはローカルホスト(自分自身)のポート8080に転送されます。 規則を表示させると次のように見えます。: IP firewall input rules, default policy: reject type prot source destination ports acc all 127.0.0.1 127.0.0.1 n/a acc/r tcp 10.0.0.0/8 0.0.0.0/0 * -> 80 => 8080 acc all 10.0.0.0/8 0.0.0.0/0 n/a acc tcp 0.0.0.0/0 0.0.0.0/0 * -> * あるとき、LANからのアクセスでWebサーバとしてプロキシを指定した時に、ループに入ってしまいました。これはクライアントからの要求を拒否することで避けられるかもしれません。 ${FW} -I -a rej -P tcp -S localnet/8 -D hostname/32 80 IP firewall input rules, default policy: reject type prot source destination ports acc all 127.0.0.1 127.0.0.1 n/a rej tcp 10.0.0.0/8 10.0.0.1 * -> 80 acc/r tcp 10.0.0.0/8 0.0.0.0/0 * -> 80 => 8080 acc all 10.0.0.0/8 0.0.0.0/0 n/a acc tcp 0.0.0.0/0 0.0.0.0/0 * -> *