5か月くらいハマっていた問題が解決したのでメモ。
環境
- ホスト: NetBSD/i386 8.0 (OpenSSH 7.6)
- 回線: フレッツ光ネクスト (NTT西日本) + DTI IPv6 (IPoE) 接続サービス
- 接続: VDSLモデム + ホームゲートウェイ RT-500KI (ファームウェア 05.00.0020)
問題
ホストの NetBSD/i386 8.0 からインターネット上の外部ホスト (IPv4, IPv6 ともに持つ VPS上のホスト) への操作が、以下のようになる。
- ssh -6 での IPv6 の外部ホストへのログイン:
→ 問題なし - scp -6 での IPv6 の外部ホストへのコピー:
→ パスフレーズの入力画面までは進むが、パスフレーズ入力後の転送が開始されず、 progress meter も表示されない - cvs, rsync での IPv6 の SSH 経由転送:
→ パスフレーズの入力画面までは進むが、パスフレーズ入力後の転送が開始されずタイムアウトする - scp, cvs, rsync の IPv4 外部ホストへの接続:
→ いずれも正常に動作する
ホームゲートウェイのセキュリティログには関連するパケットフィルターの記録は残っておらず、宅内フィルタの設定の問題ではないと思われたが、結局解決策がわからず、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網のフィルタに引っかかるようなので記述を修正
参照リンク
- 直接的 Q&A
teratail - 「IPv6でscpできない」 - DSCP について
DSCP ( Differentiated Services Code Point ) - 「フレッツ光網で DSCP 値をよく考えずに NGN 網に流すと黙って局側で drop される」
VPN 越しの Cisco WLC で WPA2 の SSID に associate できない時の罠 - OpenSSH 7.8 での QoS デフォルト設定の変更
BitHive - Fedora29への更新
OpenBSD SSH CVS log
OpenSSH 7.8 Changelog - VMware で QoS (DSCP) が設定されている場合の問題
VMware forum - SSH connections dropped due to QoS flags
まとめ
- OpenSSH 7.7 以前の
IPQoS
設定のデフォルトは
対話型セッションではlowdelay
非対話型セッションではthroughput
- フレッツ光網の NGN網に DSCP値 (TOS値) が
throughput
の IPv6 パケットを送ると drop される - 以上の2つの理由により SSH の IPv6 経由の非対話型セッションが接続不能になる
- 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
上記からすると lowdelay
も throughput
も DEPRECATED (非推奨) であるが、 throughput
のパケットのみが drop される(≒「許容されたプロトコルと転送優先度の組み合わせ以外のパケットに転送優先度を指定することは許容しません」のフレッツ網制限規定に該当する)理由は未確認。