構築ネタ(FreeBSD) ネットワーク設定とか

Pocket

■やりたかったこと

  1. PPPoE で B-FLETS に接続。
  2. Web/DNS/Mailサーバ
  3. LAN 向けに DHCP
  4. LAN → WAN 向けにNAT
  5. WAN側にFireWall
  6. フレッツ・スクェアの利用

ブロードバンドルータ兼サーバ、という構成はLinuxでも普通に動いていたので問題なかろうと思っていたらこれがなかなかのくせ者で、かなり苦労した。当初は ppp + ipfw の構成で試してみたがいろいろと問題が出てうまくいかず。試行錯誤の末、最終的に mpd + pf の構成で落ち着いた。「いろいろ」の中身を詳しく、と思っていたのだが、震災とその後のどたばたで詳細は忘却の彼方に行ってしまった。最終的にうまく動作した構成についてまとめておくことにする。

■PPPoEの設定(mpd)

インストールはportsから。pkgtools.confに以下を追加。

[/usr/local/etc/pkgtools.conf]
MAKE_ARGS = {
             'net/mpd5' => 'BATCH=yes',
}

# portinstall mpd5

設定ファイルは /usr/local/etc/mpd5/mpd.conf.sample を参考に作成する。rc.confへの追加も必要。なお、物理NICは2つあり、WAN側がbge0、LAN側がre0である。通常の接続用とフレッツ・スクェア用の2つのエントリを記述する。startup: のエントリには管理コンソールの記述があるが、不用意に外部からアクセスされないようにユーザ名、パスワード、IPアドレスを適切に設定し直すことを忘れずに。管理コンソールにブラウザでアクセスすると、PPPoEに関する様々なステータスを確認することが出来る。

[/usr/local/etc/mpd5/mpd.conf]
startup:
        # configure mpd users
        set user foo bar admin
        set user foo1 bar1
        # configure the console
        set console self 127.0.0.1 5005
        set console open
        # configure the web server
        set web self 192.168.1.1 5006
        set web open

default:
        load wakwak
        load flets-square

wakwak:
        create bundle static B1
        set iface idle 0
        set iface enable tcpmssfix
        set iface enable nat
        set iface route default
        set ipcp ranges 固定IPアドレス/0 0.0.0.0/0

        create link static L1 pppoe
        set link action bundle B1
        set auth authname 接続用ユーザID
        set auth password 接続用パスワード
        set link max-redial 0
        set link mtu 1454
        set link keep-alive 10 60
        set pppoe iface bge0
        set pppoe service ""
        open

flets-square:
        create bundle static bFLETS-SQUARE
        set bundle links lFLETS-SQUARE
        set ipcp enable req-pri-dns req-sec-dns
        set ipcp disable vjcomp
        set ipcp range 0.0.0.0/0 0.0.0.0/0
        set iface route 220.210.194.0/25
        set iface route 220.210.195.0/26
        set iface route 220.210.195.64/26
        set iface route 220.210.197.0/25
        set iface route 220.210.199.32/27
        set iface route 220.210.199.200/29
        set iface route 220.210.199.160/27
        set iface route 220.210.199.192/27
        set iface route 220.210.196.0/25
        set iface route 220.210.196.128/26
        set iface route 220.210.199.64/28
        set iface route 220.210.198.0/26
        set iface route 220.210.199.144/28
        set iface enable on-demand tcpmssfix
        open bund

        create link static lFLETS-SQUARE pppoe
        set link keep-alive 10 60
        set link mru 1454
        set pppoe iface bge0
        set auth authname guest@flets
        set auth password guest

rc.conf のネットワーク関連の記述は以下の通り。

[/etc/rc.conf]
gateway_enable="YES"
ifconfig_re0="inet 192.168.1.1 netmask 255.255.255.0"
mpd_enable="YES"
named_enable="YES"
pf_enable="YES"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"

WAN側に使用する bge0 は何も設定しない。デフォルトゲートウェイももPPPoEで取得するので何も記述しない。この状態でOSを再起動すればPPPoEの接続が完了する。WAN側のインターフェイスbge0上には2つの仮想インターフェイス ng0 と ng1 が作成される。ng0 が通常のインターネット接続用、ng1 がフレッツスクェア接続用に利用される。

# ifconfig -a
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=389b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
        ether 70:71:bc:94:24:48
        inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LINKSTATE>
        ether 00:0a:79:2b:28:2b
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33200
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1454
        inet 61.115.xxx.xxx --> 219.103.128.208 netmask 0xffffffff
ng1: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1454
        inet 114.194.xxx.xxx --> 220.210.221.28 netmask 0xffffffff

フレッツスクェアを利用するためには、ブラウザで http://www.flets/ にアクセスする。すなわち、www.flets の名前解決が出来なければならない。.flets は正規のドメインではないので、.flets の名前解決のみフレッツ専用のDNSにフォワードする必要がある。bind を動かしているので、named.conf に以下の設定を追加する。

[/etc/namedb/named.conf]
zone "flets" IN {
        type forward;
        forward only;
        forwarders {
        220.210.194.67;
        220.210.194.68;
                };
        };

NATは pf で制御する。サーバとして外部に解放するポートは tcp_services としてまとめて定義している。DNSはudpだ。言われなくてもわかってるって。ゾーン転送はtcpだから許せ。本人がわかっていればいいんだ、うん。

[/etc/pf.conf]
# interface
ex_if="ng0"
in_if="re0"
flets_if="ng1"

# My service
tcp_services = "{20, 21, 22, 25, 53, 80, 110, 443}"

priv_nets    = "{127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 0.0.0.0, 255.255.255.255}"
flets_nets   = "{220.210.194.0/25, 220.210.195.0/26, 220.210.195.64/26, 220.210.197.0/25, 220.210.199.32/27, 220.210.199.200/29, 220.210.199.160/27, 220.210.199.192/27, 220.210.196.0/25, 220.210.196.128/26, 220.210.199.64/28, 220.210.198.0/26, 220.210.199.144/28}"

set block-policy drop
set loginterface $ex_if

scrub in all

# nat rule
nat on $flets_if from 192.168.1.0/24 to $flets_nets -> $flets_if
nat on $ex_if from 192.168.1.0/24 to any -> $ex_if
pass out on $flets_if route-to ($flets_if ng1) from 192.168.1.0/24 to $flets_nets
pass out on $ex_if route-to ($ex_if ng0) from 192.168.1.0/24 to any

# default rules
block log all
pass quick on lo0 all
pass quick on $in_if all
#antispoof log-all quick for $ex_if inet

block drop in  quick on $ex_if from $priv_nets to any
block drop out quick on $ex_if from any to $priv_nets

#antispoof log-all quick for $flets_if inet
block drop in  quick on $flets_if from $priv_nets to $flets_nets
block drop out quick on $flets_if from $flets_nets to $priv_nets

# filter rules on flets_squre
pass in quick on $flets_if inet proto icmp from $flets_nets icmp-type echoreq keep state

# allow My service on flets_squre
pass in on $flets_if inet proto tcp from $flets_nets to $flets_if port $tcp_services flags S/SA keep state
pass in on $flets_if inet proto udp from $flets_nets to $flets_if port 53
pass in on $in_if inet proto tcp from $flets_nets to $in_if flags S/SA keep state
pass in on $in_if inet proto udp from $flets_nets to $in_if port 53

# pass out all -> flets_squre
pass out quick on $flets_if proto tcp all modulate state flags S/SA
pass out quick on $flets_if proto {udp, icmp} all keep state

# filter rules
pass in quick on $ex_if inet proto icmp from any icmp-type echoreq keep state

# allow My service
pass in on $ex_if inet proto tcp from any to $ex_if port $tcp_services flags S/SA keep state
pass in on $ex_if inet proto udp from any to $ex_if port 53
pass in on $in_if inet proto tcp from any to $in_if flags S/SA keep state
pass in on $in_if inet proto udp from any to $in_if port 53

# pass out all -> ext
pass out quick on $ex_if proto tcp all modulate state flags S/SA
pass out quick on $ex_if proto {udp, icmp} all keep state

この設定で安定運用中。

この記事にコメントする

Powered by WordPress, WP Theme designed by WSC Project. ログイン