導入編 | ||
>>> | FreeBSDルーター編 | |
ローカルDNSサーバー | ||
フレッツADSLで固定IP | ||
ドメイン取得とDNS運用 | ||
メールサーバー | ||
Webサーバー |
23 May 2004 | 自動復旧システムを追加。 |
15 Mar 2003 | ファイアウォールとIRCのDCC SEND(nat punch_fwの説明)を完成させる。 |
22 Apr 2002 | ファイアウォール関係の記事を追加。 |
15 Apr 2002 | 新規公開。 |
default: ident user-ppp VERSION (built COMPILATIONDATE) set device PPPoE:ep0 set mru 1454 set mtu 1454 set authname login@user.name.here set authkey passwordhere set log Phase Chat LCP IPCP CCP tun command set dial set login set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 add default HISADDR # Add a (sticky) default route enable dns # request DNS info (for resolv.conf) nat enable yes nat use_sockets yesできあがったらpppを起動する。起動したらifconfigでtun0にIPアドレスがちゃんと割り当てられているか確認する。大丈夫ならばpingを打って、きちんと接続が確立しているか確認しておく。/stand/sysinstallなどでこのマシンをゲートウェイとして使用する設定にしてあれば、適切にゲートウェイさえ設定すればLAN内の他クライアントからも外と通信できるはずである。
ppp_enable="YES" ppp_mode="ddial" ppp_nat="YES" ppp_profile="default"と書いてリブートし、起動時にpppが立ち上がっているか確認する。ちなみに、rc.confで有効なオプション類はman rc.confに書いてある。デフォルト値は/etc/defaults/rc.confを見ると分かる。
firewall_enable="YES" firewall_type="OPEN" # とりあえずと書き込んでリブートする。NICがPCカードの人は、
pccardd_flags="-z"も書いておくとよい。こう書いておくとpccarddにオプション-zが渡され、pccardd起動時にPCカードが挿入されていた場合、その設定が終わるまでpccarddはフォアグランドの制御を握りつづけるようになる。pccarddの実行が終わったときには確実にNICが有効になっている。
# set these to your outside interface network and netmask and ip oif="tun0" onet="onet" omask="omask" oip="me" # set these to your inside interface network and netmask and ip iif="ep0" inet="192.168.1.0" imask="255.255.255.0" iip="192.168.1.1"この状態でrc.firewallをシェルに渡すとファイアウォールルールがそっくりそのまま書き出される。
$ sh rc.firewall -f flush add 100 pass all from any to any via lo0 add 200 deny all from any to 127.0.0.0/8 add 300 deny ip from 127.0.0.0/8 to any add deny all from 192.168.1.0:255.255.255.0 to any in via tun0 # 0 add deny all from onet:omask to any in via ep0 # 1 add deny all from any to 10.0.0.0/8 via tun0 add deny all from any to 172.16.0.0/12 via tun0 add deny all from any to 192.168.0.0/16 via tun0 # 2 add deny all from any to 0.0.0.0/8 via tun0 add deny all from any to 169.254.0.0/16 via tun0 add deny all from any to 192.0.2.0/24 via tun0 add deny all from any to 224.0.0.0/4 via tun0 add deny all from any to 240.0.0.0/4 via tun0 add deny all from 10.0.0.0/8 to any via tun0 add deny all from 172.16.0.0/12 to any via tun0 add deny all from 192.168.0.0/16 to any via tun0 # 3 add deny all from 0.0.0.0/8 to any via tun0 add deny all from 169.254.0.0/16 to any via tun0 add deny all from 192.0.2.0/24 to any via tun0 add deny all from 224.0.0.0/4 to any via tun0 add deny all from 240.0.0.0/4 to any via tun0 add pass tcp from any to any established add pass all from any to any frag add pass tcp from any to me 25 setup # 4 add pass tcp from any to me 53 setup # 4 add pass udp from any to me 53 # 4 add pass udp from me 53 to any # 4 add pass tcp from any to me 80 setup # 4 add deny log tcp from any to any in via tun0 setup # 5 add pass tcp from any to any setup # 6 add pass udp from me to any 53 keep-state # 7 add pass udp from me to any 123 keep-state # 7 $これをリダイレクトして編集する。最初の4行はrc.firewallで勝手に設定されるので削除する。onet/omaskの入っている#1は「LAN側IFから来たWAN側アドレスのパケットの禁止」という意味なので、「LAN側から来たLAN側アドレスではないパケットの禁止」と読み替えることにする。
add deny all from not 192.168.2.0/24 to any in via ep0 # 1また、pppでNATを行う場合はマズい部分があるので修正する。NATを行う場合、LAN側では例えば192.168.1.0/24などのネットワークアドレスを使うと思うが、そうすると「#2」「#3」のルールに引っかかってパケットが通らなくなる。ここは方向まで指定して、
add deny all from any to 192.168.0.0/16 out via tun0 # 2 add deny all from 192.168.0.0/16 to any in via tun0 # 3とする。で、よく見ると#3は#0を包含するので、#0を消す。
add pass udp from me to any 53 keep-state # 7 add pass udp from 192.168.1.0/24 to any 53 keep-state # 追加 add pass udp from me to any 123 keep-state # 7 add pass udp from 192.168.1.0/24 to any 123 keep-state # 追加絶対に必要なのはDNSに対するルール(「#7」のポート53)だろう。ルールにヒットしなかったものは、デフォルトの設定ではすべて拒否されるようになっている。
add deny 30000 log tcp from any to any in via tun0 setup # 5'このようにして、ppp.confに
nat punch_fw 29000 1000と書いておけば、pppが自動的に生成するルールは29000番〜29999番になり、TCP setupパケットを拒否するパケットは30000番に固定されるので、きちんと動作するようになる。この処置を行えば、FTP用のパケットも自動的に通るようになる。
main: set server /var/run/ppp/main "" 077/var/run/ppp/main はUnixドメインソケットを作る場所、"" はパスワードだがこの例ではなしになっている。077はソケットを作る際のumaskで、この場合だとパーミッション700でソケットができる。pppを一度killし、ppp -ddial -nat mainで立ち上げ直す。pppctl /var/run/ppp/main とすると、pppのプロンプトが出るはず。ソケットはフルパスで指定する。pppをddialモードで立ち上げいる場合、pppctlのプロンプトでcloseと打つと、一度接続が切れて、再度接続に行くはずである。
# pppctl /var/run/ppp/main closeちなみに、あらかじめISPのメンテ予定が分かっている場合は、atコマンドでメンテ終了後にpppctlが実行されるようにすればよい。たとえば、8月10日午前2時にメンテ終了ならば、そのちょっと後の2時10分くらいに再接続が起きるように、
# echo 'pppctl /var/run/ppp/main close' | at 0210 aug 10としておけばよい。
main: bg /bin/sh -c "echo HISADDR > /var/run/ppp/main.peer"一度pppの接続を切ると(ddialだと自動的に再接続するので)/var/run/ppp/main.peer ができあがるはずである。これを利用してシェルスクリプトを書く。例えば、/etc/ppp/checklink として作る。実行パーミッションを立てる。
#!/bin/sh pppctl_socket=/var/run/ppp/main peer_ip_file=/var/run/ppp/main.peer if [ -S $pppctl_socket -a -s $peer_ip_file ]; then ping -c 5 -t 6 `cat $peer_ip_file` > /dev/null if [ "$?" = "0" ]; then exit 0 fi echo ppp/checklink: try to recover link pppctl $pppctl_socket close fiifの-SはUnixドメインソケットの場合に真になる。-aはandの意味で、-sはファイルサイズが0以上の場合に真である。pingの-cはpingを打つ回数、-tはタイムアウト秒数である(ちなみにping間隔は-i)。pingは少なくとも1つ応答が得られれば0を返す。よって、全体としては5個pingを打って、6秒待っても一つも応答が得られなかった場合にppp接続をやりなおすという意味になる。ちなみに、echoが実行されるとcronがメールをくれるので、メールをチェックしていると再接続されたことが分かる。
2-59/5 * * * * root /etc/ppp/checklinkこの例だと毎時2分から5分おきにリンクがチェックされ、もし接続が落ちていれば再接続されるはずである。あとは気長にメンテがあるまで待とう(笑)。ちなみに、再接続が起きるとpeerのIPアドレスファイルが作り直されるから、このファイルのタイムスタンプを見ると最後に再接続した時刻が分かる。periodicで報告させてもよいだろう。
Copyright (C) 2006-2015 akamoz.jp
$Id: freebsd.htm,v 1.8 2015/12/27 13:42:26 you Exp $