Linux ブリッジ上でのインライン

Linux はブリッジモードで動作するように設定できます。二つ以上の物理インターフェースがブリッジに割り当てられます。一つの IP アドレスはそれらのインターフェース間で共有されます。デフォルトでは一つのインターフェースに到着したあらゆるパケットは直ちにもう一つのブリッジインターフェースに送り出されます。

必要な Linux のパッケージ

  • bridge-utils

  • ebtables

ブリッジモードの設定例では 192.168.1.11/24 のローカルアドレスとインターフェース eth0eth1 をブリッジインターフェースとして使用します ( より詳細なドキュメントは ここ にあります) 。'#' とその後ろのものはすべて省略できます。

brctl addbr br0 # create bridge device
brctl stp br0 off # Disable spanning tree protocol
brctl addif br0 eth0 # Add eth0 to bridge
brctl addif br0 eth1 # Add eth1 to bridge

ifconfig eth0 0 0.0.0.0 # Get rid of interface IP addresses
ifconfig eth1 0 0.0.0.0 # ditto # Set the bridge IP address and enable it
ifconfig br0 192.168.1.11 netmask 255.255.255.0 up

もしまだ済ませていない場合は、これが 192.168.1.1 のゲートウェイのためのものであると、デフォルト経路を追加することを覚えておいてください。

ip route add default via 192.168.1.1

この時点で基本的なブリッジが動作することを確認するために接続性をテストしておくと良いです。

ブリッジが動作することを確認できたなら、これがお望みの基本的なトラフィックパターンです。

ATS を使ったブリッジを通るトラフィックの流れ

ATS を使ったブリッジを通るトラフィックの流れ

緑の矢印はクライアントからのパケットで、赤の矢印はオリジンサーバーからのパケットです。ローカルアドレス宛てではないすべてのトラフィックはブリッジを通ります。トラフィックに割って入り ATS に向かうようにする必要があります。これには ebtables が必要となります。横取りしたい流れは緑 1 ( クライアントからブリッジ ) と赤 1 ( オリジンサーバーからブリッジ ) です。

この例ではポート 80 (HTTP) のトラフィックを横取りします。外部から発信され ( 転送が有効化された ) インターフェースに到着したパケットのみを扱いたいので BROUTING チェーンを使用します。ポート 80 のすべてのトラフィックを横取りするように見えますが、上記の流れのみに影響を与えます。-j redirect はパケットがブリッジに流れ、転送はされないように印を付け、DROP ターゲットはパケットを標準的なデバイスのテストができるように通常の iptables のルーティングに置きます。 [1] この例はポート 80 のみを扱いますが、他のポートもポート番号が違うことを除いて同じです。ここでのポートはクライアントとオリジンサーバーの視点でのものであり、Traffic Server のサーバーポートではないことに注意してください。

ebtables -t broute -F # Flush the table
# inbound traffic
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-dport 80 \
  -j redirect --redirect-target DROP
# returning outbound traffic
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-sport 80 \
  -j redirect --redirect-target DROP

Traffic Server はレイヤー 3 で動作するので IP パケットを適切に扱うために iptables を使用する必要があります。

iptables -t mangle -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 \
  -j TPROXY --on-ip 0.0.0.0 --on-port 8080 --tproxy-mark 1/1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --sport 80 \
   -j MARK --set-mark 1/1

ここでインターフェースの方向性が問題となります。例では eth1 は内向き ( クライアント側 ) インターフェース、eth0 は外向き ( オリジンサーバー側 ) インターフェースです。両方のパケットの流れでポリシーに沿ったルーティングができるように印を付けます。内向きのパケットでは外部の IP アドレスへのパケットの受け付けを強制するために TPROXY を使う必要があります。外向きのパケットを返すためには外部のアドレスに結びつけられているソケットが開かれており、それを内部的に配達されることのみを強制する必要があります。ターゲットポートは listen 中で特定のアドレスには bind されていないので --on-ip の値は 0 です。--on-port の値は Traffic Server のサーバーポートと一致しなければなりません。そうでなければその値は任意です。--dport--sport はクライアントとオリジンサーバーの視点でのポートを指定します。

流れに印が付けられたのでそれらがポリシーに沿ったルーティングテーブルによりループバックインターフェースで内部的に配達されることを強制できます。

ip rule add fwmark 1/1 table 1
ip route add local 0.0.0.0/0 dev lo table 1

使用済みという印付けは独断的に行われますが、iptables とルーティングルールとの間で一貫していなければなりません。テーブル番号は 1 から 253 の間でなければなりません。

To configure Traffic Server set the following values in records.yaml

追加のトラブルシューティング

  • iptables が入ってくる HTTP 接続をフィルタ ( ブロック ) していないことを確認してください。

    デフォルトテーブルが入ってくる HTTP を妨害するケースがよくあります。次のコマンドですべてのフィルターを消去することができます。

    iptables -t filter --flush FORWARD
    iptables -t filter --flush INPUT
    

    これは劇的でテスト / デバッグのためだけに使用すべきです。稼働中のシステムはここにいくつかのフィルターを必要としますが、それはこのドキュメントの範囲外です。もしこれが問題を解決するのであれば、フィルターの制限が厳しすぎます。

    この問題は HTTP のトラフィックを通過させる ( ATS を使わない ) 基本的なブリッジ動作を妨げていることに注意してください。

  • IP パケット転送が有効化されていることを確認してください。

    これは次のように確認できます。

    cat /proc/sys/net/ipv4/ip_forward
    

    出力は非ゼロ値 ( たいてい '1' ) のはずです。もしゼロの場合は次のように設定可能です。

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

    この設定は /etc/sysctl.conf に書くことで恒久的にできます。

    net/ipv4/ip_forward=1
    

脚注