tech_memo / Linux / Network


tech_memo/linux

帯域測定

  • RHEL7.2で検証
  • iperfというツールで簡単に実行可能
  • epelのyumリポジトリからダウンロード可能
    [root@testserver13 ~]# yum install -y iperf.x86_64
    • サーバ側
      [root@testserver11 ~]# iperf -s
      ------------------------------------------------------------
      Server listening on TCP port 5001
      TCP window size: 85.3 KByte (default)
      ------------------------------------------------------------
      [  4] local 192.168.122.111 port 5001 connected with 192.168.122.113 port 60782
      [ ID] Interval       Transfer     Bandwidth
      [  4]  0.0-10.0 sec  1.10 GBytes   941 Mbits/sec
  • Client側
    [root@testserver13 ~]# iperf -c testserver11
    ------------------------------------------------------------
    Client connecting to testserver11, TCP port 5001
    TCP window size: 85.0 KByte (default)
    ------------------------------------------------------------
    [  3] local 192.168.122.113 port 60782 connected with 192.168.122.111 port 5001
    [ ID] Interval       Transfer     Bandwidth
    [  3]  0.0-10.0 sec  1.10 GBytes   943 Mbits/sec
  • 上記から、941〜943Mbps(117MByte/s)の性能が確認できる。理論最大値(1Gbps)に近い値が出ていることがわかる。

ソケット性能チューニング

TIME_WAIT状態のソケットが多量に発生する場合

  • カーネルパラメータでTIME_WAITのソケットを再利用することが可能。デフォルトはオフ(0)になっている。
    net.ipv4.tcp_tw_reuse = 1
  • 上記処理を効率化するオプション
    net.ipv4.tcp_tw_recycle = 1
  • その他

Apache

CGIを使用した場合のTimeout時のステータスコード

  • サーバ遅延による、クライアントでのTimeoutは、通常408(Request Timed Out)だが、CGIスクリプトでは、このコードは使用されずに、504(Gateway Timed Out)が返される。全く意味が違うコードが返されてしまうので注意。

Apache proxyを使用したSSL通信

  • /etc/httpd/conf.d配下に以下のようなconfigファイルを作成する
    • 以下はOEMに接続するための例
      ProxyRequests Off
      ProxyPass /em https://192.168.122.1:1158/em
      ProxyPassReverse /em https://192.168.122.1:1158/em # Location-HeaderのURLを/emに置き換える
      SSLProxyEngine on
  • configファイルの再読み込み
    [root@testserver18 conf.d]# /etc/init.d/httpd reload
  • http://testserver18x/em で192.168.122.1のOEMに接続できるようになる

ksoftirqdのCPU使用率が高い

ksoftirqdとは

  • ソフト割り込みを監視するカーネルスレッド
  • ハードウェア割り込みと、ソフト割り込みには以下の種類があるあらしい
    ハードウェア割り込みソフト割り込み
    イーサネットドライバ処理TCP/IPプロトコル処理
    SCSIホストバスアダプタドライバ処理SCSIプロトコル処理
    シリアルドライバ処理端末制御処理

本問題で確認すべきこと

  • TCP/IP処理を複数コアで負荷分散しているか
  • NICのoffloadingは有効か
  • NICのドライバのバージョンは最新か

TCP/IP処理が複数コアで負荷分散されているかの確認方法

  • /proc/interruptsで確認できる。以下のように、複数のCPUに割り込み回数が表示されていれば分散されている。
               CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
    ~
    ~
     59:    2737128    4382397    4775326    4548323    4032798    4624852    4634322    4599073  IR-PCI-MSI-edge      eth0-TxRx-0
     60:    4564033    6066598    5637284    6038553    5172689    4824758    4282604    5288231  IR-PCI-MSI-edge      eth0-TxRx-1
     61:    4013084    6714666    5265310    4299817    4408492    4458822    4236096    4587897  IR-PCI-MSI-edge      eth0-TxRx-2
  • CPUコア負荷分散されていない場合は、下記のように表示される
    $ cat /proc/interrupts 
               CPU0       CPU1       CPU2       CPU3       
     34:   12093133          0          0          0  IR-PCI-MSI-edge      eth1-rx-0
     35:   12032740          0          0          0  IR-PCI-MSI-edge      eth1-tx-0
     36:          2          0          0          0  IR-PCI-MSI-edge      eth1
  • 負荷分散されていないと、CPU使用率も%softがひとつのCPUに集中する
     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
     all   11.79    0.00   20.86    0.05    0.00   15.72    0.00    0.00   51.59
       0   16.60    0.00   24.60    0.00    0.00   52.80    0.00    0.00    6.00
       1    4.32    0.00    9.67    0.00    0.00    1.44    0.00    0.00   84.57
       2   22.58    0.00   42.34    0.00    0.00    6.65    0.00    0.00   28.43
       3    3.37    0.00    6.94    0.20    0.00    1.98    0.00    0.00   87.50

負荷分散されていない場合の対処

  • A)B)のどちらかを実行する

A) RHEL6系の場合(RHEL5でもカーネルバージョンを上げれば可能)

  • RPS/RFSを使用
    # echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus
    # echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
    # echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
    
    /sys/class/net/eth0/queues/rx-0/rps_cpus は使用するCPUを指定します。
    各コアを使用するかのフラグと2進数で各ビットを立て、16進数に変換します。
    1,2コアを使用する場合は
    2進数で 11 → 16進数に変換して3を設定。
    1,2,3,4コアを使用する場合は
    2進数で 1111 → 16進数に変換してfを設定。

B) RHEL5, 6共通

  • NICがRSS(Receive Side Scaling)対応しているか確認。(NICの型番などから確認)
  • 対応していれば、chkconfigコマンドで、サーバ起動時にirqbalanceが起動するように変更して、サーバ再起動
    • 本来は動的にirqbalanceを起動できるはずだが、NICによっては、サーバ起動時にirqbalanceが実行されないと有効にならないものもあるらしい
  • 参考 : http://d.hatena.ne.jp/sfujiwara/20121221/1356084456

NICのoffloading

  • TCP/IPの通信処理をサーバではなく、NICのCPUで行わせる。以下、東京testserver12のコンフィグ状況
    [root@testserver12 ~]# ethtool -k eth0
    Offload parameters for eth0:
    rx-checksumming: on
    tx-checksumming: on
    scatter-gather: on
    tcp-segmentation-offload: on
    udp-fragmentation-offload: off
    generic-segmentation-offload: on
    generic-receive-offload: on
    large-receive-offload: off
  • offloadingのON/OFF切り替え。(TCP segmentationのoffloadingを有効にする場合)
    [root@testserver11 ~]# ethtool -K eth2 tso on
    • 各オプションのON/OFF切り替え方法は、manコマンドで確認するとよい

その他

  • NICのドライバのバージョンを最新にする(ドライバのバグでCPU負荷分散ができていないとか)
  • PCIではなく、On boadにNICを差していないか?

NIC offload

tcpdump

  • 22番ポートの受信情報
    tcpdump src port 22
  • 22番ポートの送信情報
    tcpdump dst port 80
  • 通信先ホストを限定
    tcpdump host <HostName>
  • -vでfull protocol decode。
    tcpdump -v host <HostName>
  • 受信情報のみ表示
    tcpdump src host <HostName>
  • 送信情報のみ表示
    tcpdump dst host <HostName>
  • 通信メッセージも表示
    tcpdump -X host <HostName>

Port

リモートホストがオープンしているPort番号を調べる

  • nmapコマンドで調べれる
    [root@myserver xinetd.d]# nmap k1
    
    Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2013-10-03 08:27 JST
    mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns_servers
    Interesting ports on k1 (192.168.122.11):
    Not shown: 1674 closed ports
    PORT     STATE SERVICE
    22/tcp   open  ssh
    111/tcp  open  rpcbind
    1158/tcp open  lsnr
    1521/tcp open  oracle
    5520/tcp open  sdlog
    8888/tcp open  sun-answerbook
    
    Nmap finished: 1 IP address (1 host up) scanned in 0.166 seconds

ポートをオープンしているプロセスを調べる

  • rootユーザで-iオプションのあとに、:ポート番号でわかる。ポート番号はカンマ区切りで複数指定可能
    [root@myserver ~]# lsof -i  :1198
    COMMAND   PID     USER   FD   TYPE   DEVICE SIZE NODE NAME
    java    15479 shishimaru  135u  IPv6 67880001       TCP *:cajo-discovery (LISTEN)
  • 参考

proxy例外設定

no_proxy=localhost,.example.com 

wgetコマンド専用 proxy設定

  • /etc/wgetrcファイルに設定できる。(なぜかmyserverを再起動したら、192.168.0.1のproxy設定が有効になっていた)
    # You can set the default proxies for Wget to use for http and ftp.
    # They will override the value in the environment.
    #http_proxy = http://proxy.yoyodyne.com:18023/
    #ftp_proxy = http://proxy.yoyodyne.com:18023/
    
    #http_proxy = 192.168.0.1:8080
    #ftp_proxy = 192.168.0.1:8080

tracertコマンド (宛先IPまでのルータの経路を知る)

  • root専用はtracertコマンド。
    [root@myserver ~]# tracert testserver11
    traceroute to testserver11 (192.168.122.111), 30 hops max, 40 byte packets
     1  gwserver (192.168.0.1)  0.444 ms  0.435 ms  0.434 ms
     2  testserver18x (10.99.99.204)  0.676 ms  0.676 ms  0.675 ms
     3  testserver11 (192.168.122.111)  0.919 ms  0.920 ms  0.918 ms
  • 一般ユーザはtracerouteコマンドを使う。(tracertとの違いは不明)
    shishimaru@myserver% traceroute testserver11                                 
    traceroute to testserver11 (192.168.122.111), 30 hops max, 40 byte packets
     1  gwserverx (192.168.0.1)  0.490 ms  0.475 ms  0.466 ms
     2  testserver18x (10.99.99.204)  0.703 ms  0.684 ms  0.677 ms
     3  testserver11 (192.168.122.111)  0.927 ms  0.883 ms  0.874 ms

Windowsマシンに対して、tracerouteの結果が返ってこない。

  • LinuxのtracerouteはデフォルトでUDPを使用しているが、なぜかWindowsがUDPのResponseを返さない。ICMP(ping)を使用することでResponseが返ってくる。
    [root@testserver10 ~]# traceroute -I 192.168.0.12
    traceroute to 192.168.0.12 (192.168.0.12), 30 hops max, 60 byte packets
     1  testserver18 (192.168.122.118)  0.135 ms  0.161 ms  0.163 ms
     2  gwserver (10.99.99.228)  0.390 ms  0.396 ms  0.396 ms
     3  192.168.0.12 (192.168.0.12)  0.616 ms  0.625 ms  0.624 ms

sshd


ssh

proxyサーバ経由でssh接続

  • sshコマンドの場合
    ssh -o ProxyCommand='nc -X connect -x <ProxyServer>:<Proxy Port> %h %p' <ユーザー>@<接続先IP>
  • puttyの場合
    • 接続 > プロキシにて
      • プロキシタイプ:HTTP
      • プロキシホスト名:プロキシサーバのホスト名またはIP
      • ポート:プロキシサーバのポート
      • 他はデフォルト

HTTP 403のエラーが発生する場合

  • プロキシサーバの設定で、ポート22への転送を禁止している可能性が高い。大抵は、ポート80と443しか許容していない。
  • ssh接続先でどちらかのポートが未使用であれば、iptablesでポートリダイレクトすることで、解決する
    iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 22

ログインが遅い

  1. クライアントの名前解決が原因
    • ssh サーバの /etc/hosts にクライアントの設定を書く
    • DNSに問題がある場合、DNSを利用しないように、/etc/ssh/sshd_config に以下の設定を入れる.
      UseDNS no
  2. GSSAPI 認証が遅い
    • GSSAPI 認証を試みているので時間がかかる? /etc/ssh/ssh_config に以下の設定を入れる
      GSSAPIAuthentication no
  3. IPv6 が原因
    • IPv6 で接続しようとしているか,IPv6 で名前解決しようとしているかで,できなくて時間がかかっている。
    • IPv4(inet) のみを使用するよう、/etc/ssh/ssh_config に以下の設定を入れる.
      AddressFamily inet

ssh時に「get_socket_address: getnameinfo 8 failed: Name or service not known」

  • testserver18からmyserverにsshやscpを実行すると以下のエラーがでる。(接続自体は可能)
    get_socket_address: getnameinfo 8 failed: Name or service not known
    userauth_hostbased: cannot get local ipaddr/name
    root@myserver's password:
  • testserver18の/etc/hostsのeth0(globalIP)の記述が間違っており、修正したところ解消された。
  • 原因の詳細は未調査だが、下記に同じ問題のブログあり

ホストベース認証によるパスワードの省略

  • サーバ側設定
    • /etc/ssh/sshd_config
      HostbasedAuthentication yes
    • sshdサービス再起動
    • ホストベース認証を許可するサーバを$HOME/.shostsに登録。
      testserver testuser
      testserver18
      • 上記だと、testserverのtestuserでの接続を許可。testserver18も許可。testserver18はユーザ名を書いていないので、サーバ側と同じユーザからのみ許可。
    • パーミッション変更
      chmod 600 .shosts
    • クライアント側の公開鍵を、サーバ側の.ssh/known_hostsに登録するために、一度だけサーバからクライアントにsshで接続する。
      ssh testserver18 # from サーバ
  • クライアント側設定
    • /etc/ssh/ssh_config
      EnableSSHKeysign yes
      HostbasedAuthentication yes

SSH公開鍵を複数サーバに自動で追加する

多段SSH (Gatewayサーバに指定コマンドを実行させる)

  • /.ssh/configを使用したフォワード

sshコマンドでのポートフォワード

  • 標準でフォワーディングの機能がある
    # ssh -L <localポート>:<転送先サーバ>:<転送先ポート> [<転送先ユーザ>@]<転送先サーバ>
    • 接続元の8080ポートに接続すると、remoteserverの80番ポートに転送される設定
      ssh -L 8080:remoteserver:80 remoteserver
  • リモート側のポートをローカルに転送させる場合
    # ssh -R <リモートポート>:<転送先サーバ>:<転送先ローカルポート> [<転送先ユーザ>@]<転送先サーバ>

sshの同時接続数

ssh/scp のhost key checkの無視

scp -oStrictHostKeyChecking=no file ip:/tmp

IP、サブネット(ネットワークアドレス)、ネットマスク設定

  • ネットマスク : IPとネットマスクの論理積でサブネットが求まる
    • IP 192.168.122.126, netmask 255.255.255.192 --> network 192.168.122.64
  • サブネットの計算はipcalcコマンドが便利
    ipcalc 192.168.122.126 -n 255.255.255.192
    NETWORK=192.168.122.64
  • 一時的設定(再起動後元に戻る)
    • ifconfig eth0 <IP> netmask <netmask>
  • 永続設定
    • /etc/sysconfig/network-scripts/ifcfg-eth0を編集
      DEVICE=eth0
      HWADDR=8C:89:A5:2C:00:16
      ONBOOT=yes
      BOOTPROTO=static
      IPADDR=192.168.122.11
      NETMASK=255.255.255.0
    • 編集後以下のコマンドで再起動
      ifdown eth0
      ifup eth0

routing table

  • 確認方法
    [root@k1 network-scripts]# netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    192.168.122.64   0.0.0.0         255.255.255.192 U         0 0          0 eth0
    192.168.122.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
    0.0.0.0         192.168.122.118  0.0.0.0         UG        0 0          0 eth0
  • Destination : 送信元サブネット。送信元のサブネットと一致するものがあれば、自分で応答する。そうでないときはGateWay?に転送する。
  • GateWay?(0.0.0.0以外) : Destinationがどれにも該当しないときの転送先。上記のこと。
  • Iface : 送信先への応答する際のNIC
  • 追加
    route add -net 192.168.122.64 netmask 255.255.255.192 eth0
  • 削除
    route delete -net 192.168.122.64 netmask 255.255.255.192 eth1
  • testserver18経由でVNC接続できるようにする
    route add -net 0.0.0.0 gw 192.168.122.118 netmask 0.0.0.0 eth0
  • 恒久設定
    • http://network.station.ez-net.jp/os/linux/routing/table/centos/5.5.aspより
    • 設定ファイル作成
      vi /etc/sysconfig/network-scripts/route-eth0 # 対象のeth番号にして作成
    • 192.168.10.0サブネットにeth0で通信する
      192.168.10.0/24 dev eth0
    • gatewayを設定する場合
      192.168.10.0/24 via 192.168.122.118
    • networkリスタート(一瞬通信切れる)
      service network restart

サーバ起動時の自動設定

  • /etc/sysconfig/network-scripts/route-eth1に以下のように記述。下記例はtestserver18
    224.0.0.1 dev eth1
    192.168.10.0/24 dev eth1
  • routing table
    [root@testserver18 network-scripts]# netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    224.0.0.1       0.0.0.0         255.255.255.255 UH        0 0          0 eth1
    192.168.122.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
    192.168.21.0    10.99.99.89     255.255.255.0   UG        0 0          0 eth0
    192.168.0.0     10.99.99.228    255.255.255.0   UG        0 0          0 eth0
    192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
    10.84.72.0      0.0.0.0         255.255.252.0   U         0 0          0 eth0
    169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
    224.0.0.0       0.0.0.0         240.0.0.0       U         0 0          0 eth0
    0.0.0.0         10.99.99.254    0.0.0.0         UG        0 0          0 eth0
  • testserver11で、下記のように実行するとエラーが出た
    • routing table
      [root@testserver11 ~]# netstat -nr
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
      192.168.122.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
      192.168.20.0    0.0.0.0         255.255.255.0   U         0 0          0 eth2
      192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 eth3
      169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth3
      0.0.0.0         192.168.122.118  0.0.0.0         UG        0 0          0 eth0
  • 実行コマンド
    [root@testserver11 network-scripts]# vi /etc/sysconfig/network-scripts/route-eth3
     192.168.122.0/24 dev eth3
    [root@testserver11 network-scripts]# ifup eth3
    エラーメッセージ(FILE EXISTS的な感じ)
  • 192.168.122.0/24がeth0のデフォルトとしてあがっているため?

サーバ起動時の自動設定 その2

  • /sbin/ifup-localに以下のようなシェルを書く
    #!/bin/sh
    
    dev=$1 
    
    if [ "$dev" = eth3 ]; then
            /sbin/route add -net 192.168.122.0/24 dev eth3;
    fi
  • 仕組みとしては以下の順に呼び出される。
    1. サーバ起動
    2. /etc/init.d/network
    3. /sbin/ifup
    4. /sbin/ifup-local
  • よって手動でifupしても/sbin/ifup-localが呼ばれるのでroutingも設定される。

デフォルトゲートウェイ

  • 以下で追加可能
    [root@testserver11 ~]# route add default gw 192.168.122.118 eth0
    • ただし、上記のケースの場合、eth0が192.169.22.0のroutingに登録されていないとエラーになる
      [root@testserver11 ~]# netstat -nr
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
      192.168.122.0    0.0.0.0         255.255.255.0   U         0 0          0 eth2
      192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 eth2
      [root@testserver11 ~]# route add default gw 192.168.122.118 eth0
      SIOCADDRT: No such process
    • 一度、eth0に、192.168.122.0のroutingを追加すればよい
      [root@testserver11 ~]# route add -net 192.168.122.0 netmask 255.255.255.0  eth0
      [root@testserver11 ~]# route add default gw 192.168.122.118 eth0
      [root@testserver11 ~]# netstat -nr
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
      192.168.122.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
      192.168.122.0    0.0.0.0         255.255.255.0   U         0 0          0 eth2
      192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 eth2
      0.0.0.0         192.168.122.118  0.0.0.0         UG        0 0          0 eth0
      [root@testserver11 ~]# route delete -net 192.168.122.0 netmask 255.255.255.0  eth0
      [root@testserver11 ~]# netstat -nr
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
      192.168.122.0    0.0.0.0         255.255.255.0   U         0 0          0 eth2
      192.168.10.0    0.0.0.0         255.255.255.0   U         0 0          0 eth2
      0.0.0.0         192.168.122.118  0.0.0.0         UG        0 0          0 eth0
  • 恒久設定
    • /etc/sysconfig/networkに記述する
      NETWORKING=yes
      GATEWAY=192.168.122.118
      HOSTNAME=testserver14

iptables

  • Table 確認
    • filterテーブル
      iptables -L
      • 上記は、下記と同義
        iptables -L -t filter
    • natテーブル
      iptables -L -t nat
  • IP拒否
    iptables -I INPUT -s 192.168.122.15 -j DROP
  • 設定解除。iptables -Lで表示されたリストの順番を指定。下記だと1番目の設定を解除。
    iptables -D INPUT 1
  • 永続化
    • 以下のコマンドで、/etc/sysconfig/iptablesに現在の設定が保存される。次回起動時には、このファイルの設定でファイアウォールが設定される
      [root@vm65a ~]# service iptables save
      iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

仮想IP設定

MTU

  • Maximum Transmission Unit
  • 確認方法
    • ifconfigから取れる
      [ptestuser@testserver18:1]$ ifconfig     
      eth0      Link encap:Ethernet  HWaddr 40:61:86:D2:94:1C
                inet addr:10.99.99.204  Bcast:10.99.99.255  Mask:255.255.252.0
                inet6 addr: fe80::4261:86ff:fed2:941c/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:327200747 errors:0 dropped:0 overruns:0 frame:0
                TX packets:303089401 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:100
                RX bytes:199800634095 (186.0 GiB)  TX bytes:158600448691 (147.7 GiB)
                Memory:df940000-df960000
    • 上記の 「MTU:1500」 は1500byteをあらわす。

arp

  • arpって?
    • pingとかするときに対象のIPをもつノードが誰なの、全体に聞く。このとき、最初に返ってくる返事みたいなものがarp。arpを出したノードに対してリクエストを行う。
    • arpはデフォルトではリクエストIPのNICのMACアドレスが返ってくる。
    • arpコマンドで履歴が見れる
      [root@k2 ~]# arp -a
      k1 (192.168.122.11) at 8C:89:A5:2C:00:16 [ether] on eth0
      dbserver (192.168.122.1) at 40:61:86:D1:6F:28 [ether] on eth0
      testserver18 (192.168.122.118) at 40:61:86:D2:94:1D [ether] on eth0
      k1-vip (192.168.122.13) at 8C:89:A5:2C:00:16 [ether] on eth0
      ? (169.254.61.71) at 8C:89:A5:2C:00:17 [ether] on eth1
      k1-priv (192.168.0.10) at 8C:89:A5:2C:00:17 [ether] on eth1
  • トラブル
    • eth0同士でつながっているマシンが数台あり、192.168.0.11をもっているマシンがAとB二台あった。ただし、Aはeth0, Bはeth1にそのアドレスが割り振られている。
      1. Cというマシンからpingしたときに先にAがarpをくれればいいが、Bが返すとpingは通らない。Bはeth0(IPは別物。通信はできる)で自分が192.168.0.11を(eth1に)持っていることを感知。
      2. Bはeth1のMACアドレスをこのとき返す。(リクエストIPのNICのアドレスを返す)
      3. CはBからarpが返ってきたので、Bにpingを送る。
      4. Bはeth0で受け取るが(設定にもよるが)返事はeth1で返そうとするが物理的につながっていないので返せない。
      5. Cからはpingがとおらないように見える(送れているけど還ってこない)。
      6. そもそもBに間違えてIPを設定してしまっている。が、IPの変更はできない状況とする。
      7. Bがarpを返すときに受信NICではなく指定IPのNICで返そうとする設定は以下
        # set because eth1 has same IP address with silver servers
        net.ipv4.conf.eth0.arp_ignore = 2 # default=0
        net.ipv4.conf.eth1.arp_ignore = 2
      8. これでBがarpを返そうとしてもeth1では返せないので、CがBと通信をすることはなくなる。→ Aが必ず先にarpを返す。

sar

  • sarでネットワーク監視する場合
    sar -n DEV 1 1000
    
    03:09:35 PM     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s  rxmcst/s
    03:09:36 PM        lo      0.99      0.99    170.30    170.30      0.00      0.00      0.00
    03:09:36 PM      eth0      6.93      1.98    556.44    669.31      0.00      0.00    132.67
    03:09:36 PM      eth1     21.78     13.86  16006.93   5725.74      0.00      0.00      0.00
    03:09:36 PM      sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00