スキップしてメイン コンテンツに移動

投稿

6月, 2024の投稿を表示しています

フレッツ光クロス固定IP(V6プラス)にてDHCPCDをつかってプレフィックス変更に備える

フレッツ光クロス固定IP(enひかりクロス+V6プラス固定IP)でDebianを使ったLinuxルータを運用し、本稿執筆時点で一年2か月ほど使っているのですが、二か月ほど前(ちょうど一年たったころ)IPv6プレフィックスが変更され通信できなくなった経験がありました。 当初は何が起こったのか分からなかったのですが、その時はdhclientを使っていてデバッグモードで立ち上げると新しいプレフィックスが降りてきたことが確認できました。半固定というより、突然だったので動的だよなこれ、と思ったのは言うまでもありません。 その後、スクリプトなどを順に追っていって無事IPv6/IPv4ともに通信できましたが、今後もIPv6プレフィックスが変更されうると想定しておく方がよいと思い、サーバにはGUAを割り当てずULAのみにし、また、dhclientでは対応が難しい(dhcpv6サーバからのReconfigure messageに対してlogにメッセージを吐くだけ)ので、Reconfigure messageに対してリアクションができるdhcpcdに切り替えました。 ただ、プレフィックスの変更があった場合、このルータ上ではdhcpcdがルータのIPv6設定を更新しIPv6通信はできるのですが、IPv4通信などはプレフィックスが変更されるのでIP4IP6トンネルが無効になり、IPv4での通信ができなくなります。 他にも、dhcpサーバも配布するGUAが変更されるので、設定ファイルの書き換え・再起動が必要になります。/etc/radvd.confも同じで書き換えてradvdを再起動させる必要があります。また、ULAを使っている場合は、nftablesのルールも書き換える必要があります。さらにサブルータを使っている場合は、サブルータの設定も変更しなければなりません。 このようにIPv6 GUAプレフィックス変更時の対応は思った以上に大変で、手動で変更するには時間的にも手数的にも限界があると思います。 そこでIPv6プレフィックスの変更について、dhcpcdには色々なreasonのeventをhookで処理できるのでどのような対応ができるか調べたところ、RECONFIGURE6はlogにメッセージを吐くだけですが、RECONFIGURE6が発生した直後にreason=RENEW6

NetworkManagerクライアントからkea-dhcp-ddnsにてBind9にIPv4/IPv6両アドレスを登録する

今回も表題の通りなのですが、NetworkManagerクライアントでDHCPv4/DHCPv6の両アドレスを取得し、Kea-dhcp-ddns経由でBind9に登録する方法です。 設定はクライアントマシンで行います。概要としてはnmcliでipv6 duidはllに設定し、ipv4 client id は下記の要領で生成したものを設定するとIPv4/IPv6共にBind9に登録できました。 クライアントマシンでの設定は以下の通りです。事前に"ip a" コマンドなどで mac address を、接続名を "nmcli con show" などで 調べておいてください。 macaddr=00:15:5d:01:9c:67 connection="Wired connection 1" client_id=`echo ff:$(echo $macaddr | cut -d ":" -f 3-6):00:03:00:01:$macaddr` sudo nmcli con mod "$connection" ipv4.dhcp-client-id "$client_id" sudo nmcli con mod "$connection" ipv6.dhcp-duid ll mac addressについてはdhcp clientが動作するインターフェースが例えばeth0だと分かっていれば以下のスクリプトでも設定できます。 DEV=eth0 connection="Wired connection 1" macaddr=`ip a sho dev $DEV | grep ether | awk '{print $2}'` client_id=`echo ff:$(echo $macaddr | cut -d ":" -f 3-6):00:03:00:01:$macaddr` sudo nmcli con mod "$connection" ipv4.dhcp-client-id "$client_id" sudo nmcli con

kea-dhcp-ddns-serverにてipv4/ipv6アドレスとクライアント側で保存したホスト名をbind9に自動登録(正引きのみ)

表題が分かりにくくて申し訳ないのですが、要するにkeaとbind9でのddnsで、kea-dhcpが生成したホスト名ではなく、クライアントのインストール時またはインストール後に指定・登録したホスト名をbind9に正引きのみ登録するという事です。 例えば、Debian 12の場合、インストール時にdhcpでkeaからアドレスをもらうと、ホスト名については、初めはkeaから生成されたホスト名が入ります。これを上書きしてホスト名をクライアント側で登録しておくと、インストール終了後、再起動した後は、この上書き登録したホスト名でbindに登録されるという事です。 このため、クライアントがipv4/ipv6を取得・bindへホスト名・アドレスを登録するにあたり、今回は検証目的のため設定が楽なdhcpcdを使いました。(2024/06/28追記:クライアントがNeworkManagerの場合については こちら を参考にして下さい。) なお環境はサーバ・クライアント共にDebian 12です。 まずは、クライアントの設定です。先に、dhcpcdをインストールしてisc-dhcp-clientは削除します。具体的には以下の様にします。 apt-get install dhcpcd dpkg -P isc-dhcp-client つづいて/etc/dhcpcd.confの作成をします。インストール時のdefaultの/etc/dhcpcd.confを保存し、以下の様にします。(2024/06/28:/etc/resolv.confが暫くすると空になる為修正) cd /etc cp -a dhcpcd.conf dhcpcd.conf.orig cat <<EOF > dhcpcd.conf hostname noipv6rs clientid duid ll persistent option domain_name_servers, domain_name, domain_search noipv4ll interface eth0 ipv6rs ipv6ra_noautoconf iaid 1 ia_na 1 eth0 EOF hostnameはクライアントのホスト名を"dhcp経由でクライアント側から送る"設

Debian 12でsamba-ad-dcのinternal dnsをbind9 dlzに変更

基本的にsambaのwikiにある手順で行けましたが、記載されている内容がソースコードをコンパイルしてインストールしたものだったので、Debian 12でのパッケージでインストールした場合とパスなどが異なるので備忘録として挙げてみることにしました。 以下、凡その手順です。 sudo apt-get install bind9 sudo systemctl stop bind9 sudo systemctl stop samba-ad-dc sudo samba_upgradedns --dns-backend=BIND9_DLZ # /etc/samba/smb.confを編集し、以下を追加する server services = -dns #下記ファイル /etc/bind/named.conf に以下を追加 include "/var/lib/samba/bind-dns/named.conf"; ## 参考 $ sudo echo include \"/var/lib/samba/bind-dns/named.conf\"\; >> /etc/bind/named.conf # bindのバージョンを確認する named -v BIND 9.18.24-1-Debian (Extended Support Version) # 今回は dlz_bind9 ライブラリは以下にあるので控えておく。 #(参考: apt-get install apt-file; apt-file update; apt-file search dlz_bind9) /usr/lib/x86_64-linux-gnu/samba/bind9/dlz_bind9_18.so # /var/lib/samba/bind-dns/named.confを以下の内容で作成 #(または同等になっていることを確認する。Debian 12の場合何もしなくても同等になっていました。) dlz "AD DNS Zone" { database "dlopen /usr/lib/x86_64-linux-gnu/samba/bind9/dlz_bind9_18.so"; }; # /etc/

BIND9_DLZのsambaサーバにkrb5-userクライアントからnsupdateでDNSレコードを追加する

管理対象機が思ったより増え、アドレス直打ちでアクセスするのもアレなので手動で簡単にsambaのバックエンドDNS(BIND9_DLZ)に対しsamba関連パッケージを導入せずにレコードの追加できないものかと思っていたのですが、調べたところnsupdate -gだとkrb5-userパッケージだけでできそうだったので試したところあっさりと行けたので備忘録として挙げてみることにしました。 今回も環境はクライアント・サーバともにDebian 12で、サーバについては表題の通りDNSバックエンドがBIND9_DLZの物を対象にしていますが、詳細はここでは触れません。クライアントはkrb5-userパッケージ(kinit)とbind9-dnsutils(nsupdate)がインストールされていればよく、winbindやsamba関係が入っていなくても大丈夫です。 続いて設定です。bind9-dnsutilsはおそらく初めからインストールされているはずなので、dpkg -l bind9-dnsutilsとしてインストールされていることを確認するか、which nsupdateでコマンドがあるか確認してください。 次はkrb5-userパッケージです。これは初期状態ではインストールされていないので、aptなどでインストールしてください。必要なパッケージも一緒にインストールされるので大丈夫です。インストールするとデフォルトのrealmを聞いてくるので大文字で対象となるsambaサーバのドメイン名を入力します。次はdefaultのKerberos serversを聞いてくるので、sambaサーバの名前解決ができる(pingが通る)fqdnを入力してください。続いてAdministrative サーバをfqdnで入力します。これもsambaサーバの名前で大丈夫です。設定は以上です。 次は実際にDNSレコードを以下の様にして追加します。 kinit administrator@TESTDOM.MYDOMAIN.LOCAL Password for administrator@TESTDOM.MYDOMAIN.LOCAL: Warning: Your password will expire in 40 days on Sat Aug 3 10:54:43 2024 $ ns

プレフィックス変更時にkea-dhcp6.confを更新するスクリプトの雛型

プレフィックス変更時にkea-dhcp6.confを更新するスクリプトの雛型を書いてみました。大分手古摺ったのですが、例えば置換対象が、2111:2222:3333:4400ではなく、2111:2222::/56や2111:2222:3333::/56、2111:2222:333:400::/56のような変則的な場合などにも対応する必要があると想定したためです。 かなりゴチャッとしていますが、およそ以下の様になりました。 #!/bin/sh if [ $# -ne 3 ];then echo "Usage: $0 OLD_GUA NEW_GUA TARGET_CONF"; exit 1 fi replace_file() { if [ -e "$1" ]; then if comp_file "$1" "$2"; then echo comp_file "$1" "$2" same > /var/lib/dhcpcd/msgs.txt rm -f "$2" return 1 fi fi cat "$2" > "$1" rm -f "$2" return 0 } OLD_GUA=$1 NEW_GUA=$2 TARGET_CONF=$3 # backup TARGET_CONF before processing. FILENAME=$(basename $TARGET_CONF) cp -a $TARGET_CONF /var/lib/dhcpcd/$FILENAME.`date '+%Y_%m_%d-%H:%M:%S'` # copy $TARGET_CONF /var/lib/dhcpcd/$FILENAME cp -a $TA

フレッツ光クロス v6プラス 固定IP 環境でULA/GUA変換をnftablesにて行う

以前の投稿では、ULA/GUA変換をip6tablesのNETMAPで行おうとしていたのですが、新規にインストールしたDebian 12ルータではインターネットに接続できませんでした。(ですので以前の投稿は非公開にしました)。フレッツ光クロス v6プラス固定IP環境では、ルータ上にtunnnelデバイスとlanデバイスとwanデバイスの三つのインターフェースがあり、in interfaceとout interfaceをNETMAPモジュールでは同時に指定できないためだと思います。 そのため、一時 ONU直下のルータにOpewnWrtを導入していたのですが、 IPv6 NPTを行う記述 を参考にしてULA/GUA変換を行っていたので、それをDebian 12ルータでも設定してみたところ、in/out インターフェスの指定は必要だったのですが、動作できたので備忘録として挙げてみることにしました。 nftablesへの設定追加スクリプトは以下の通りです。 WANDEV=enp1s0f1 LANDEV=enp1s0f0 GUA=2aaa:bbbb:cccc:dd00::/56 ULA=fd00:1:1::/56 nft add table ip6 nat66 nft add chain ip6 nat66 PREROUTING { type nat hook prerouting priority dstnat\; policy accept\; } nft add chain ip6 nat66 INPUT { type nat hook input priority 100\; policy accept\; } nft add chain ip6 nat66 OUTPUT { type nat hook output priority -100\; policy accept\; } nft add chain ip6 nat66 POSTROUTING { type nat hook postrouting priority srcnat\; policy accept\; } nft insert rule ip6 nat66 PREROUTING iifname "${WANDEV}" oifname "${LANDEV

iptables/ip6tables(nftablesベース)で初期状態のrulesを作成する

プレフィックスの変更があったので、変更を反映させる処理を引き続きこまごまと準備しているのですが、例えばDebian 12では、iptablesのバックエンドがnftablesになっているので、nftablesとiptablesをなるべく同じrulesetで運用したい場合、先にiptablesのルールセットを作る必要があります。しかし、たとえばiptablesのルールセットが空の場合、nftablesのルールセットも空になってしまいます。つまりこの状態だとiptables-save/ip6tables-saveでもnft list rulesetでも何も表示されません。ですので、取敢えずiptablesで初期状態のrulesを作成する為、下記の様にしてみましたので備忘録として挙げてみることにしました。 iptablesはいつもの様に apt-get install iptables-persistentでインストールしておいてください。 #!/bin/bash iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P INPUT ACCEPT iptables -t mangle -P FORWARD ACCEPT iptables -t mangle -P OUTPUT ACCEPT iptables -t mangle -P POSTROUTING ACCEPT iptables -t filter -P INPUT ACCEPT iptables -t filter -P FORWARD ACCEPT iptables -t filter -P OUTPUT ACCEPT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P INPUT ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -Z iptables-save > /etc/iptables/rules.v4.init ip6tables -t mangle -P PREROUTING ACCEPT ip6tables -t mangle

dhcpcdのhooksで特定ファイルの書き込み許可をsystemdのservice起動時オプションで指定する

インストール直後のdhcpcdでは、Debian 12の場合、たとえば/etc/test.confというファイルを作成・編集したい場合、パーミッションエラーがでしまいます。dhcpcdの起動時のオプションでは "--configure"というオプションがあり、これだとシステムファイルすべてに編集許可が入るので好ましくありません。しかし、そのままでも/etc/resolv.confは編集できるのに、他のファイルは編集できないのでなぜか分からず困っていました。そこで、取敢えず起動オプションを見ようと思い、 /usr/lib/systemd/system/dhcpcd.service を見てみると以下の様になっていました。 --snip-- ReadWritePaths=/var/lib/dhcpcd /run/dhcpcd /etc/wpa_supplicant /etc/dhcpcd.conf /etc/resolv.conf --snip-- systemd サービスの設定ファイルはあまり触らないのですが、どうやら読取書込許可をここで設定できるようです。そこで試しに /etc/test.conf というファイルをここに追加したところ、無事に編集できるようになりました。 dhcpcdの機能そのものについてではないのですが、hooksスクリプトで指定したファイルの編集ができるようになったので、備忘録として挙げてみることにしました。 今回は以上です。それでは。

KEA dhcp server にコマンドを送る

Kea dhcp serverはisc-dhcp-serverとは異なり、コマンドを送信して結果を返す機能があるようです。コマンドを受け付けるにはcontrol-socketを指定するとよく、さらに、hooks-librariesを読み込ませると関連コマンドが利用可能に成るようです。 Debian 12 の場合だと、kea-ctrl-agent というパッケージをインストールして、以下の様にするとコマンド(例はlease commands)を受け付けるようになります。 apt-get install kea-ctrl-agent #/etc/kea/kea-dhcp4.conf { "Dhcp4": { "control-socket": { "socket-type": "unix", "socket-name": "/run/kea/kea4-ctrl-socket" }, "hooks-libraries": [ { "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_lease_cmds.so" } ], --snip #/etc/kea/kea-dhcp6.conf { "Dhcp6": { "control-socket": { "socket-type": "unix", "socket-name": "/run/kea/kea6-ctrl-socket" }, "hooks-libraries": [ { "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/

KEA DHCP4の基本的な設定

DHCPv6サーバをisc-dhcp-server からkea-dhcp6にしたので、DHCPv4サーバもkea-dhcp4にしてみました。基本的な設定ですが備忘録として挙げてみることにしました。環境はDebian 12です。 まず初めに、パッケージをインストールします。 apt-get install kea-dhcp4-server 続いて設定ですが、kea-dhcp6-serverと同じく起動が早すぎるためかソケットの作成に失敗した旨のメッセージがでたので、以下の様にします。 # /lib/systemd/system/kea-dhcp4-server.service StateDirectory=kea ExecStartPre=/bin/sleep 5 ExecStart=/usr/sbin/kea-dhcp4 -c /etc/kea/kea-dhcp4.conf kea-dhcp4.confの設定は以下の通りです。 (2024/06/16修正: option-data domain-name-serversを pool内に移動) (2024/06/18追加: subnet id) { "Dhcp4": { "interfaces-config": { "interfaces": [ "eth1" ] }, "lease-database": { "type": "memfile", "persist": true, "name": "/var/lib/kea/kea-leases4.csv", "lfc-interval": 3600 }, "expired-leases-processing": { "reclaim-timer-wait-time": 10, "flush-reclaimed-timer-wa

KEA DHCP6 Serverでshared-networksでPrefix Length /64以上を委譲

共有ネットワークshared-networks設定で同時に二つのIPv6アドレス(GUAとULA)を割り当てられないものかと思い、KEA DHCP6サーバを構成してみたところ、結論からいうと、isc-dhcp-serverと同じで、同時に二つのIPv6アドレスはクライアントには割り当てできませんでしたが、/68、/72, /80(/64ではありません)の付与と下位ルータへのプレフィックス委譲はできたので、取敢えず備忘録として挙げてみることにしました。 構成概要はこちらです。 環境はDebian 12でhyper-vゲストとして構築しています。 早速設定です。設定はR151です。まず初めにisc-dhcp-serverと併存させるため、isc-dhcp-serverはIPv4だけ起動するようにしたのですが、以下の様にしました。 # /etc/defaujlt/isc-dhcp-server -- snip -- INTERFACESv4="eth1" INTERFACESv6="" これだけですが、変更したらisc-dhcp-serverを再起動してください。続いてkea-dhcp6-serverをインストールします。 sudo apt-get install kea-dhcp6-server ここもこれだけで、mariadb(データベース)もインストールされますが、今回は小規模なテスト環境なのでcsvファイルで対応することにしました。 R151の/etc/kea/kea-dhcp6.confは以下の通りです。 { # DHCPv6 configuration starts on the next line "Dhcp6": { # First we set up global values "valid-lifetime": 4000, "renew-timer": 1000, "rebind-timer": 2000, "preferred-lifetime": 3000, # Next we set up the interfaces to be used by t