トップ 一覧 検索 ヘルプ RSS ログイン

proxy-tipsの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!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';
    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            * -> *