追記
以前、9.5(stretch)用に書いていたものを、10.1(buster)用に一部記述を更新しました。
USBテザリングのネットワーク共有とその経緯
色々と事情(具体的に書くと、以前にインストールしたUbuntuの調子が悪く、少しいじって再起動するとルーターとして機能しなくなったので)があり、Debianを新規にインストールすることになりました。Ubuntuはデフォルト色々ごちゃごちゃインストールしてくれるため、updateをさぼったりすると不具合が生じますね。というわけで、Debianで最低限のシンプルインストールで行きます。これならCUIからのupdateも簡単にできますし(もちろんUbuntuでも色々やればできるとは思いますが…)。
やりたいことは、スマートフォンをUSB接続によるテザリングにてネットワークに接続し、その接続を複数台のPCで共有することです。手元では格安simの速度制限モードでの運用をしておりますので、速度はほとんど出ませんが、テキストメインのウェブ閲覧には十分です。テザリングはAndroidを使っておりますが、iPhoneでも可能とのことです。
立てるサービスは2つです。まず、ネットワーク共有する複数のPCのために、DHCPサーバーを立てます。テザリングによる接続ではDNSサーバーが動的に与えられますが、それをそのままDHCPで配る術があるのかもしれませんが、簡単に調べた範囲では見付かっておりません。そこで、DNSキャッシュサーバーを立て、自分自身のIPをDNSサーバーとして渡すことで解決しました。あとは、パケットのforwarding機能を有効にすれば、完成です。
インストールメディアの準備
昔はDVD-Rなどに焼いておりましたが、最近ではUSBフラッシュドライブ(以下USBディスク)からの起動が可能なマザーボードも多くなり、USBディスクを起動ディスクにしております。そのためには、インストール用のISOイメージと、ISOイメージをUSBディスクに書き込むためのソフトウェアが必要です。私はRufusを使っております。ダウンロードしたISOファイルを指定して、書き込むだけで完了すると思います。
インストール設定
今回は64GBの空いていたSSDを使いましたので、適当に「/」に8GB、「/usr」に8GB、「/var」に8GB、「/tmp」に8GB、「/home」に残り32GBとしました。標準ユーティリティとSSHサーバーのみを入れました。Xだのごちゃごちゃと入れなければ、64GBでも相当に余るくらいです。インストール直後にdfをしてみると「/」5%、「/usr」7%、「/var」4%、「/tmp」1%、「/home」1%しか使用しておりませんでした。16GBのSSDでも今回の用途であれば十分過ぎるくらいですね。
パーティションの設定以外、特にいじった記憶はありません。以下の作業は、適宜sudo等適切な権限で行ってください。
ネットワークへの接続
USBでのテザリングでの接続のため、最初に色々とやる作業があります。最初に接続されているネットワークインターフェースを確認します。
ip address
まずはスマートフォンをUSB接続で繋いで、スマートフォン側のテザリングの設定を有効にします。その状態でもう一度ネットワークインターフェースを確認します。増えているものがテザリングでの接続です。手元では「enp0s29f7u4」でしたので、これを使います。
繋いだだけでは繋らないので、dhcpクライアントを実行しなければなりません。いつの間にかdhcpcdは見付からず、代わりにdhclientがインストールされておりますので
dhclient enp0s29f7u4
を実行して、しばらくすると外部と繋るようになります。pingなどで確認してください。
aptの最低限の設定
ミラーサイトの設定を行います。Debian JPのサイトに従いまして、「/etc/apt/sources.list」に
deb http://ftp.jp.debian.org/debian/ buster main contrib non-free deb http://ftp.jp.debian.org/debian buster-updates main contrib
を設定させていただきます。そのあと、
apt update
あたりでデータベースをupdateして、適当に必要なソフトを放り込みます。私などは上の作業は辛うじて使えるviを使っておりますが、あまり自由に使えないのでemacs-noxを入れたり、apt-get/cacheの代用のaptitude、それからnicのfirmware-realtek、net-toolsなども入れました。
USBディスクのマウントとaptレポジトリとして利用
何かファイルのやりとりの際に便利なUSBディスクのマウントも覚書として残しておきます。
ls /dev/sd*
で表示させてみて、起動用の他に見付かるものを探します。手元だとsdbとsdb1が見付かります。なので、sdb1をマウントしてみます。適当に/media以下にusb0というディレクトリを作って
mount -t vfat /dev/sdb1 /media/usb0
を実行すると「/media/usb0以下」にいろいろと見えるようになります。今回は特に使いませんでしたが、何かと必要になる可能性があるのでメモしておきました。インストール時に使ったUSBをマウントし、これを「/etc/fstab」あたりに書いておきますと、
apt-cdrom add -d path
でマウントされば場所(/media/usb0)を上のpathに指定すると、aptのレポジトリとして加えられるようです。試しておりませんが、ネットワークに最初繋らず、NICのドライバをbuildするためにローカルからパッケージを入れたい場合などに重宝すると思います。「/etc/fstab」に書く内容としては
/dev/sdb1 /media/usb0 vfat rw,isocharset=utf8,codepage=932,user,noauto,flush,noatime 0 0
くらいでしょうか。
ネットワークの設定
NICをip addressコマンドで確認すると、enp6s0になっているので設定を「/etc/network/interfaces」に書いておきます。enp6s0側にPCを接続してDHCPでIPを配り、またenp0s29f7u4側からインターネットに接続することになります。また最近ではnet-toolsがデフォルトでインストールされないため「ifconfig」が使えずに少々焦りましたので、必要に応じて「apt install net-tools」をやっておくといいかもしれません。
auto enp6s0 iface enp6s0 inet static address 192.168.0.1 netmask 255.255.255.0 auto enp0s29f7u4 iface enp0s29f7u4 inet dhcp
DNSサーバーの設定
最近、インストール後に「/etc/resolv.conf」がないことが多くなりました。ない場合、DNSの解決ができませんので、その場合は自分で作れば解決することが多いです。適当に、
nameserver 192.168.0.1
あたりで作っておくと上手く行きました。
DHCPサーバー、DNSキャッシュサーバーのインストール
isc-dhcp-serverやbindを組み合わせる程に仰々しいことをやりたいわけではないので、簡単に設定ができるdnsmasqを使いました。
aptitude install dnsmasq
でインストールをします。一度
systemctl stop dnsmasq
で止めてから、設定を変えます。「/etc/dnsmasq.conf」の
port=53 interface=enp6s0 dhcp-range=192.168.0.10,192.168.0.20,12h
などの設定のコメントを外し、適切な値を設定します。portを指定することでDNSキャッシュサーバーを動かし、DNSとDHCPのインターフェースを限定をかけ、DHCPで配るIPを指定します。Debianも8.0系列からsystemdが標準になり、最初はとまどいながら設定しました。
参考にさせていただいたサイト
設定の後は
systemctl start dnsmasq systemctl enable dnsmasq
とやってエラーなく動くことを確認し、自動的に起動するように設定します。以下で簡単にsystemctlをまとめておきます。UNITは各サービスユニット名に置き換えてください。
- サービス一覧 systemctl list-unit-files -t service
- サービス起動 systemctl start UNIT
- サービス停止 systemctl stop UNIT
- サービス再起動 systemctl restart UNIT
- サービスリロード systemctl reload UNIT
- サービスステータス表示 systemctl status UNIT
- サービス自動起動有効 systemctl enable UNIT
- サービス自動起動無効 systemctl disable UNIT
- サービス自動起動設定確認 systemctl is-enabled UNIT
フォワーディングの設定
フォワーディングの設定を「/etc/sysctl.conf」に記述(コメントを外す)
net.ipv4.ip_forward=1
上記設定の反映は
sysctl -p cat /proc/sys/net/ipv4/ip_forward
で確認しておきます。
iptablesの設定
本来であればwrapperのufwを使うのが簡単なのかもしれないけど、iptablesの方に慣れているので。また色々としたfirewallとしての設定は省略しております。
iptables -t nat -A POSTROUTING -o enp0s29f7u4 -j MASQUERADE iptables-save > /etc/iptables.rules
起動時に読み込む設定を「/etc/network/if-pre-up.d/iptables」として
#!/bin/sh /sbin/iptables-restore < /etc/iptables.rules
の内容で作成し
chmod 755 /etc/network/if-pre-up.d/iptables
としておきました。
aptでの自動アップデートの設定
「/etc/cron.daily」あたりに、実行属性を付けたファイルに
apt update apt upgrade -y
くらいを書いておいておいたんだけど、何故か実行されておりません。調べてみると、どうもanacronが入っていないことが原因っぽい。確かに「/etc/crontab」を確認してみると、anacronを使っていますね。というわけで、
sudo apt install anacron sudo systemctl enable anacron.service sudo systemctl start anacron.service
くらいを実行しておきました。参考にさせていただいたサイト。
コメント