私は多くのリソースを登らなければなりませんでした。 また、システムログの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に入力されます。
二回目のノックをキャッチ
98バイトの発信ICMPパケットアドレスは、ipset knock2にすでに入力されており、残りは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
3番目のノックをキャッチ
128バイトの発信ICMPパケットアドレスは、ipset knock1およびknock2にも存在し、AllowedVPNには存在しない場合、ipset knock3に入力されます。icmptype 8 length 128 match-set knock1 src match-set knock2 src ! match-set knock3 src ! match-set AllowedVPN src add-set knock3 src
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に関する優れたプレゼンテーション 。ソリューションの構築を開始しました。