Dockerコンテナに手動でvethインターフェスを追加する

vethペア作成

VETH0=veth-a1
VETH1=veth-b1
ip link add $VETH0 type veth peer name $VETH1
vethの片方をホストのbridgeに接続
sudo brctl addif br0 $VETH0
sudo ip link set $VETH0 up

Dockerコンテナを起動

コンテナを--network noneで起動する。NAMEの右辺(コンテナ名)は適宜変更可。
NAME=container
docker run --network none --rm -it --name $NAME debian 

ipコマンドのため、コンテナのnetnsを/var/run/netns以下にリンク

(CONTAINER_PID=`docker inspect $NAME --format '{{.State.Pid}}'` && sudo ln -s /proc/$CONTAINER_PID/ns/net /var/run/netns/$NAME)

コンテナにvethを設置し、IPアドレスを設定

CONTAINER_IP=192.168.19.11
CONTAINER_IP_PREFIX=24
sudo ip link set $VETH1 netns $NAME up
sudo ip netns exec $NAME ip addr add $CONTAINER_IP/$CONTAINER_IP_PREFIX dev $VETH1
/proc/sys/net/bridge/bridge-nf-call-iptablesが1で、かつ、iptablesのFORWARDチェーンのポリシーがDROPなら、次の設定も必要
iptables -A FORWARD -s $CONTAINER_IP -j ACCEPT
iptables -A FORWARD -d $CONTAINER_IP -j ACCEPT
あるいは、
iptables -A FORWARD -m physdev --physdev-in $VETH0 -j ACCEPT
iptables -A FORWARD -m physdev --physdev-out $VETH0 -j ACCEPT

noVNCの使い方例

準備

Ubuntuでは以下のパッケージをインストール
  • novnc
  • websockify

実行

以下では、localhostの5900ポートをリスンしているVNCを8001番ポートでHTTPとしてサーブ
websockify --web=/usr/share/novnc/ 8001 localhost:5900

リモートホストの音声をロカールで聞く

ローカル側

以下の設定を行なって、pulseaudioを起動
load-module module-native-protocol-tcp
もしくは、下記のcookieによる認証設定を行わないなら以下。
load-module module-native-protocol-tcp auth-anonymous=true 
一時的な設定なら以下
pactl load-module module-native-protocol-tcp
macOSでbrewでinstallしている場合は下記。
/usr/local/opt/pulseaudio/bin/pulseaudio --exit-idle-time=-1 --verbose
ポートフォワーディングしておく
ssh remote_ip -R 4713:localhost:4713
cookieファイルをremoteマシンにコピーする
rsync -Pavz .config/pulse/cookie remote_ip:

リモート側

環境変数PLUSE_SERVERを設定して、アプリケーションを実行(以下の例ではfirefox)
PLUSE_SERVER=localhost:4713 firefox

参考

  • https://blog.monophile.net/posts/20131017_pulseaudio_over_ip.html
  • https://mattintosh.hatenablog.com/entry/20160102/1451664667

LXDでコンテナのUID, GIDをホストと同じにする例

以下の例では、コンテナのUID,GID 1001をホストの2001にマッピングする。
lxc config set CONTAINER_NAME raw.idmap 'both 2001 1001'

LXDで特権コンテナを追加する例

コンテナ作成時に追加

lxc launch -c security.privileged=true ubuntu:20.04 CONTAINER_NAME

コンテナ作成後に追加

 lxc config set CONTAINER_NAME security.privileged true

コマンドラインベースでMarkdownファイルをHTMLに変換して、Webサーバで公開する

HTTPサーバの起動

python3 -m http.server 8000

markdown-itのインストール

npm  npm install markdown-it --save

MarkdownからHTMLへ変換例

npx markdown-it README.md -o REAMDE.html

付録:ローカルマシンへのポート転送

NATなどによりhttp.serverを起動したマシンの8000ポートに直接アクセスできない時、以下のポートフォワードを使う
ssh -L 8000:localhost:8000 remote
これにより、http://localhost:8000でHTMLを表示できる

SSHのコマンドラインでKeyExchangeアルゴリズムを追加する方法

古いサーバへのSSHで以下のように表示されることがある。
Unable to negotiate with 192.168.1.10 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
以下のようにすればよい
$ ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 192.168.1.10