tsutsuiの作業記録置き場

NetBSDとかPC-6001とかの作業記録のうち、Twitterの140字では収まらない内容や記事としてまとめるべき内容をとりあえず置いてみる予定

フレッツ光ネクスト + IPoE で scp, cvs, rsync の SSH通信ができない問題

5か月くらいハマっていた問題が解決したのでメモ。

環境

問題

ホストの NetBSD/i386 8.0 からインターネット上の外部ホスト (IPv4, IPv6 ともに持つ VPS上のホスト) への操作が、以下のようになる。

ホームゲートウェイのセキュリティログには関連するパケットフィルターの記録は残っておらず、宅内フィルタの設定の問題ではないと思われたが、結局解決策がわからず、IPv6で接続可能な scp/cvs/rsync 対象ホストに対しては明示的に IPv4 で接続する設定を書いて暫定対策していた。

解決策

ホストの ssh の設定 (/etc/ssh/ssh_config もしくは ~/.ssh/config) に以下のように IPQoS の設定で DSCP の指定を追加することで IPv6経由の接続も正常に動作するようになった。

IPQoS 0x00

もしくは

IPQoS af21 cs1

もしくは

IPQoS lowdelay none

等々。
2番目の設定が OpenSSH 7.8 以降のデフォルトなのでオススメと思われるが、VMware上では別の問題を引き起こす(後述)ようなので、環境により使い分ける必要があるようである。
2019/2/8 2:42 追記: af21 も後述のフレッツ光 NGN網のフィルタに引っかかるようなので記述を修正

参照リンク

まとめ

  • OpenSSH 7.7 以前の IPQoS 設定のデフォルトは
    対話型セッションでは lowdelay
    非対話型セッションでは throughput
  • フレッツ光網の NGN網に DSCP値 (TOS値) が throughputIPv6 パケットを送ると drop される
  • 以上の2つの理由により SSHIPv6 経由の非対話型セッションが接続不能になる
  • OpenSSH の SSH 設定 (/etc/ssh/ssh_config もしくは ~/.ssh/config) の IPQoS 設定で非対話型セッションの DSCP 値を以下のいずれかにすることで解決可能
    • 0x00 (CS0)
    • cs1 (OpenSSH 7.8 以降の非対話型セッションデフォルト)
    • none (OSのデフォルト設定を使用)

備考

  • OpenSSH の IPQoS 設定の違いによる実際の通信速度やレイテンシの差が体感できるのかは未確認
  • DSCP 値 (TOS値) の具体的なマクロ定義は /usr/include/netinet/ip.h にある
    /*
    * Definitions for DiffServ Codepoints as per RFC2474
    */
    #define IPTOS_DSCP_CS0 0x00
    #define IPTOS_DSCP_CS1 0x20
    #define IPTOS_DSCP_AF11 0x28
    #define IPTOS_DSCP_AF12 0x30
    #define IPTOS_DSCP_AF13 0x38
    #define IPTOS_DSCP_CS2 0x40
    #define IPTOS_DSCP_AF21 0x48
    #define IPTOS_DSCP_AF22 0x50
    #define IPTOS_DSCP_AF23 0x58
    #define IPTOS_DSCP_CS3 0x60
    #define IPTOS_DSCP_AF31 0x68
    #define IPTOS_DSCP_AF32 0x70
    #define IPTOS_DSCP_AF33 0x78
    #define IPTOS_DSCP_CS4 0x80
    #define IPTOS_DSCP_AF41 0x88
    #define IPTOS_DSCP_AF42 0x90
    #define IPTOS_DSCP_AF43 0x98
    #define IPTOS_DSCP_CS5 0xa0
    #define IPTOS_DSCP_EF 0xb8
    #define IPTOS_DSCP_CS6 0xc0
    #define IPTOS_DSCP_CS7 0xe0
    /*
    * Definitions for IP type of service per RFC1349 (ip_tos)
    * DEPRECATED
    */
    #define IPTOS_LOWDELAY 0x10
    #define IPTOS_THROUGHPUT 0x08
    #define IPTOS_RELIABILITY 0x04
    #define IPTOS_MINCOST 0x02

上記からすると lowdelaythroughput も DEPRECATED (非推奨) であるが、 throughput のパケットのみが drop される(≒「許容されたプロトコルと転送優先度の組み合わせ以外のパケットに転送優先度を指定することは許容しません」のフレッツ網制限規定に該当する)理由は未確認。