ARAGO for Internet Wiki Project AkuAku

This web site is powered by Arago for Internet v7.0 UTF-8 edition on FreeBSD
SPC main menu Expand/Fold
Products 取扱商品 Expand/Fold
SouthWind  Expand/Fold
Q&A Technical support Expand/Fold
BBS 掲示板 Expand/Fold
Easy PC life Expand/Fold

Last Edit Date: 09/02/2008

ipfilter

最近のISPはspam発信を禁止するためにport25からのSMTPをblockしています。 そのために一般のdhcp回線からではmailサーバーからめいるを送れないということがおきています。
postfixの修正と同時に、ipfilterのruleも新しいport番号587をオープンします。

ipfilterはpacketのフィルタリングするプログラムです。 ipfilterはいわゆるfirewallです。 ipfilterを指定しkernelをコンパイルすることによってkernelにmoduleとして組み込まれます。
通常routerにこのフィルタリング機能が組み込まれていますが、この機能をFreeBSDで行うわけです。
routerのフィルタリングの設定は結構面倒なものなのですが、port番号、protocol、どこからのipでどこへのipで自由に指定し許可するpacketのみを通します。 この機能をすべてipfilterで行うことができます。

時々ipfilterの設定が難しいからという理由で、簡単なファイアウオールソフトを利用する人がいますが、設定が簡単ということは機能がほとんどないか、お仕着せの設定程度のものしかないということになります。 まるで勉強するのが大変だからと、簡単な学校を出ても社会で相手にされないような冗談です。
ここではSPCのサイトで運用している設定を紹介します。 この設定で今のところこの5-6年間で問題は発生していません。 ただしblockしているアクセスのログファイルはとても大きなものになります。 

このログを時々確認されることをお勧めします! あきれるほどのサイトがvirusに感染しているのかすぐに理解できます。

ipfilterをきちんと設定し、おかしなcgiを動かさないのが一番です。 cgiにはaragoiをぜひご利用ください!

FreeBSDのインストールのところでkernelはipfilterが指定されコンパイルされているものとします。


参考
cd /usr/src/sys/i386/conf

GENERICに次の内容を追加してください。
もしGENERICに下記の内容があり、コメントアウトされていれば、#をはずし保存する。

##ipfilter
option        IPFILTER
option        IPFILTER_LOG

kenelをコンパイルしてあればloginして
ipf -V
でkernelに組み込まれているかどうか出ます。 確認しましょう。 version番号も出ます。
もし何も表示されないと、まだkernelに組み込まれていません!


ではipfilterで必要な基本的キーワードを解説します。

まずはipのおさらいです。

日本で一番多いsubnet classは? 残念ながら今時class cやbをもらうことはできません。
8ipが圧倒的ではないでしょうか? 1ipではipfilterの登場する余地はありません! 最低routerの外に1ip、内側に1ipが必要です!

isp----<>out ip --server--inner ip--->ここから--<>安物のrouter-<>でDHCPなどをかけて内部の山ほどあるPCにつなぐ。
つまりserverには2枚のethernetカードがいります。
たとえば192.0.0.200というipが割り当てられていたとすると、この200は使えませんね。 201がrouterに割り当てられます。 そしてserverのipは202です。
192.0.0.200-192.0.0.207までのipの中で207も使えません。 実際に使えるipは202-206までです。 もちろん202はserverのipとして固定されていますね!
dnsのipはこの202になりますね。 もちろん他のipでもいいのですが、靴を足に履かないで、頭の上に乗せるようなもので、ちょっと文化が違うような気がします?


使えるipは
0-7で使えるのは 1-6までの6ipです。
netmaskが255.255.255.248 は 8ip
/で表現すると/29が同じ意味です。
/30は4ipです。
0/30と言うことは 1,2,3です。
4/30で 4,5,6です。
0と7は使えませんね!

基本コマンド

制御
block 禁止
pass 許可
quick 指定先にjump、 jump先で処理を指定

ethernetの指定
on 

制御するipの指定
from
to

制御条件

all    すべて
any    どれでも

指定する動作
in packetが入ってくる時
out packetを出力する時

protocol指定
proto protocol指定であることの指定
tcp
udp
icmp
icmp-type

portの指定
port

ipfilterの動作条件
keep state

logファイルへの出力
log


rc.confの次の行をコメントしておくと失敗したときには楽です。
##ipfilter
## ipfilter_enable="YES" 
ipfilterはkernel組み込みで行います。





ipfilterの動作

kernelに組み込まれずいぶんと軽く動作します。 よくfilteringソフトを選択する条件に、設定が簡単だからと書かれている方がいますが、簡単に開く鍵を玄関につけようなんてものです。

ipfilterを使用する理由は、stateで動作するからです。 

packetの動作のなかでacknowledge bitについてに簡単に説明します。 aaaからbbbにアクセスするとbbbはaaaにaaaからのrequestでpacketを送り返していることを表すacknowledge bitをonにします。
もしbbbからaaaにrequestを出してきたときには、このbitがoffになっています。
つい最近までの高額な商用routerでも、packetのacknowledge bitを見てrequestに対するreplyかどうかを識別していましたが、現在のInternet jungleではrequestに対する返信packetを装って送ってくることがあります。
そこでipfilterはstate tableで自分から送信したときには、その相手の返信packetを見ています。 もし前にrequest  packetを送信していないところから返信packetが来ると無視して捨てます。 これによってfilterの書き方が抜群に簡単になります。

filterは一見面倒なものですが、理解すればとても簡単なものです。
tcp/ipのpacketはいろいろな情報がありますが、ここでは必要なことのみ説明します。
packetには自分のアドレス(ip + mac address) port番号 と相手のアドレス(ip + mac address) port 番号 packetの種類 送信か返信かがあります。 (もちろんそれ以外の情報がありますが、ここは簡単に理解するため省略)

portとはhttpdは80とか基本的には決まっています。 ときどきWebで見かけるfilterのport制限でいろいろなportを禁止していますが、これは考え方が間違いです。 すべて禁止して! いるものだけを許可します。 それでも最後にまた禁止をいれてlogを取ります。 もしここに何か入るとするとそれは問題です!

許可するときにはallow、禁止するときにはdenyで指定します。
最初にdeny allとするとすべてが禁止されます。
次にallow 80番とするとport 80だけが許可されている状態です。

それぞれの指定でlogオプションがあります。

ipfilterでは禁止のdenyはblock、許可のallowはpassとなります。



monitorの使い方
ipmon

ファイルの記述で注意すること。
port=80 はエラーになります。 spaceをいれてport = 80 と記述してください。
spellを間違えると、動かない、動作が不安定になった様な動作をする。 チェックが非常に困難になります。 editorのサーチなどで整合性があるか確認ください。



ipfilterの起動
/etc/rc.confに追加
ipfilter_enable="YES"
ipfilter_rules="/etc/ipf.rules"
ipfilter_flags=""
ipmon_enable="YES"
ipmon_flags="-D /var/log/ipf.log" <--logファイルの名称とディレクトリを指定
gateway_enable="YES"   <--これがないとこのドメインのPCは外に出れません。


logファイルの管理
ipf.logを深夜0時にrotateするように/etc/newsyslog.confに次の指定を追加。

var/log/ipf.logs             600  5     *    $D0   Z

ipf.logは/etc/rc.confで指定したlogファイル名にしてください。


参考サイト
IP Filter FAQ
http://www.phildev.net/ipf/
Ip Filter web sight
http://coombs.anu.edu.au/~avalon/

/etc/ipf.rulesの内容です。
61.199.237.XXXは自分のサイトのipアドレスに変更してください。
下の設定では、61.199.237.148/30に内部用の無線routerが入っています。
fxp0, fxp1はethernetカード名です。
ifconfigで見ることができます!
realtek 100Mはrlになると思います。 それぞれのカードの種類で決まります。 fxpはintel?

******************************************
#
# we have two zones, one for DMZ 4ips other one is firewalled zone 4ips
# so   8ips /29 4ips /30
# thus zone 1, group 1 as 61.199.237.144/30, second zone, group 10 as 61.199.237.148/30
# s/OUTSIDE/outside-interface (eg: fxp0)
# s/MYNET/network-cidr-address (eg: 1.2.3.0/24)
# MYNET= 61.199.237.144/29
# INSIDE = fxp0 61.199.237.146
# OUTSIDE  = fxp1 61.199.237.145  fxp1 or tun0
# group 1,2 are in out for DMZ tun0 as pppoe
# group 3,4 10 is firewalled zone as 61.199.237.148/30
#
# block in out for each and jump to each entry
block in quick on tun0 all head 1
block out quick on tun0 all head 2
block in quick on fxp0 all head 3
block out quick on fxp0 all head 4
 
#group 1
#ありえないip群はblockします。
 block in quick on tun0 from 0.0.0.0/7 to any  group 1
 block in quick on tun0 from 2.0.0.0/8 to any  group 1
 block in quick on tun0 from 5.0.0.0/8 to any  group 1
 block in quick on tun0 from 10.0.0.0/8 to any  group 1
 block in quick on tun0 from 23.0.0.0/8 to any  group 1
 block in quick on tun0 from 27.0.0.0/8 to any  group 1
 block in quick on tun0 from 31.0.0.0/8 to any  group 1
 block in quick on tun0 from 127.0.0.0/8 to any  group 1
 block in quick on tun0 from 128.0.0.0/16 to any  group 1
 block in quick on tun0 from 128.66.0.0/16 to any  group 1
 block in quick on tun0 from 169.254.0.0/16 to any  group 1
 block in quick on tun0 from 172.16.0.0/12 to any  group 1
 block in quick on tun0 from 191.255.0.0/16 to any  group 1
 block in quick on tun0 from 192.0.0.0/19 to any  group 1
 block in quick on tun0 from 192.0.48.0/20 to any  group 1
 block in quick on tun0 from 192.0.64.0/18 to any  group 1
 block in quick on tun0 from 192.0.128.0/17 to any  group 1
 block in quick on tun0 from 192.168.0.0/16 to any  group 1
 block in quick on tun0 from 197.0.0.0/8 to any  group 1
#自分のドメインのipで外から入ってくるrはずがありません! blockしましょう!
 block in quick on tun0 from 61.199.237.144/29 to any  group 1
#rule group 1 rule   above rule is rule 32
# Your pass rules come here...
##########temp mail server
 pass in quick on tun0 proto tcp from any to 61.199.237.147 port = 25 keep state group 1
####新規追加 port25 block対策 1
 pass in quick on tun0 proto tcp from any to 61.199.237.147 port = 587 keep state group 1
 pass in quick on tun0 proto tcp from any to 61.199.237.147 port = 110 keep state group 1
 block in log quick on tun0 from any to 61.199.237.147 group 1
########### httpd
 pass in quick on tun0 proto tcp from any to 61.199.237.144/30 port = 80

flags S keep state group 1
########### in  ICMP tracerout ping
 pass in quick on tun0 proto icmp from any to 61.199.237.146 keep state group 1
 block in log quick on tun0 proto icmp from any to any group 1
########### in dns
 pass in quick on tun0 proto tcp from any to 61.199.237.144/30 port = 53 keep

state group 1
 pass in quick on tun0 proto udp from any to 61.199.237.144/30 port = 53

group 1
########### in   httpd
 pass in quick on tun0 proto tcp from any to 61.199.237.144/30 port = 80

flags S keep state group 1
########### in   SMTP POP3
 pass in quick on tun0 proto tcp from any to 61.199.237.144/30 port = 25 keep

state group 1
 pass in quick on tun0 proto tcp from any to 61.199.237.144/30 port = 110

keep state group 1
########### in   FTP
 block in log quick on tun0 from any to any group 1
#####end of group 1
#
# block out going original group 2
 block out quick on tun0 from !61.199.237.144/29 to any  group 2
 block out quick on tun0 from 61.199.237.144/29 to 0.0.0.0/7  group 2
 block out quick on tun0 from 61.199.237.144/29 to 2.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 5.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 10.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 23.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 27.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 31.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 70.0.0.0/7  group 2
 block out quick on tun0 from 61.199.237.144/29 to 72.0.0.0/5  group 2
 block out quick on tun0 from 61.199.237.144/29 to 83.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 84.0.0.0/6  group 2
 block out quick on tun0 from 61.199.237.144/29 to 88.0.0.0/5  group 2
 block out quick on tun0 from 61.199.237.144/29 to 96.0.0.0/3  group 2
 block out quick on tun0 from 61.199.237.144/29 to 127.0.0.0/8  group 2
 block out quick on tun0 from 61.199.237.144/29 to 128.0.0.0/16  group 2
 block out quick on tun0 from 61.199.237.144/29 to 128.66.0.0/16  group 2
 block out quick on tun0 from 61.199.237.144/29 to 169.254.0.0/16  group 2
 block out quick on tun0 from 61.199.237.144/29 to 172.16.0.0/12  group 2
 block out quick on tun0 from 61.199.237.144/29 to 191.255.0.0/16  group 2
 block out quick on tun0 from 61.199.237.144/29 to 192.0.0.0/19  group 2
 block out quick on tun0 from 61.199.237.144/29 to 192.0.48.0/20  group 2
 block out quick on tun0 from 61.199.237.144/29 to 192.0.64.0/18  group 2
 block out quick on tun0 from 61.199.237.144/29 to 192.0.128.0/17  group 2
 block out quick on tun0 from 61.199.237.144/29 to 192.168.0.0/16  group 2
 block out quick on tun0 from 61.199.237.144/29 to 197.0.0.0/8  group 2
# group 2 out from tun0, Your pass rules come here...
########## out ICMP tracerout ping
 pass out quick on tun0 proto tcp/udp from 61.199.237.144/29 to any keep

state group 2
 pass out quick on tun0 proto icmp from 61.199.237.144/29 to any keep state

group 2
######### out pppoe
 pass out quick on tun0 proto tcp all flags A/A keep state group 2
######## out  httpd
 pass out quick on tun0 proto tcp from 61.199.237.144/29 to any port = 80

keep state group 2
######### out  SMTP POP3
 pass out quick on tun0 proto tcp from 61.199.237.144/29 to any port = 25

keep state group 2
 pass out quick on tun0 proto tcp from 61.199.237.144/29 to any port = 110

keep state group 2
######### out  FTP
######### out dns
 pass out quick on tun0 proto tcp from 61.199.237.144/29 to any port = 53

keep state group 2
 pass out quick on tun0 proto udp from 61.199.237.144/29 to any port = 53

keep state group 2
 block out log quick on tun0 from any to any group 1
#end of group 2
#
#group 3
 pass in quick on fxp0 from 61.199.237.144/29 to any keep state group 3
# end of group 3
#
# group 4 start
 pass out quick on fxp0 from 61.199.237.144/29 to any keep state group 4
#end of group 4

ipf.rulesは以上です。
Advertisement Expand/Fold