ネットワークの設定(PPPoE編)

1.ADSLモデムの設定

PPPoEのADSLモデムの場合ブリッジモードかルーターモードが有ります。
光モデムの場合はブリッジモードしかありません。
ルーターモードの場合はPPPoAと同じ設定になりますのでここではブリッジモードでFreeBSDマシンがPPPoEログインする
設定を説明します。ADSLモデムをルーターとして使うといろいろ不具合が多いのでPPPoEの方はブリッジモードでの使用をお薦めします。

ADSLモデムの設定はブリッジモードにするだけで他には特に何も有りません。

2.freeBSDマシンの設定

WAN側インターフェース名:xl0
LAN側インターフェース名:fxp0
Kernelの編集をする(ファイル名は既にMYKERNとして話を進めます)

/usr/src/sys/amd64/conf/MYKERN を編集する
ident MYKERN #変更−ファイル名に合わせる
device tun #有効になっているのを確認
device bpf ##有効になっているのを確認.DHCPを使わない場合コメントアウトするのがセキュリティー的にいいらしい
options NETGRAPH #追加−PPP接続に必要
options NETGRAPH_ETHER #追加−PPP接続に必要(一応なくても動く)
options NETGRAPH_PPPOE #追加−PPP接続に必要(一応なくても動く)
options NETGRAPH_SOCKET #追加−PPP接続に必要(一応なくても動く)
options NETGRAPH_EIFACE #追加−なんだか分からない
options NETGRAPH_BRIDGE #追加−なんだか分からない
options IPFILTER #追加−IPFILTERに必要
options IPFILTER_LOOKUP #追加−なんだか分からない
options IPFILTER_DEFAULT_BLOCK #追加−IPFILTERのデフォルト設定でパケットをブロック

/etc/rc.conf を編集する
gateway_enable="YES" #NIC間にパケットを通す
ifconfig_xl0="UP" #WAN側は設定せずアクティブにする
ifconfig_fxp0="inet 192.168.1.1 netmask 255.255.255.0" #LAN側設定(固定)
ppp_enable="YES" #PPPoEを使う
ppp_mode="ddial" #ddialモードで接続する
ppp_profile="dion" #接続プロバイダ名(ppp.conf内で記述するもの)
ppp_nat="NO" #PPPoEのNAT機能の停止(IPFilterを使用するため)
portmap_enable="NO" #PORTMAP
tcp_restrict_rst="YES"
tcp_drop_synfin="YES"
ipfilter_enable="YES" #IPFILTERを有効にする
ipfilter_rules="/etc/ipf.rules" #ルールファイルを指定(設定は項目6で説明)
ipfilter_flags="" #特にオプションの指定はしない
ipmon_enable="YES" #IPMON(IP MONITOR)を有効にする
ipmon_flags="-D /var/log/ipflog" #IPMONをデーモンとして起動し、/var/log/ipflogにフィルター結果を書き出す
ipnat_enable="YES" #NATの設定これがないとマスカレードしません
ipnat_rules="/etc/ipnat.rules" #NATのルールを読み込む(設定は項目6で説明)
注意としてPPPOEの場合はIPFのほうがtun0にIPが割り当てられるより前に動作してしまう為、別のシェルスクリプトでもう一度ipfとipfnatを動作させる必要がある。ipfstart.shとして後述参照。
またデフォルトルーターは記載しない事。

/etc/ppp/ppp.conf を編集する
default:
 set device PPPoE:xl0 #WAN側のtun0デバイスに割り当てるIFカードを指定
 set MRU 1454 #BLACKHALL問題の回避の為MRUとMTUの値を調整
 set MTU 1454
 set log Phase Chat LCP IPCP CCP tun command
 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0   
 set ctsrts off
 add default HISADDR # Add a (sticky) default route
 accept CHAP #PAPの場合はCHAPをPAPにする
 enable dns # request DNS info (for resolv.conf) #ログインすると自動的にresolv.confが書き換えられてしまうので自前DNSは無しが良い
dion:
 set authname **********@bda.dion.ne.jp #プロバイダからのID
 set authkey ******* #プロバイダからのパスワード
 add default HISADDR
 set server /var/run/dion "" 0177
``:'' で終る行は 1 カラム目から始め, その他の行はスペースまたはタブで以下の例のように段をつける (インデントする) 必要があることに注意してください。

ipfstart.shとして/usr/local/etc/rc.d/以下に作成。作成後はchmod 755 ipfstart.shで起動属性にしておく。
#!/bin/sh
ipf -Fa -Z -f /etc/ipf.rules

case $1 in
'start' )
if [ -r /etc/ipnat.rules ] ; then
/sbin/ipnat -f /etc/ipnat.rules
fi
;;
'stop' )
/sbin/ipnat -C
;;
* )
echo "usage : ipfstart.sh {start|stop}"
;;
esac

/etc/hosts を編集する
::1     localhost
127.0.0.1 localhost   #ドメイン名も入れるとなお良い
192.168.1.1 server   #BSDマシン

/etc/resolv.conf を編集する
nameserver 202.238.**.**    #DNSサーバーのIPアドレス、PPPログイン時に取得する場合は入力しないと思います
domain hogehoge.org        #ローカル内のドメイン名

3.クライアントマシンの設定

クライアントに接続するマシンのネットワーク設定も必要になります。
後半にDHCPサーバーの設定が有りますので、そちらをデーモンで走らせればこの項目を設定する必要はありません。

・IPアドレスとマシン名
  上記hostsファイルに設定したようにクライアントマシンも設定する
・DNS
  上記resolv.confと同じプロバイダーのDNS番号を入力する
・デフォルトゲートウェイ
  192.168.1.1(BSDマシンのLAN側IPアドレスを入力)
・サブネットマスク
  255.255.255.0
  rc.confでLAN側の設定をしたマスクと同じにする

以上で設定は終了です。
これで立ち上げ直せばfreeBSDからインターネットへの接続と、クライアントマシン−freeBSD間のネットワークは動作しますが
まだ、クライアントマシンがインターネットには接続出来ません。次のfirewallでNAT機能を動かしますのでそこまで設定してから
インターネットに接続しましょう。

4.ipf設定後の検証

設定が間違えていなければコマンドラインで以下を入力する事でネットワークの設定がどうなっているかわかります。
$ ifconfig
xl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
  options=3<rxcsum,txcsum>
  ether 00:e0:18:01:3d:39
  media: Ethernet autoselect (100baseTX <full-duplex>)
  status: active
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
  inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
  ether 00:d0:b7:1b:52:39
  media: Ethernet autoselect (100baseTX <full-duplex>)
  status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
  inet 127.0.0.1 netmask 0xff000000
ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1454
  inet 218.219.224.76 --> 61.125.204.5 netmask 0xffffff00
  Opened by PID 65
$
ポイントは「tun0」にIPアドレスが割り当てられていれば成功です。
どこかで間違いなどが有るとつながりませんが、ルート権限でコマンドラインにて
# /usr/sbin/ppp -quiet -ddial プロバイダー名
と打ち込めばログイン作業が走りますので、設定ファイルを直した後、試すといいでしょう。
立ち上げと同じスタートであれば
# /etc/rc.d/ppp start
でも接続できます。

切断は
# /usr/sbin/pppctl /var/run/dion close
と打ち込めば切断されるはずです。
もしくはrc.confの設定通りであれば
# /etc/rc.d/ppp stop
で切断できます。
カーネルに間違いが有る場合は、再起動が必要ですが...
設定が間違えていなければコマンドラインで以下を入力する事でネットワークの設定がどうなっているかわかります。
またルートの確認方法で
$ netstat -r
Routing tables

Internet:
Destination   Gateway   Flags  Netif Expire
default     ****     US    tun0
localhost    link#3     UH   lo0
192.168.1.0/24 link#2     U    em0
server      link#2     UHS  lo0
・・・
のようにdefaultがtun0になっていればデフォルトルーターの設定は正しいことが分かる。

5.トラブルシューティング

ipnatが機能しない場合があります。
# /etc/rc.d/ipnat start
70:ioctl(SIOCGNATS) object size mismatch for copying out ipfobj
Installing NAT rules.

FreeBSDのバージョンにもよるのですが、IPSECやIPV6を入れると良かったり、無い方が良かったりと良く分かりません。

IPV6やIPSECなどを無くす場合(11.1は無い方が動きました)
/usr/src/sys/amd64/conf/MYKERN
makeoptions MKMODULESENV+="WITHOUT_INET6_SUPPORT="
nooptions INET6
#options INET6
#options IPSEC

/etc/make.conf
NOINET6="YES"
NO_INET6="YES"
WITHOUT_INET6="YES"

# ここから下はついで
NOBLUETOOTH="YES"
NO_BLUETOOTH="YES"
WITHOUT_BLUETOOTH="YES"
NOWIRELESS="YES"
NO_WIRELESS="YES"
WITHOUT_WIRELESS="YES"
この状態でipfをコンパイルするとINET6無しで動くと思われます。
# cd /usr/src/sbin/ipf && make obj && make buildincludes && make && make install

逆はINET6などを有効にしてmake.confからも削除します。
FreeBSD11.3は全て有効にしないとipnatは動きませんでした。
FreeBSD13.0では上記カーネル構築とmake.conf編集後にipf再コンパイルでipnatは動きました。