2016-11-25 12 views
1

ファイアウォールルールのセットを定義する必要があるとします。プロローグ内の構造

struct rules { 
int sourceL; 
int sourceU; 
int destL; 
int destU; 
char *proto; 
char *action; 
} r1,r2; 

r1.sourceL=10; 
r1.sourceU=20; 
r1.destL=30; 
r1.destU=40; 
r1.proto="tcp"; 
r1.action="accept"; 

r2.sourceL=10; 
r2.sourceU=10; 
r2.destL=30; 
r2.destU=30; 
r2.proto="tcp"; 
r2.action="deny"; 

ここで、sourceLとsourceUは送信元IPアドレスの下限と上限です。宛先IPアドレスも同じです。たとえば[10,20,30,40、tcp、allow]は[10,20]が送信元のサブネットで[30,40]が宛先のサブネットであることを意味します。

次の表記は正しいですか?

rule(
r1, 
sourceL(10), 
sourceU(20), 
destL(30), 
destU(40), 
proto(tcp), 
action(accept) 
). 

rule(
r2, 
sourceL(10), 
sourceU(10), 
destL(30), 
destU(30), 
proto(tcp), 
action(deny) 
). 

もしそうでない場合は、プロローグでどのように表現すればよいですか? ルールは静的であり、実行時には変更されません。 基本的には、定義されたルール間の競合をチェックしたいと思っていました。たとえば、[10,20,30,40、tcp、allow]と[10,10,30,30、tcp、deny]という2つのルール紛争へ ルールの競合を検出できるように、構造のさまざまな変数を比較するにはどうすればよいですか?

+0

より具体的な使用例を提供する必要があります。それは本当にあなたがルールで何をする必要があるかによって異なります。コンパイル時には静的であるかどうかです。あるいは、プログラムの実行中にそれらを変更しようとしていますか?これらのルールのデータをどのように使用しますか?このように表形式のデータを表現するには、あまりにも多くの異なる便利な方法があります。 –

+0

すべてのデータは静的です。実行時に変更されることはありません。基本的には、ソースとデスティネーションの範囲を示すソースとデスティネーションの両方に上限と下限があります(簡単にするために上のコードでは言及していません)。ファイアウォールのルールに矛盾がないかどうかを確認する必要があります。 ルール[10,20,30,40、tcp、allow]がある場合は、[10,20]が送信元のサブネットで[30,40]が送信先のサブネットであることを意味します。それから私が別の[10,10,30,30、tcp、deny]を持っているならそれは矛盾です。 –

+0

コメントに入力した内容で質問を編集できますか? –

答えて

0

私はあなたが構造体の中に余分な名前の折り返しを避けることができると思います。

私が意味する...あなたは

rule(r1, sourceL(10), sourceU(20), destL(30), destU(40), proto(tcp), action(accept)). 

を書くことができますが、私はそれがために(チェック重複の可能な(そして非常に改善できる)句の例

rule(r1, 10, 20, 30, 40, tcp, accept). 

十分かつ単純である疑いがありますあなたの事実がある場合は、同じプロトの私semplifiedルールは)

detectConflicts(N1, N2) :- 
    rule(N1, SL1, SU1, DL1, DU1, PR, _), 
    rule(N2, SL2, SU2, DL2, DU2, PR, _), 
    N1 @< N2, 
    ( (SL1 =< SL2, SL2 =< SU1) 
    ; (SL2 =< SL1, SL1 =< SU2) 
    ; (DL1 =< DL2, DL2 =< DU1) 
    ; (DL2 =< DL1, DL1 =< DU2)). 

することができ

rule(r1, 10, 20, 30, 40, tcp, accept). 
rule(r2, 10, 10, 30, 30, tcp, deny). 

r1r2に統一N2に統一N1detectConflicts(N1, N2)復帰への呼び出しを4回(4つの競合を検出)。

原因がソース範囲で2回、dest範囲で2回競合しているため、4回です。

+0

これは、おかげで多くのmax66 :) –