💾 Archived View for pixeldreams.tokyo › technomancy › netns-vpn.gmi captured on 2024-07-08 at 23:40:29. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2024-03-21)

-=-=-=-=-=-=-

netnsでvpnインターフェースを管理する方法

㋿ 6-3-13 水 晴れ

netnsとはリナックスカーネルのネットワーク・ネームスペースという機能のことです。ネットワーク・ネームスペースを作ることで、新たなルーティング・テーブル、インターフェースなど通常のものと分けて管理できます。要はネットワークだけにおけるコンテナーのようなものです。

netnsを利用してvpnインターフェースを管理すると、一部のアプリのみネームスペース内で実行して、vpnインターフェースしか見えないようにすることができます。こうすることで通信が漏れる恐れががなくなるのです。

具体的な例

wireguardインターフェースを作成します。wireguardインターフェースは、作成時のネームスペースを記憶する機能があるので、一度デフォルトネームスペースで作成します。それから、別のネームスペースに移動することで、トンネル管理の通信は通常のインターフェースを通るが、wgインターフェース自体は新たなネームスペースに移動されます。

# ip netns add vpn
# ip link add wg0 type wireguard
# ip link set wg0 netns vpn

これから、wg0を操作するときはネームスペースを指定します。

# ip -n vpn link show wg0

続いてwg0の設定を行います。

# ip -n vpn addr add $VPN_CLIENT_IP dev wg0
# ip netns exec vpn wg setconf wg0 /etc/wireguard/wg0.conf
# ip -n link set wg0 up
# ip -n vpn route add default dev wg0

wg0を使うときは、ip netns exec $namespace...コマンドが使えます。例えば、シェルを実行することなど:

# ip netns exec vpn bash
# ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: mullvad0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet xx.xx.xx.xx/32 scope global mullvad0
       valid_lft forever preferred_lft forever
# ip route show
default dev mullvad0 scope link 
# 

このシェルから実行されたアプリケーションはすべて、この方法で作成したmullvad0というwireguardインターフェースを通ることになっています。

自動設定スクリプト

真ん中あたりのMULLVAD_CONF、MULLVAD_CLIENT_IP変数を正しく設定してね

#!/bin/sh

if [ $UID -ne 0 ]; then
  echo 'run as root'
  exit 1
fi

if ! which ip 2>&1 >/dev/null ; then
  echo 'ip command not found. make sure $PATH is correct'
  exit 1
fi

usage() {
  echo "$0 <up|down>"
}

MULLVAD_CONF='/etc/wireguard/mullvad1.conf'
MULLVAD_CLIENT_IP=$(grep '# Address' $MULLVAD_CONF | awk '{print $4}')
IFACE='mullvad0'
NS='vpn'

set -x
case $1 in
  up)
    ip netns add $NS
    ip link add $IFACE type wireguard
    ip link set $IFACE netns $NS
    ip -n $NS addr add $MULLVAD_CLIENT_IP dev $IFACE
    ip netns exec $NS wg setconf $IFACE $MULLVAD_CONF
    ip -n $NS link set $IFACE up
    ip -n $NS route add default dev $IFACE
    ;;
  down)
    ip -n $NS link del $IFACE
    ip netns del $NS
    ;;
  *)
    usage
    ;;
esac

参考

https://www.wireguard.com/netns/