HLFL 構文 ----------------------------------------------------------------------------- hlfl are a list of statements. Each statement have the following syntax : hlfl は statement で構成されています。各 statement の構文 : statement ::= "protocol" ("local") "operator" ("remote") ["on"] [interfaces] keywords 'local' は あなたのネットワーク 'remote' は 外部のネットワーク 例 : tcp (192.168.1.1) X (192.168.2.1) [fxp0,xl1] bsd ipfw 言語での意味 : ipfw -f add deny tcp from 192.168.1.1 to 192.168.2.1 out via fxp0 ipfw -f add deny tcp from 192.168.2.1 to 192.168.1.1 in via fxp0 ipfw -f add deny tcp from 192.168.1.1 to 192.168.2.1 out via xl1 ipfw -f add deny tcp from 192.168.2.1 to 192.168.1.1 in via xl1 そして この意味を人間の言葉で表現すると : 'deny communication between 192.168.1.1 and 192.168.2.1' all (any) X (any) 意味 : ipfw -f add deny all from any to any オペレータのリスト : ----------------------------------------------------------------------------- 1. 記号オペレータ ===================== -> : 送信を許可(accept) <- : 受信を許可(accept) <-> : 送信と受信を許可(accept) <=>> : 送信から確立された(established)送受信を許可(accept) <<=> : 受信から確立された(established)送受信を許可(accept) X : 送受信の不許可(deny) X! : 送受信の拒否(reject) X-> : 送信の不許可(deny) <-X : 受信の不許可(deny) X!-> : 送信の拒否(reject) <-X! : 受信の拒否(reject) Note 記号 <=>> や <<=> は制御されたUDP通信を構築できますが 記号 <-> は制御されないUDP通信が構築されます。 2. 記号ではなオペレータ ========================= 記号オペレータで大量で複雑な規則を書くと読む時に苦痛かもしれないので もう1セットのオペレータが定義されました。 それらの構文は : operator ::= "accept" | "deny" | "reject" ["from" | "to" | "and" | "established" | "log"] 例 : # 192.168.1.1 から 192.168.2.1 への送信を許可して # 192.168.2.1 から 192.168.2.2 への受信を許可(すなわち<->と同じ) tcp (192.168.1.1) accept (192.168.2.1) on interface0 # 上と同じ意味の別の文は tcp (192.168.1.1) accept from and to (192.168.2.1) on interface0 # Accept outgoing connections from 10.1.1.1 to 10.2.2.2, and # log them (the same as "log <=>>") # # 10.1.1.1 から 102.2.2.2 への送受信の許可とログ tcp (10.1.1.1) accept established to and log (10.2.2.2) (src) と (dst) のフォーマット ------------------------------------------------------------------------- (src) や (dst) は (IPアドレス ポート番号) と表現できる すなわち : (192.168.1.1 1-1024) # 192.168.1.1 の 1~1024番ポート (192.168.2.1 21,22,80,49152-65535) # 192.168.2.1 の 21,22,49152~65535番ポート または : (IPアドレス ポート番号 | 他IPアドレス 他ポート番号 | ....) すなわち : (192.168.1.1|192.168.1.12|192.168.1.200) # 192.168.1.1 か 192.168.1.12 か 192.168.1.200 幾つかの送信元は、幾つかの受信元と結合できる: tcp (192.168.1.1|192.168.2.1|192.168.3.1) <=> (172.22.0.1|172.22.0.2|172.22.0.3) 意味は : 192.168.1.1 は 172.22.0.1 や 172.22.0.2 と 172.22.0.3 通信できる 192.168.2.1 は 172.22.0.1 や 172.22.0.2 と 172.22.0.3 通信できる 192.168.3.1 は 172.22.0.1 や 172.22.0.2 と 172.22.0.3 通信できる 次のケースだとキーワード 'nomix' を行の最後につけることができる tcp (192.168.1.1|192.168.2.1|192.168.3.1) <=> (172.22.0.1|172.22.0.2|172.22.0.3) nomix 意味は : 192.168.1.1 は 172.22.0.1 と通信できる 192.168.2.1 は 172.22.0.2 と通信できる 192.168.3.1 は 172.22.0.3 と通信できる tcp (192.168.1.1 80 | 192.168.2.1 21) X (172.22.0.1) 上の文は有効です。 172.22.0.1 は 192.168.1.1 の 80番 と 192.168.2.1 の 21番 と通信できません。 最後に tcp ((192.168.1.1|192.168.2.1) 80,21) X (172.22.0.1) これも有効な文で 172.22.0.1 は 192.168.1.1 か 192.168.2.1 の 21番,80番 と通信できません。 インタフェース フォーマット ------------------------------------------------------------------------------- [インタフェース] は * 省略できる * 1つを指定してもいい * または、複数をカンマで区切って並べられる すなわち: tcp (192.168.1.1) X (192.168.1.2) 意味は 192.168.1.1 と 192.168.1.2 は通信できない。 tcp (192.168.1.1) X (192.168.1.2) [eth0] 意味は 192.168.1.1 と 192.168.1.2 は eth0 上では通信できない。 tcp (192.168.1.1) <-> (192.168.1.2) [fxp1,fxp2] 意味は 192.168.1.1 と 192.168.1.2 は fxp1, fxp2 上で通信できる。 tcp (10.0.0.1) <-> (10.254.254.254) on Ethernet0 意味は 10.0.0.1 と 10.254.254.254 は Ethernet0 上で通信できる。 他の有効な文は : tcp (10.0.0.1) <-> (10.1.1.1) on [eth1, eth2, eth3] tcp (10.0.0.1) <-> (10.1.1.1) on (eth1,eth2,eth3) ICMP ------------------------------------------------------------------------------- icmp の為に使える単語は : echo-request echo-reply destination-unreachable time-exceeded 例えば 'ping' を許可する場合は : icmp (any echo-request) -> (any) icmp (any) <- (any echo-reply) 変数 ------------------------------------------------------------------------------- 'define'というキーワードを使って、規則をより読み易いように変数を定義できます。 define 単語 値 すなわち : define inside 192.168.1.0/24 define public_ports 1024-65535 と定義しておいて、次のように使えます。 (inside public_ports) <=>> (any) Include ------------------------------------------------------------------------------ 'include' を使って他の定義を読み込めます。 例えば : ファイル「def.hlfl」の中 : define ftp 21 define ssh 22 define telnet 23 ファイル「rules.hlfl」の中 : include def.hlfl tcp (any ssh) <<=> (any) コメント ------------------------------------------------------------------------------- hlfl は、3種類のコメントを扱うことができます。 - '%'で始まるコメントは変換されたファイルには出力されません。 例えば : % % This rules are written in hlfl % tcp (any) -> (any) 変化された ipchains フォーマットでは : ipchains -A output -s 0/0 -d 0/0 -j ACCEPT - '#'で始まるコメントは変換されたファイルにも含まれます。但し、cisco 形式では出ない。 例えば : % % This rules are written in hlfl % # allow all the outgoing tcp tcp (any) -> (any) 変換後は : # allow all the outgoing tcp ipchains -A output -s 0/0 -d 0/0 -j ACCEPT - '!'で始まるコメントは変換されたファイルにも出力されますが 先頭の'!'が除かれた状態で出力されます。 これは、コマンドを指定するときに使えます。 !ipchains -A forward -s 0/0 -d 0/0 -i eth0 -j ACCEPT tcp (any) -> (any) これを変換すると : ipchains -A forward -s 0/0 -d 0/0 -i eth0 -j ACCEPT ipchains -A output -s 0/0 -d 0/0 -j ACCEPT Note: もし ipfw 形式で出力すると次のようになってしまう。 ipchains -A forward -s 0/0 -d 0/0 -i eth0 -j ACCEPT ipfw add allow tcp from any to any out 次のようにコンディションを聞くことができるでしょう : ! if(ipchains) $ipchains -A forward -s 0/0 -d 0/0 -j eth0 -j ACCEPT このケースでは ipchains で出力を得られるでしょう。 'else'文も使えて有効です。 ! if(ipchains) $ipchains -A forward -s 0/0 -d 0/0 -i eth0 -j MASQ ! else echo "MASQUERADING NOT IMPLEMENTED" ; exit 実際のサンプル ------------------------------------------------------------------------------- ファイル sample_1.hlfl と sample_2.hlfl 参考にしてみてください。