FreeBSDでIPoE/DS-LiteとPPPoEを同時に使う
mioひかりのDS-Liteオプションの場合、IPv4へのインターネットがプライベートネットワークの中にあるので外部に向けてWebサーバーなどを公開することができません。そこで外部に向けてサービスを公開する場合はPPPoE(グローバルIPv4)の経路を使うことにします。
FreeBSDでIPoE/DS-LiteとPPPoEを同時に使う
mioひかりのDS-Liteオプションの場合、IPv4へのインターネットがプライベートネットワークの中にあるので外部に向けてWebサーバーなどを公開することができません。そこで外部に向けてサービスを公開する場合はPPPoE(グローバルIPv4)の経路を使うことにします。
構成はre0がWAN側、em0がLAN側です。また、DS-Liteのトンネルネットワークはgif0、PPPoEのセッションのインターフェースがtun0です。
今はgif0へのデフォルトルートが設定されているので、DS-Lite経由でIPv4インターネットに接続でき、tun0経由では、PPPoEでIPv4のインターネットに接続できる状態です。ルーターにはインターネットへの経路が2つあることになります。
あとはサービスを提供したいプロセスなりをPPPoEの経路を使ってあげられれば、PPPoEから外部にサービスを提供できます。
方法は2つあって、PF(Packet Filter)を使う方法とsetfib(Multiple Default Route)を使う方法があります。
1: PFを使う場合はreply-toを使います。この例では、tun0のIPアドレスでListenしているTCP 2222をtun0経由で外から通信できるようにします。
pass in quick on tun0 reply-to tun0 inet proto tcp from any to tun0 port 2222
また、PPPoEのセッションを張るときにデフォルトルートは設定しないようにします。(常にデフォルトルートはgif0です。)
ポートフォワーディングをしたい場合は、タグ付きrdrと組み合わせます。 LAN側でListenするなら、こっちを使う気がします。
rdr on tun0 inet proto tcp from any to self port 2222 tag r_myssh -> 10.0.1.10
pass in quick on tun0 reply-to tun0 tagged r_myssh
10.0.1.10はem0のアドレスです。この例では10.0.1.10にTCP 2222でListenしているサービスにr_mysshというタグを付けます。
他のICMPパケットについても同じくすべてのpassにreply-toを付けてあげればよいです。
2: setfib(Multiple Default Route)を使うともう少し柔軟な設定ができます。サービスによってはこっちのほうがいい場合があります。pfの方法では、インターネットへのアクセスはデフォルトルート(gif0)となってしまうので、サービスを提供しつつそれ自身がインターネットにも接続するサービスの場合、内向きはPPPoE、インターネットへはDS-Liteとなってしまいます。内向きもPPPoE、インターネットへもPPPoEがよければこちらのほうがいいと思います。
fib数(使いたいルートの数)をloader.confなどで設定します。DS-LiteとPPPoEを使うので2です。
# /boot/loader.conf
net.fibs="2"
fib 0がDS-Lite、fib 1がPPPoEとします。pppでのPPPoEへの接続自体はfib 1の経路を使いたいのでppp時のfibを設定します。
# /etc/rc.conf
ppp_enable="YES"
...
ppp_fib="1"
pppの設定で、デフォルトルートをtun0のゲートウェイにするように変更します。
# ppp.conf
default:
set device PPPoE:re0 #こっちはONUデバイスのインターフェース
...
add default HISADDR
再起動します。
$ setfib 1 traceroute google.com
$ setfib 0 traceroute google.com
setfibを使って経路を見てみます。違っていればうまく設定されているはず。
$ setfib 1 nc -l <tun0のIP> 501
Listenする場合も、setfibすれば、内向きとインターネットはそのルートを通るようになります。サービスの場合、rc.confでfibを設定できるので便利です。デフォルトは0。
# /etc/rc.conf
<servicename>_enable="YES"
<servicename>_fib="1"
LAN側でListenする場合は通常通りrdrを設定し、fib 1で起動します。
rdr pass on tun0 inet proto tcp from any to self port 501 -> 10.0.1.10
$ setfib 1 nc -l 10.0.1.10 501
これでこのncは10.0.1.10:501 TCPでListenしつつ、PPPoE経由で接続を受け、PPPoEでインターネットに接続できるようになります。
ファイアウォールについても通常のIPv4ルーターを作成する方法と同じです。setfibを使う場合は、reply-toは不要なので削除します。また、reply-toとの併用も可能ですが、どこかでコンフリクトする可能性もあるので注意したほうがいいかもしれません。
実行環境
FreeBSD 10.1-RELEASE-p30 #0 r296428
参考サイト
메타데이터
- post_id
- 5fdd635581ce
- slug
- freebsdでipoe-ds-liteとpppoeを同時に使う-5fdd635581ce
- url
- https://medium.com/@yusukeito/freebsd%E3%81%A7ipoe-ds-lite%E3%81%A8pppoe%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E4%BD%BF%E3%81%86-5fdd635581ce
- canonical_url
- https://medium.com/@yusukeito/freebsd%E3%81%A7ipoe-ds-lite%E3%81%A8pppoe%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E4%BD%BF%E3%81%86-5fdd635581ce
- author_url
- https://medium.com/@yusukeito
- status
- ok
- fetched_at
- 2026-06-17 12:55:42