#### Macros #### # WANインタフェースを定義 ext_if = "ng0" ext_addr = "XXX.XXX.XXX.XXX" # LANインタフェースを定義 int_if = "fxp0" int_addr = "192.168.0.1" #### Tables #### # ルータのローカルアドレスを定義 table const {127.0.0.1, 192.168.0.1, XXX.XXX.XXX.XXX } # プライベートアドレス群を定義 table const { 10/8, 172.16/12, 192.168/16 } # RFC3330からプライベートアドレスを除いた特殊用途アドレスを定義 # 一部のMulticastアドレスを使う予定がある場合は注意すること # 14/8や24/8はケーブルテレビなど使われている可能性もあるので注意 table const { 0/8, 14/8, 24/8, 39/8, 127/8, 128.0/16, 169.254/16, 192.0.0/24, \ 192.0.2/24, 192.88.99/24, 198.18/15, 223.255.255/24, 224/4, 240/4 } #### Options #### # 分割されたパケットを再構成するときの分割パケットの待ち時間 set timeout { interval 10, frag 30 } # tcp関連のタイムアウト設定 set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 } # セッション終了後におけるステータス保持時間 set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 90 } # udp関連のタイムアウト設定 set timeout { udp.first 60, udp.single 30, udp.multiple 60 } # icmpのタイムアウト設定 set timeout { icmp.first 20, icmp.error 10 } # その他のレイヤ4プロトコルのタイムアウト set timeout { other.first 60, other.single 30, other.multiple 60 } # adaptiveに関する設定 set timeout { adaptive.start 0, adaptive.end 0 } # ステータスの保持制限数 set limit { states 10000, frags 5000 } # pfctl -s infoで表示するログインタフェース set loginterface ng0 # ブロック時の応答(捨てるかRSTを返すか) set block-policy drop # その他の設定 set optimization normal set state-policy if-bound set require-order yes set fingerprints "/etc/pf.os" #### Traffic Normalization #### # 入りのパケットのフラグメントを再構成 scrub in on $ext_if all fragment reassemble # 出るパケットのmssを1414に書き換え scrub out on $ext_if all max-mss 1414 #### Queueing #### #### Translation #### # NAPT(IPマスカレード) nat on $ext_if inet from 192.168.0.0/24 to ! -> ($ext_if) # ポートリダイレクトの設定例 #rdr on $ext_if inet proto tcp from any to ($ext_if) port 80 -> 192.168.0.64 port 80 #### Packet Filtering #### # まずはデフォルトで拒否 block in log all block out log all #### ### WANから入ってくるパケットの処理 ### # 外から入ってくるアドレス偽装パケットの処理 block in log quick on $ext_if from { } to any # TCPの制御 ## 外部からのhttp,DNS(tcp),SMTPを許可 pass in on $ext_if proto tcp from any to $ext_addr port {smtp domain http} flags S/SA keep state ## Windows95や98から直接のSMTPを拒否する block in log quick on $ext_if proto tcp from any os {"Windows 95", "Windows 98"} to $ext_addr port smtp ## IDENTにRSTを返す block return-rst in quick on $ext_if proto tcp from any to any port 113 ## それ以外のTCPは捨てる block in log quick on $ext_if proto tcp all # UDPの制御 ## DNS(udp)を許可 pass in quick on $ext_if proto udp from any to $ext_addr port domain keep state ## それ以外は捨てる block in log quick on $ext_if proto udp all # ICMPの制御 ## tracerouteを開ける pass in quick on $ext_if inet proto icmp all icmp-type 3 pass in quick on $ext_if inet proto icmp all icmp-type 11 ## 他のicmpは捨てる block in log quick on $ext_if proto icmp all #### ### WANへ出ていくパケットの処理### # 変なパケットは出さない block out quick on $ext_if from any to { } # smbとnetbiosが外に漏れるのを防ぐ block out quick on $ext_if proto {tcp udp} from any to any port 135 block out quick on $ext_if proto {tcp udp} from any to any port 137:139 block out quick on $ext_if proto {tcp udp} from any to any port 445 # SQL Slamerが気になる人はこちらも block out quick on $ext_if proto {tcp udp} from any to any port 1433:1434 # 中からのセッション開始は許可 pass out quick on $ext_if proto tcp all modulate state pass out quick on $ext_if proto udp all keep state # ICMP関連 ## 外に出ていくping pass out quick on $ext_if inet proto icmp all icmp-type 8 code 0 keep state ## 他のicmpは外に出さない block out log quick on $ext_if proto icmp all #### ### LAN内のパケット処理 ### pass in quick on $int_if all pass out quick on $int_if all #### ### loopback ### pass in quick on lo0 all pass out quick on lo0 all