Release v0.1.0-beta.4 · sigp/discv5 · GitHub
個人的に気になった機能のソースコードを追ったのでメモ。
同一サブネットのノード数を制限する
Adds an abstract filter to the local routing table, allowing easier ways to filter entries from being added to the table. This is currently used for creating limits on IP ranges and incoming/vs outgoing nodes.
以前から、怪しいノードを BANする機能 は実装されていたが、それとは別にIPアドレスベースでフィルタする機能が実装された。
機能
- ルーティングテーブル内に同じ /24 サブネットに属するノード数の上限を設ける
- テーブル単位、バケット単位で上限が設定される
実装
同じ /24 サブネットに属するノード数が制限値内であるかどうかを確認している
2種類のフィルタ
- IpTableFilter
- IpBucketFilter
- Bucketで利用するフィルタ
- 「Bucket内に、同じ /24 サブネットに属するノード数は 2 まで」に設定されている
設定値のカスタマイズはできない
- ip_limitが設定されている場合にこの制限が有効になる
- https://github.com/sigp/discv5/blob/b1e7ad688228c85e802abc4b165783e4e95db886/src/discv5.rs#L95-L105
- 上記のコメントにかかれているとおり、現状、このフィルタのカスタマイズはできない
セッションに “接続方向” を持たせる
Introduces the concept of connection direction. Sessions that get established are now tagged with either being ingoing or outgoing. This can be used to limit the number of incoming connections allowed per bucket.
- 各ノードとの間のセッションに InComming/Outgoing の方向を持たせて、フィルタリングに利用する
実装
- ConnectionDirectionの定義
- ConnectionDirectionを保持する構造体
- Directionを判断しているコード
- ConnectionDirection::InComming はフィルタリングに使われている
その他の改善
Improves and adds some extra filtering logic to harden the security and limit the allowed actions of malicious actors.
- 該当すると思われるコミット
- 同一IPあたりのノード数の制限を追加
- 制限を超過したIPアドレスはBANリストに追加される
- デフォルトの設定値は 10
- IpVoteのエントリに有効期限が追加された