OpenWRTでのICMPポートノッキング

この記事に感銘を受けて、OpenWRT(Bleeding Edge r38381)を実行しているホームルーターに同様のソリューションを実装することにしました。 解決策はおそらくMikrotikほどエレガントではありませんが、主なことはスクリプトとcronなしで機能することです。 また、他のLinuxオペレーティングシステムでの実装の基礎として使用することもできます。 誰にそれが面白いか私はキャットの下で尋ねます。



私は多くのリソースを登らなければなりませんでした。 また、システムログのiptablesからLOGまたはULOGイベントを追跡するスクリプトを書くことも考えました。 私はプロジェクト-Spectreに出くわしました。このプロジェクトでは、ulogdにはないiptables ULOGイベントへの反応(スクリプト実行)を実装できます。 以下に、ポートノッキングを実装するための古いプロジェクトの大規模な選択を示しますが、ルーターまたは仮想マシンでコンパイルしたくはありませんでした。 解決策を探しているとき、ipsetの速度と利便性についてのヒントを思いついたので、多くの「同一の」ルールでiptableを積み上げないようにしました。 そして、キー「--match-set」と「--add-set」がそれらに気づかれ、さらなる検索が解決につながりました。

一般に、ipsetsを使用することが決定されました。 iptables以外のイベントを追跡したり、イベントに対する反応を記述する必要はありません。



そのため、このソリューションは純粋にiptablesとipsetを使用して実装されます。 認識を簡単にするために、「ノック」の組み合わせは前述の記事と同じになります。 これを思い出させてください-サイズが70バイトの行に2つのICMPパケットがあり、その後ろにサイズが100バイトの行に2つのICMPパケットがあります。 さて、ICMP寄木細工のヘッダーのサイズ(28バイト)を忘れないでください

私の場合、対応する「ノック」の後、「ノック」が作成されたIPアドレスのOpenVPNサーバーのポート1194 / tcpでの接続が許可されます。 OpenWRTでOpenVPNサーバーをセットアップする手順は、公式Wikiにあります。 これはこの記事の範囲を超えています。



IPセットの準備



OpenWRTファイアウォール設定ファイルでipsetsを作成するためのルールのサポートは、Attitude Adjustmentのリリースでのみ現れましたが、リビジョンr36349は機能しませんでした( ルールを適用すると、ipsetsのデータ型が指定されていないという警告を発行しました )。



ただし、ipsetはペンで作成できます。たとえば、/ etc / rc.localに登録するなど、ブート時に作成することをお勧めします。

ipset create knock1 hash:ip ipset create knock2 hash:ip ipset create knock3 hash:ip ipset create AllowedVPN hash:ip
      
      





fw3がipsetsの作成をサポートしている場合(fw3はOpenWRTファイアウォール管理ツール自体であり、設定の詳細な説明は公式Wikiにあります )、次の項目がファイアウォール設定ファイル/ etc / config / firewallに追加されます:
 config ipset option enabled 1 option name knock1 option storage hash option match src_ip config ipset option enabled 1 option name knock2 option storage hash option match src_ip config ipset option enabled 1 option name knock3 option storage hash option match src_ip config ipset option enabled 1 option name AllowedVPN option storage hash option match src_ip
      
      







ICMPパケットシーケンスロジック



最初のノックをキャッチ


 icmptype 8 length 98 ! match-set knock1 src ! match-set knock2 src ! match-set knock3 src ! match-set AllowedVPN src add-set knock1 src
      
      





サイズ98バイトのICMPパケットの発信アドレスは、他のipsetにない場合、ipset knock1に入力されます。



二回目のノックをキャッチ


 icmptype 8 length 98 match-set knock1 src ! match-set knock2 src ! match-set knock3 src ! match-set AllowedVPN src add-set knock2 src
      
      



98バイトの発信ICMPパケットアドレスは、ipset knock2にすでに入力されており、残りはipset knock1に含まれています。



3番目のノックをキャッチ


 icmptype 8 length 128 match-set knock1 src match-set knock2 src ! match-set knock3 src ! match-set AllowedVPN src add-set knock3 src
      
      



128バイトの発信ICMPパケットアドレスは、ipset knock1およびknock2にも存在し、AllowedVPNには存在しない場合、ipset knock3に入力されます。



4回目のノックをキャッチ


 icmptype 8 length 128 match-set knock1 src match-set knock2 src match-set knock3 src ! match-set AllowedVPN src add-set AllowedVPN src
      
      





128バイトICMPパケットの発信アドレスは、ipset knock1、knock2、およびknock3にも存在する場合、ipset AllowedVPNに入力されます。

シーケンスを正しくキャッチするには、iptablesのルールを逆の順序で入力する必要があります 。 そうしないと、3番目の「ノック」が3番目と4番目のルールにすぐにキャッチされるように、最初の「ノック」はすぐに1番目と2番目のルールにキャッチされます。

他のipsetsでの不在の追加チェックは、一連の「ノック」を明確にトリガーするために示されています



以下は、input_ruleチェーン(ユーザールール用にOpenWRTファイアウォールで特別に作成されたチェーン)を追加するためのiptablesコマンドのシーケンスです/etc/firewall.userに追加されます

 iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set AllowedVPN src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set knock3 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set knock2 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set knock1 src
      
      





同じルールですが、syslogへのロギングがあります
 iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set ! --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK4 O) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set AllowedVPN src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK3 O) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set knock3 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK2 O) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set knock2 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK1 O) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set ! --match-set AllowedVPN src -j SET --add-set knock1 src
      
      







最も重要なルール



接続が行われるIPアドレスがipset AllowedVPNにある場合、ポート1194 / tcpへの着信接続を許可するのはこのルールです。

 config 'rule' option enabled 1 option 'target' 'ACCEPT' option 'name' 'VPN' option 'src' 'wan' option 'proto' 'tcp' option 'dest_port' '1194' option 'extra' '-m set --match-set AllowedVPN src'
      
      





それ以外の場合は、/ etc / firewall.userに書き込むことができます
 iptables -A input_rule -p tcp --dport 1194 -m set --match-set AllowedVPN src -j ACCEPT
      
      





ポートノッキング



次のコマンドを使用して、Windowsでポートノッキングを実行できます。

ping readyshare.mydomain.ua -l 70 -n 2 && ping readyshare.mydomain.ua -l 100 -n 2







近いアクセス



ロジックを完全にペイントしません。 これは上記のものと非常によく似ており、ルール内の検証ロジックのみが反転され、ipsetsからの削除が行われます。 さて、したがって、IPアドレスがipset-e AllowedVPNにない場合、アクセスはありません。

「ノック」の順序は、アクセスを開くときと同じです。

以下は、input_rule、ファイル/etc/firewall.userにチェーンするiptablesコマンドのシーケンスです

 iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set AllowedVPN src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set knock3 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set ! --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set knock2 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set knock1 src
      
      





ブロックのルールは同じですが、syslogにログを記録します
 iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK4 C) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set ! --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set AllowedVPN src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK3 C) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 128 -m limit --limit 10/s -m set ! --match-set knock1 src -m set ! --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set knock3 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set ! --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK2 C) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set ! --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set knock2 src iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j LOG --log-prefix "(KNOCK1 C) " iptables -A input_rule -p icmp -m icmp --icmp-type echo-request -m length --length 98 -m limit --limit 10/s -m set --match-set knock1 src -m set --match-set knock2 src -m set --match-set knock3 src -m set --match-set AllowedVPN src -j SET --del-set knock1 src
      
      







私の経験が他の人にも役立つことを願っています。



QC Co-LabのChris Cooperのipsetに関する優れたプレゼンテーション 。ソリューションの構築を開始しました。



All Articles