Skip to content

Instantly share code, notes, and snippets.

@hagevvashi
Last active January 22, 2023 13:34
Show Gist options
  • Save hagevvashi/b8505195728f4ea7f5ced29487104c98 to your computer and use it in GitHub Desktop.
Save hagevvashi/b8505195728f4ea7f5ced29487104c98 to your computer and use it in GitHub Desktop.
ubuntu server で wifi 動かすまで

インストールした順番

  1. libpcsclite1_1.9.1-1_amd64.deb

  2. libnl-3-200_3.4.0-1+b1_amd64.deb

  3. libnl-route-3-200_3.4.0-1+b1_amd64.deb

  4. wpasupplicant_2.9.0-21_amd64.deb

  5. net-tools_1.60+git20161116.90da8a0-1ubuntu1_amd64.deb

ここまでで事前準備終了

次は wpa_supplicant の設定

sudo wpa_passphrase <ssid> [passphrase] > $HOME/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root

#ap_scan=1
network={
    ssid="your-ssid"
    #psk="your-pass"
    psk="your-pass-encrypted"
    key_mgmt=WPA-PSK
    proto=WPA WPA2
    pairwise=CCMP TKIP
    group=CCMP TKIP WEP104 WEP40
}

起動

sudo wpa_supplicant -Dwext -iwlp2s0 -c/home/<user>/wpa_supplicant.conf -B

apt で依存関係修復をしたら色々おかしくなった

で、インストールしたもの

  1. libnl-genl-3-200_3.4.0-1+b1_amd64.deb
  2. firmware-iwlwifi_20190114-2_all.deb https://packages.debian.org/search?keywords=firmware-iwlwifi ここから stable をダウンロード

2 のインストールコマンド

sudo dpkg -i --force-overwrite firmware-iwlwifi_20190114-2_all.deb

わかっていること

下記コマンドでネットワークインターフェースの状態を確認

sudo  lshw -class network
  *-network UNCLAIMED
      description: Ethernet controller
      ...

UNCLAIMEDと表示されているためドライバが認識されていなさそう

下記コマンドでPCIデバイスの情報を表示する

lspci
02:00.0 Ethernet Controller: Marvell Technology Group Ltd. 88W8897 [AVASTAR] 802.11ac Wireless

という表記が見て取れるので、この88W8897のドライバをインストールすればよい

surface laptop のデバイス/ドライバ一覧

http://linux-hardware.org/index.php?probe=76e652c78c

解決

ubuntu server のインストールから wpasupplicant 起動後以降の手順どおりにする

https://github.com/linux-surface/linux-surface/wiki/Installation-and-Setup

※この手順で linux-surface にカーネルを書き換ずにapt updateをした場合、wifiのドライバが消えるので要注意

netplan の設定

wlp2s0 が起動時に有効になっていないのでその設定

https://blog.d-shimizu.io/article/1196

https://qiita.com/zen3/items/757f96cbe522a9ad397d

https://blog.kujira-station.com/201910232379

ここに従うとよい。(ipの固定化はまだしてない)

ファイル名は 2 つ目の記事に従い、/etc/netplan/99_config.ymal とかがよい

下記のような感じで設定してうまくいった。

/etc/netplan/99_config.yaml

network:
        wifis:
                wlp2s0:
#                         optional: true
                        dhcp4: true
#                         dhcp6: true
                        access-points:
                                "ACCESS_POINT":
                                        password: "********"
        version: 2
        renderer: networkd

pass phrase は上の方の手順で行った sudo wpa_passphrase <ssid> [passphrase] で生成したものを指定

あとは下記のようにコマンド実行していった

sudo netplan generate # 多分これ不要
sudo netplan apply
sudo systemctl disable networking
sudo systemctl enable systemd-networkd.service
sudo reboot
@hagevvashi
Copy link
Author

Buffalo のルータ使うと LAN 内で ping 通らない自体が発生

MACアクセス制限でping先のPCのMACアドレスを追加する

https://qiita.com/fukayatsu/items/4ad7af5e4a8640e4b713

@hagevvashi
Copy link
Author

/etc/netplan/99_config.yaml の設定最新

network:
  wifis:
    wlp2s0:
#      optional: true
      dhcp4: no
      dhcp6: yes
#      dhcp6: no
      addresses: [192.168.11.11/24]
      gateway4: 192.168.11.1
      access-points:
        "[access-point]":
#          password: "[password]"
          password: "[password-encryped]"
# TODO: we cannnot use WPA3 SAE by netplan
#        "[access-point-wpa3]":
#          password: "[password]"
#          password: "[password-encrypted]"
      nameservers:
        addresses: [192.168.11.1, 8.8.8.8]
  version: 2
  renderer: networkd

@hagevvashi
Copy link
Author

hagevvashi commented Jul 23, 2021

環境をきれいにしておく

$ sudo apt remove virtualbox
$ sudo apt remove virtualbox-6.1
$ sudo apt remove virtualbox-qt
$ sudo add-apt-repository --remove 'deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian eoan contrib'
$ sudo apt update
$ sudo apt autoremove
$ sudo apt upgrade

virsh がないので libvirt-clients をインストール

$ sudo apt install libvirt-clients

libvertd が Unit libvertd.service not loaded. というエラーで起動できないので libvirt-daemon-system をインストール

$ sudo apt install libvirt-daemon-system

libvertd の起動

$ sudo systemctl start libvirtd

再起動

$ sudo shutdown -r now

brctl コマンドが必要になるので bridge-utils をインストール

$ sudo apt install bridge-utils

tunctl コマンドが必要になるので uml-utilities をインストール

$ sudo apt install uml-utilities

parprouted コマンドが必要になるので parprouted をインストール

$ sudo apt install parprouted

bcrelay コマンドが必要になるので bcrelay をインストール

$ sudo apt install bcrelay

↓↓↓ここから下は再起動すると設定が消える↓↓↓

(ホストマシンの)パケットフォワードを有効にする

$ sudo /sbin/sysctl net.ipv4.ip_forward=1

ブリッジデバイス br0を作る

$ sudo /sbin/brctl addbr br0

tunデバイス tap0 を作る

$ sudo tunctl -t tap0

br0とtap0をブリッジする

$ sudo /sbin/brctl addif br0 tap0

br0 に IPアドレスを付与する

ここは DHCP 外の ip がいいみたい

$ sudo /sbin/ip addr add 192.168.11.99 dev br0

br0を起動する。

$ sudo /sbin/ip link set br0 up

なんかよくわからんやつ

/bin/echo 1 > /proc/sys/net/ipv4/conf/wlp2s0/proxy_arp
/bin/echo 1 > /proc/sys/net/ipv4/conf/br0/proxy_arp
/bin/echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp

parproutedで wlp2s0に飛んできたarpをbr0にも転送する

$ sudo /usr/sbin/parprouted wlp2s0 br0

bcrelayで、br0(仮想環境)から飛んできたブロードキャストをwlp2s0に転送する

$ sudo /usr/sbin/bcrelay -d -i br0 -o wlp2s0

↑↑↑ここから上は再起動すると設定が消える↑↑↑

losetup -l で見てみると何やら変なループデバイスが大量に作成されていた

losetup -d で削除を試みてもできないため、マウントしているファイルを全部削除した

$ sudo rm -f /var/lib/snapd/snaps/core18_2074.snap
$ losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                       DIO LOG-SEC
/dev/loop1         0      0         1  1 /var/lib/snapd/snaps/core18_2074.snap (deleted)   0     512
/dev/loop4         0      0         1  1 /var/lib/snapd/snaps/snapd_12057.snap             0     512
/dev/loop2         0      0         1  1 /var/lib/snapd/snaps/lxd_20326.snap               0     512
/dev/loop0         0      0         1  1 /var/lib/snapd/snaps/core18_2066.snap             0     512
/dev/loop5         0      0         1  1 /var/lib/snapd/snaps/lxd_21029.snap               0     512
/dev/loop3         0      0         1  1 /var/lib/snapd/snaps/snapd_12398.snap             0     512

再起動したら全て消えていた

これから下記記事を参考に仮想マシンを作成する

https://qiita.com/zhh/items/df076c4614f0238f9876

ubuntu-20.04.2 のインストールイメージをダウンロードしておく

wget https://releases.ubuntu.com/focal/ubuntu-20.04.2-live-server-amd64.iso

15GBのQCOW2イメージを作る

$ qemu-img create -f qcow2 main.qcow2 150G

作成されたファイルの確認

$ ls -la main.qcow2
-rw-r--r-- 1 hagevvashi hagevvashi 196848 Jul 23 23:51 main.qcow2
$ file main.qcow2
main.qcow2: QEMU QCOW2 Image (v3), 16106127360 bytes

下記を参考に仮想マシンの作成

https://www.server-world.info/query?os=Ubuntu_20.04&p=kvm&f=2

virt-install \
  --name ubuntu1 \
  --ram 4096 \
  --disk path=./main.qcow2,bus=virtio \
  --nographics \
  --vcpus 2 \
  --network bridge=br0 \
  --location https://releases.ubuntu.com/20.04/ubuntu-20.04.2-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
  --extra-args 'console=ttyS0,115200n8 serial'

ミスってしまってお掃除がうまくいっていない状態で上記コマンドを打つと下記エラーがでる

>   --extra-args 'console=ttyS0,115200n8 serial'
WARNING  /home/hagevvashi/.cache/virt-manager/boot may not be accessible by the hypervisor. You will need to grant the 'libvirt-qemu' user search permissions for the fol
lowing directories: ['/home/hagevvashi/.cache']
ERROR    Disk /home/hagevvashi/main.qcow2 is already in use by other guests ['ubuntu1']. (Use --check path_in_use=off or --check all=off to override)

サジェスチョンの通りに--check path_in_use=off を付与して実行すると次のエラーが出現する

Starting install...
ERROR    Guest name 'ubuntu1' is already in use.
Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
  virsh --connect qemu:///system start ubuntu1
otherwise, please restart your installation.

一回きれいにする必要があると判断し、下記コマンドを入力

$ virsh list --all
 Id   Name      State
-------------------------
 1    ubuntu1   running

$ virsh shutdown ubuntu1
Domain ubuntu1 is being shutdown

$ virsh destroy ubuntu1
Domain ubuntu1 destroyed

$ virsh list --all
 Id   Name      State
--------------------------
 -    ubuntu1   shut off

$ virsh undefine ubuntu1
Domain ubuntu1 has been undefined

$ virsh list --all
 Id   Name   State
--------------------

permission のエラーがなんか嫌な感じなので下記の記事参考にしてみる

https://nogiro.hatenablog.com/entry/2017/12/20/030444

$ cd /
$ sudo mkdir virtual
$ sudo groupadd virtadmin
$ sudo chown -R :virtadmin virtual
$ sudo chmod 2770 virtual
$ sudo mkdir virtual/{disk,iso}
$ sudo chown root virtual/{disk,iso}
$ sudo usermod -aG virtadmin hagevvashi
$ sudo usermod -aG virtadmin libvirt-qemu

インストールメディアダウンロード

$ sudo sh -c "cd /virtual/iso; wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.10.0-amd64-netinst.iso"

そして満を持して virt-install

virt-install \
  --name debian1 \
  --ram 2048 \
  --vcpus 1 \
  --disk path=/virtual/disk/main.qcow2,bus=virtio \
  --nographics \
  --console pty,target_type=serial \
  --network bridge=br0 \
  --location /virtual/iso/debian-10.10.0-amd64-netinst.iso \
  --extra-args 'console=tty0 console=ttyS0,115200n8 keymap=ja' \
  --os-type=generic \
  --virt-type=kvm

DHCP使えないので無理矢理IPを設定したらいける

$ virsh start debian1
$ virsh console debian1

root と入力し Password 入力

# ip link set ens2 up
# ip addr add 192.168.11.13/24 dev ens2

これで外から触れるようになった

@hagevvashi
Copy link
Author

$ virsh console debian1

で入ったコンソールから抜ける方法はcontrol + ]

@hagevvashi
Copy link
Author

hagevvashi commented Jan 9, 2023

ブリッジ接続の一覧を表示

$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.0e7f316bce6b       no              tap0
                                                        vnet0

IPv4転送設定確認

$ cat /etc/sysctl.conf | grep ipv4.ip_forward
#net.ipv4.ip_forward=1

コメントアウトしてあるので設定無効っぽいので書き換え

$ cat /etc/sysctl.conf | grep ipv4.ip_forward
net.ipv4.ip_forward=1

iptables ルールを使って、ブリッジされた トラフィックがプロセスされることを阻止する

/etc/sysctl.conf 内で 以下の行を追記

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

確認

$ cat /etc/sysctl.conf|grep net.bridge
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

iptablesコマンド実行

$ sudo iptables -L FORWARD

なんの意味もなさそうなのでsysctlで設定反映

$ sudo sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-arptables: No such file or directory

エラーが出ているのでここを参考に

$ sudo modprobe br_netfilter
$ sudo sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

ホストOS側で内->外が通じなくなるのでネットワーク再起動

sudo systemctl restart systemd-networkd.service

@hagevvashi
Copy link
Author

hagevvashi commented Jan 9, 2023

wlp2s0をプロミスキャスモードに変更

$ sudo ip link set wlp2s0 promisc on
$ ip a show wlp2s0

wlp2s0 に PROMISC というフラグが追加されており、プロミスキャスモードが有効になっていることがわかる

↑は必要ないかも。

tap0をプロミスキャスモードにする必要があった

$ sudo ifconfig tap0 0.0.0.0 promisc up
$ ip a show tap0

@hagevvashi
Copy link
Author

hagevvashi commented Jan 9, 2023

ゲストOSに入りネットワークを起動

$ virsh console debian1

root で入った後

~# ip addr add 192.168.11.13/24 dev ens2

上の方で作ったbr0のip(192.168.11.99)を指定して route する

~# ip route add default via 192.168.11.99
~# ip route
default via 192.168.11.99 dev ens2
192.168.11.0/24 dev ens2 proto kernel scope link src 192.168.11.13

これ全然だめ

@hagevvashi
Copy link
Author

hagevvashi commented Jan 9, 2023

br0 に wlp2s0 と tap0 をぶら下げる方式は、wlp2s0(ワイヤレスNIC)がブリッジできない。

そういうときに 4addr モードを on にするとよいのだが、

$ iw dev wlp2s0 set 4addr on
command failed: Operation not supported (-95)

というエラーになる

ここや

https://community.toradex.com/t/bridge-wifi-to-ethernet-to-add-poe-device-to-network/13142/6

ここ

https://raspberrypi.stackexchange.com/questions/88954/workaround-for-a-wifi-bridge-on-a-raspberry-pi-with-proxy-arp

に原因と解決方法が書かれているが難しい

上でもやってきたが arp 方式でもう一回チャレンジしてみる

@hagevvashi
Copy link
Author

hagevvashi commented Jan 9, 2023

arp チャレンジ

https://web.archive.org/web/20170222115348/blog.bodhizazen.net/linux/bridge-wireless-cards/

$ sudo tunctl -u hagevvashi
Set 'tap0' persistent and owned by uid 1000

root になったあと

~# echo 1 > /proc/sys/net/ipv4/ip_forward
~# echo 1 > /proc/sys/net/ipv4/conf/wlp2s0/proxy_arp
~# echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp

ユーザーに戻ってから

$ sudo ip link set tap0 up
$ sudo route add -host 192.168.11.12 dev tap0

仮想マシンインストールできなかった

ひとまず tap、 arp を自動化するすくりぷと

#!/usr/bin/env bash
set -euo pipefail

kvm_if_up(){
    tunctl -u ${USER} -t tap0

    sysctl net.ipv4.ip_forward=1
    sysctl net.ipv4.conf.wlp2s0.proxy_arp=1

    sysctl net.ipv4.conf.tap0.proxy_arp=1

    ip link set dev tap0 up

    route add -host 192.168.11.12 dev tap0
}

kvm_if_down(){

    sysctl net.ipv4.ip_forward=0
    sysctl net.ipv4.conf.wlp2s0.proxy_arp=0

    sysctl net.ipv4.conf.tap0.proxy_arp=0

    ip link set dev tap0 down

    tunctl -d tap0
}

if [ $EUID -ne 0 ]; then
  echo "This script must be run as root" 1>&2
  exit 1
else

    case "$1" in

        start)
            kvm_if_up
            ;;
        stop)
            kvm_if_down
            ;;
        *)
            echo "Usage: $0 {start|stop}"
            ;;
    esac

fi

exit 0

実行例

$ sudo ./kvm_networking.sh stop
$ sudo USER=hagevvashi ./kvm_networking.sh start

@hagevvashi
Copy link
Author

kvm コマンドで Permission denied に対処する

$ kvm -m 512 -boot c -hda main.qcow2 -net nic -net tap,ifname=tap0,script=no
Unable to init server: Could not connect: Connection refused
Could not access KVM kernel module: Permission denied
qemu-system-x86_64: failed to initialize KVM: Permission denied

kvmグループに属していないことを確認

$ ls -la /dev/kvm
crw-rw----+ 1 root kvm 10, 232 Jan 10 12:18 /dev/kvm
$ grep kvm /etc/group
kvm:x:108:
$ id | tr ',' '\n' | grep kvm

追加

$ export USER=$(whoami);sudo gpasswd -a $USER kvm;unset USER

確認

$ exit
$ id | tr ',' '\n' | grep kvm
108(kvm)

@hagevvashi
Copy link
Author

hagevvashi commented Jan 10, 2023

間違えて /dev/net/tun を削除しちゃったとき

$ sudo mknod --mode 600 /dev/net/tun c 10 200
$ sudo chmod 666 /dev/net/tun
$ sudo modprobe tun

@hagevvashi
Copy link
Author

これを参考に kvm_networking.sh を修正

https://gihyo.jp/admin/serial/01/linux_containers/0014

#!/usr/bin/env bash
set -euo pipefail

kvm_if_up(){
    tunctl -u ${USER} -t tap0 # 1

    sysctl net.ipv4.ip_forward=1
    sysctl net.ipv4.conf.wlp2s0.proxy_arp=1

    sysctl net.ipv4.conf.tap0.proxy_arp=1

    ip link set dev tap0 up # 2

    route add -host 192.168.11.12 dev tap0 # 3

    brctl addbr br0 # 4

    brctl addif br0 tap0 # 5

    ip addr add 192.168.11.99/24 dev br0 # 6

    ip link set dev br0 up # 7

    parprouted wlp2s0 br0 # 8

    bcrelay -d -i br0 -o wlp2s0 # 9

    # dhclient wlp2s0
}

kvm_if_down(){

    sysctl net.ipv4.ip_forward=0
    sysctl net.ipv4.conf.wlp2s0.proxy_arp=0

    sysctl net.ipv4.conf.tap0.proxy_arp=0

    ip link set dev br0 down # 7

    ip link set dev tap0 down # 2

    brctl delif br0 tap0 # 5

    brctl delbr br0 # 4

    tunctl -d tap0 # 1
}

if [ $EUID -ne 0 ]; then
  echo "This script must be run as root" 1>&2
  exit 1
else

    case "$1" in

        start)
            kvm_if_up
            ;;
        stop)
            kvm_if_down
            ;;
        *)
            echo "Usage: $0 {start|stop}"
            ;;
    esac

fi

exit 0

@hagevvashi
Copy link
Author

https://unix.stackexchange.com/a/544061

ここを参考に今はこう

#!/usr/bin/env bash
set -euo pipefail

kvm_if_up(){
    # brctl addbr br0 # 4
    tunctl -u ${USER} -t tap0 # 1
    # brctl addif br0 tap0 # 5
    # ip addr add 192.168.11.99/24 dev br0 # 6
    ip addr add 10.10.10.10/24 dev tap0 # 6`
    # ip link set dev br0 up # 7

    sysctl net.ipv4.ip_forward=1
    # sysctl net.ipv4.conf.wlp2s0.proxy_arp=1
    # sysctl net.ipv4.conf.tap0.proxy_arp=1

    # ip link set dev tap0 up # 2

    # route add -host 192.168.11.12 dev tap0 # 3

    # parprouted wlp2s0 br0 # 8
    parprouted wlp2s0 tap0 # 8`
    # bcrelay -d -i br0 -o wlp2s0 # 9

    # dhclient wlp2s0

    iptables -A INPUT -i tap0 -j ACCEPT
    iptables -A FORWARD -i tap0 -j ACCEPT
    iptables -A FORWARD -o tap0 -j ACCEPT
}

kvm_if_down(){

    sysctl net.ipv4.ip_forward=0
    # sysctl net.ipv4.conf.wlp2s0.proxy_arp=0
    # sysctl net.ipv4.conf.tap0.proxy_arp=0

    # ip link set dev br0 down # 7
    ip link set dev tap0 down # 2

    # brctl delif br0 tap0 # 5

    # brctl delbr br0 # 4

    tunctl -d tap0 # 1

    iptables -F
}

if [ $EUID -ne 0 ]; then
  echo "This script must be run as root" 1>&2
  exit 1
else

    case "$1" in

        start)
            kvm_if_up
            ;;
        stop)
            kvm_if_down
            ;;
        *)
            echo "Usage: $0 {start|stop}"
            ;;
    esac

fi

exit 0

@hagevvashi
Copy link
Author

arp proxyとdhcp relayの概念図はこれが参考になる RasberryPI の例だけど

https://zenn.dev/masebb/articles/cc8b1151be73fc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment