BobbyQuineのブログ(備忘録)

Linux関係の備忘録、その他タバコ、Vape関連なんかも。

自動的にDHCPサーバーが起動するようにする(systemdにおけるプログラムの自動起動)

ども、BobbyQuineです。今回はRaspberry pi 2(Arch Linux ARM) でdhcpサーバ組んだんでその方法をメモ書きとして残しておきます。なお、綺麗なやり方ではありません。(だってShellスクリプトの中にiptablesコマンド含まれてるし、起動時に固定IPをnetctl使って割り当てる設定方法がいまいち分からなくてip コマンドで何とかしてるし)

 

2018/04/11 追記:netctlを使ってのIP固定方法が分かったので追記。Unit作成の方法は個人的に忘れないために文章を取っておく。

 

毎度お馴染み、やるなら事故責任で

 

環境

先述のように今回はRaspberry Pi 2にArch Linux(公式が出してるわけではないので正式の記述ではない)を導入してそいつでDHCPサーバーを組みます。Wi-Fiドングルからインターネット回線を確保して、そいつをNATで有線の方にまわします。ここで無線インターフェース名はwlan0、有線インターフェース名はeth0であるものとします。もしこの記事を参考にする場合は ' $ ip link ' 等で自分のネットワークインターフェース名を調べて置き換えてください。また、wifiの起動時自動接続設定なんかはすでに済ませてます。

http://bobbyquine.hatenablog.com/entry/2018/04/10/192935

 

 

とりまdhcpdの導入

 

$ sudo pacman -S dhcp

 

$ sudo vim /etc/dhcpd.conf

default-lease-time 600;
max-lease-time 7200;
INTERFACES="eth0";
option domain-name "";
log-facility local7;

subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.10 10.0.0.20;
option routers 10.0.0.1;
option domain-name-servers 1.1.1.1;
}

 

#systemctl enable dhcpd4.service

 

本来よく使われるDNSは8.8.8.8のgoogleDNSサーバーだと思うのですが、つい最近1.1.1.1が話題になっていたので。

 

 IPフォワーディング

 

$ sudo vim /etc/sysctl.d/30-ipforward.conf

net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

 

ここから先はやり方を変えたので取り消し線が終わるとこまで飛んでください。

eth0に固定IPを割り振る作業とiptablesでチェインを追加するコマンドをまとめてシェルスクリプトに書く

今回一番ダメな箇所です。Arch Wikiのdhcpdのページを見ると自動で割り振るのにnetctlを使うとか書いてあるのですがいまいち使い方が分からなかったので「もういいもん、適当にシェルスクリプト書いてUnit化してやる」とヤケになってこんな風にしちゃいました。なお、ファイル名は当時ToughBookにネット共有するために書いたことによるものです。

 

$ vim toTOUGH.sh

#!/bin/bash
ip link set up dev eth0
ip addr add 10.0.0.1/24 dev eth0
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o wlan0 -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT

 

Systemdの起動時実行ファイル(Unitファイル)の作成

まぁsystemdの特性とかUnitファイルの書き方とかについての情報はググりゃ結構出てくるので他の人に任せるとしましょう。この辺が参考になりました。

https://qiita.com/tkato/items/6a227e7c2c2bde19521c

https://wiki.archlinux.jp/index.php/Systemd

 

まずはさっき作ったシェルスクリプトを/opt下に移動させます。/opt下に適当な(ただし他のサービス名とは被らない) ディレクトリ作って(ry

 

# mkdir /opt/RasPiNet

# mkdir /opt/RasPiNet/bin

# mv toTOUGH.sh /opt/RasPiNet/bin/

 

では今渡こそUnitファイルを作っていきます。完全に理解しているわけではないのであれですけど動いてはいるのでOK と言うことで。AfterとかBeforeとか抑えてるからいいよね。

 

# cd /etc/systemd/system/

# vim raspinet.service

Description = NAT from RasPi
After = sys-subsystem-net-devices-eth0.device sys-subsystem-net-devices-eth0.device
Before = dhcpd4.service
ConditionPathExists=/opt/RasPiNet/bin

[Service]
ExecStart=/opt/RasPiNet/bin/toTOUGH.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

 

systemdに追加Unitがあることを認識させる

# systemctl daemon-reload

 

作ったサービスとdhcpd4.serviceが自動起動するようにする

# systemctl enable raspinet.service

# systemctl enable dhcpd4.service

 

systemd-networkdをdisableにする

 # systemctl disable systemd-networkd

 

netctlを用いてeth0に固定IPを割り振る

 

# vim /etc/netctl/ethernet-static

Description='for dhcpd'
Interface=eth0
Connection=ethernet
IP=static
Address=('10.0.0.1/24')
SkipNoCarrier=yes

 

# netctl enable ethernet-static

 

iptablesでNAT関係の設定

# iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o wlan0 -j MASQUERADE
# iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT

 

# iptables-save > /etc/iptables/iptables.rules

 

# systemctl enable iptables

 

まぁ、こんな感じですかね。あとは再起動してみれば動くか分かる。わざわざUnitファイルを書いて新しいサービスを作らなくても使えるようになった。