スキップしてメイン コンテンツに移動

IPv4 WAN load balancing

IPv4でWANロードバランシングルータをマーキングをつかいDebian10/Busterにて設定してみました。構成は以下の通りです。なお、冗長構成は今回含んでいませんのであらかじめご了承ください。
早速、構成ですが、クライアントマシンがenp3s0に対してipv6とipv4で接続できていること、フォワードができていることが前提ですが、ここでは割愛します。
まずはネットワークインターフェースの設定をしておきます。
#/etc/network/interfaces.d/enp3s0
auto enp3s0
iface enp3s0 inet static
  address 192.168.255.23
  netmask 255.255.255.0
iface enp3s0 inet6 static
  address fd5b:1234:5678:1350::23/60

#/etc/network/interfaces.d/enp1s0f0
auto enp1s0f0
iface enp1s0f0 inet static
  address 192.168.1.201
  netmask 255.255.255.0

iface enp1s0f0 inet6 static
  address 240d:8765:4321:1351::23/64

#/etc/network/interfaces.d/enp1s0f1
auto enp1s0f1
iface enp1s0f1 inet static
  address 192.168.1.202
  netmask 255.255.255.0

iface enp1s0f1 inet6 static
  address 240d:8765:4321:1352::23/64
見てわかるように、どのインターフェースでもgatewayの設定はここでは行いません。gatewayの設定+αはこちらで行います。自動実行されるようにchmod +xしておいてください。
#/etc/network/if-up.d/0000-v4-lb
#!/bin/sh
ip route add default proto static metric 20 \
    nexthop via 192.168.1.2 dev enp1s0f0 weight 1 \
    nexthop via 192.168.1.4 dev enp1s0f1 weight 1

ip route add default via 192.168.1.2 dev enp1s0f0 table 201
ip route add default via 192.168.1.4 dev enp1s0f1 table 202

ip rule add from all fwmark 0xc9 table 201
ip rule add from all fwmark 0xca table 202
最初の部分が、Weighted ECMPです。今回は回線の理論最大速度が同じなので、weight値を1と1で等価にしておきます。つづいて、真ん中と下のほうは、fwmarkによって使用するテーブルを設定しています。
続いてiptablesの設定です。なお、iptablesの設定保持にiptables-persistentパッケージを予めインストールしてきます。
iptables -t nat -N PRE_SNAT_HOOK
iptables -t nat -N WANLOADBALANCE

iptables -t nat -A POSTROUTING -j PRE_SNAT_HOOK
iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -o enp1s0f0 -m comment --comment SRC-NAT-201 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -o enp1s0f1 -m comment --comment SRC-NAT-202 -j MASQUERADE
iptables -t nat -A PRE_SNAT_HOOK -j WANLOADBALANCE
iptables -t nat -A WANLOADBALANCE -m connmark --mark 0xc9 -j SNAT --to-source 192.168.1.201
iptables -t nat -A WANLOADBALANCE -m connmark --mark 0xca -j SNAT --to-source 192.168.1.202


iptables -t mangle -N WANLOADBALANCE_PRE
iptables -t mangle -N ISP_enp1s0f0
iptables -t mangle -N ISP_enp1s0f1

iptables -t mangle -A PREROUTING -j WANLOADBALANCE_PRE
iptables -t mangle -A WANLOADBALANCE_PRE -i enp3s0 -m state --state NEW -m statistic --mode random --probability 0.50000000000 -j ISP_enp1s0f0
iptables -t mangle -A WANLOADBALANCE_PRE -i enp3s0 -m state --state NEW -j ISP_enp1s0f1
iptables -t mangle -A WANLOADBALANCE_PRE -i enp3s0 -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff

iptables -t mangle -A ISP_enp1s0f0 -j CONNMARK --set-xmark 0xc9/0xffffffff
iptables -t mangle -A ISP_enp1s0f0 -j MARK --set-xmark 0xc9/0xffffffff
iptables -t mangle -A ISP_enp1s0f0 -j ACCEPT

iptables -t mangle -A ISP_enp1s0f1 -j CONNMARK --set-xmark 0xca/0xffffffff
iptables -t mangle -A ISP_enp1s0f1 -j MARK --set-xmark 0xca/0xffffffff
iptables -t mangle -A ISP_enp1s0f1 -j ACCEPT
こちらはいったんシェルで実行して、先ほどインストールしたiptables-persistentで設定を保存します。
iptables-save > /etc/iptables/rules.v4
iptablesの方をざっと説明すると、-t mangleの部分では、enp1s0f0とenp1s0f0を1/2づつの確率でパケットにマーキングし、-tnatのほうはマスカレードとマーキングによるパケットの仕分けです。IPv4のロードバランスは設定としてはこれだけです。冗長構成は入っていないので非常にシンプルですね。設定がすんだら、端末から外部に接続できるかまず確認します。接続ができていれば、後はロードバランスされているかどうか以下のコマンドで確認します。
iptables -t nat -L -n -v
(中略)
Chain WANLOADBALANCE (1 references)
 pkts bytes target     prot opt in     out     source               destination
 1048 76756 SNAT       all  --  *      *       0.0.0.0/0            0.0.0.0/0            connmark match  0xc9 to:192.168.1.201
 1055 71715 SNAT       all  --  *      *       0.0.0.0/0            0.0.0.0/0            connmark match  0xca to:192.168.1.202
このように負荷分散されていれば成功です。確認サイトなどを使うと、異なるIPアドレスで切り替わり接続できることがわかると思います。

以上、マーキングを使った冗長構成なしのIPv4でのWAN Load balancingでした。ではまた。

コメント

このブログの人気の投稿

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかも...

Windows デバイス暗号化 のサポートで "許可されていない dma 対応バス/デバイスが検出されました"の対処

Windows でセキュリティー関係を見ているのですが、とあるPCでmsinfo32で確認すると"デバイス暗号化のサポート"で"許可されていない dma 対応バス/デバイスが検出されました"と出ていました。このPCの場合、それ以外はOK(なにも表示されない)だったのですが、ネットでしらべるとMSのドキュメントではハードウェアベンダーに問い合わせるなどと敷居が高く具体的にどこが引っかかっているかわかりません。そこでほかに方法はないかとしらべやってみたところ、"前提条件をみたしています"まで持って行けたので、本稿を挙げた次第です。 具体的には、以下のようにします。 1-a. 許可するDMA対応バス・デバイスを指定するレジストリの所有権と書き込み設定をおこなう。 以下のレジストリキーの所有者を自分自身(管理ユーザ)のものにし、フルコントロール権を付与する。 HKLM\SYSTEM\CurrentControlSet\Control\DmaSecurity\AllowedBuses もしくは 1-b. MicrosoftよりPsExecをダウンロードし、System権限でRegeditを立ち上げ編集する。 Microsoftより、https://docs.microsoft.com/en-us/sysinternals/downloads/psexec にある こちら をダウンロードし、解凍する。解凍すると、x64の場合、PsExec64.exeがあるので、管理者権限で以下を実行し、システム権限でregeditを立ち上げることが出来るようになる。 cd Downloads\PSTools .\PsExec64.exe -sid C:\Windows\regedit.exe 2-a. パワーシェルスクリプトを実行し、PnPデバイスのうちインスタンスがPCIで始まるものを"AllowedBuses"に追加する。 以下のパワーシェルスクリプトを作成する。たとえばDocuments\allow-dma-bus-device.ps1として作成する。( こちらの記事のものを使用させていただきました: Thank you! ) $tmpfile = "$($env:T...

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-...