ラベル iptables の投稿を表示しています。 すべての投稿を表示
ラベル iptables の投稿を表示しています。 すべての投稿を表示

2015/09/30

lxcコンテナへのNAT設定もsystemdで

昨夜久しぶりにホストをリブートした。そしたらlxcコンテナへのNAT設定が消滅した。永続化してなかったので、当然です。そうかと軽く考えて

iptable設定永続化パッケージインストール
$ sudo apt-get install iptables-persistent

で、コンテナへのNAT設定を保存し、ホスト再起動してみたら、あらあら、
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24
lxcbr0の設定がダブってしまうじゃありませんか。なるほど。lxcのネットワーク設定とiptables-persistentの設定の両方が効いてしまうからでしょうか。

Enable LXC neworking in Debian Jessie, Fedora 21 and others
には、/usr/lib/x86_64-linux-gnu/lxc/lxc-net ファイルに追加設定する方法があったり

Tips for LXC: Creation, Autostart, OpenVPN and Port Forwarding to Containersには、iptables-persistentでいいが、起動に問題があるのでちょっとゴニョゴニョするとか

それぞれのアプローチ方法は参考にはなるが、ちょっと好きになれない感じ。
自分なりの解決方法としては、iptables-persistentをやめて、前記事と同じsystemdを使って設定することにした。

ただ、今回はホストでの設定だし、ユーザモードで実行するものでもないので、普通のsystemdサービスユニット。それと追加変更がし易い形にはしようと思う。

サービスユニットファイル
~/.config/systemd/system/lxc-nat.service として作成。どこでもいいと思うが、ユーザモードの場合 ~/.config/systemd/user以下に置く流れに沿ってみた。内容は以下のとおり
[Unit]
Description=LXC NAT network setup
After=lxc-net.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/home/ubuntu/bin/lxc-nat start
ExecStop=/home/ubuntu/bin/lxc-nat stop

[Install]
WantedBy=multi-user.target
登録 (/etc/systemd/systemへシンボリックリンク作成)
$ sudo systemctl enable ~/.config/systemd/system/lxc-nat.service

自分でインストール先へ直接ln -sしてもいいかもしれないけど、systemctlにやってもらいます。

確認
$ sudo systemctl list-unit-files | grep lxc
lxc-nat.service                        enabled
lxc-net.service                        enabled
lxc.service                            enabled
lxcfs.service                          enabled

/home/ubuntu/bin/lxc-nat の中身の例
#!/bin/sh -

nat()
{
    iptables -t nat $1 PREROUTING -p tcp -d 192.168.1.10/32 --dport 80 -j DNAT --to 10.0.3.10:80
    iptables -t nat $1 PREROUTING -p tcp --dport 8000 -j DNAT --to 10.0.3.11:80
}

case "$1" in
    start)
        nat -A
    ;;
    stop)
        nat -D
    ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 2
esac
exit $?
nat()関数で-A/-D切り替えできるように(start/stop両方に書かないで済むように)。
後は、nat()内のiptables記述を増やすなり編集するなりするだけ。

例の場合の、10.0.3.10 のコンテナも自動起動するようにコンテナ設定ファイルに
lxc.start.auto = 1
としておくと尚良し。

2015/08/15

lxcのlxdeをvncする

前回はlxcで仮想ubuntuを立ち上げてみるところまでやってみた。IPアドレスもdnsmasqで名前解決できるようになった。
そこで思い立ったのが、ホストの環境を汚さずに、デスクトップ環境のためのコンテナを作って、そこへ外部からVNC接続してみようかなと。飽きたらポイっとまるごと捨てればいいし。

lxcクローン
$ lxc-clone master ubu01

なにか構築したいなって時にすぐ始められるように、予め必要最低限のことを終わらせてあるubuntuコンテナをmasterとして作っておいて、lxc-cloneする。

起動
$ lxc-start -n ubu01 -d

sshログイン
$ ssh ubuntu@ubu01

lxdeインストール
$ sudo apt-get install lxde

ubuntu-desktopじゃなくてlxde。メモリもディスクも少ないShuttleではlxdeの方が小さくてよい。
それでも500MB位は消費してしまうが。

vncserver インストール
$ sudo apt-get install vnc4server

他にも色々VNCサーバーはあるようだけれど、扱いが簡単なvnc4server。

~/.vnc/xstartup作成 (っていうか、デフォルトをリンクしておくだけ)
$ mkdir ~/.vnc
$ ln -s /etc/X11/Xsession ~/.vnc/xstartup

vncserver起動(vncserverでもvnc4serverでもいっしょ)
$ vncserver :0

最初の起動時には、xauthのパスワード設定を要求してきます。適当に設定。
vncが 5900 で待ち受け状態になりました。


ホストの5900ポートを ubu01:5900 へルーティングする
(ホスト側で)
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 5900 -j DNAT --to ubu01:5900

ホストとコンテナ間でのプライベートネットワークへ外部からアクセスできるようにするのに
一番お手軽な方法。

そしたら、外からホストの5900へVNC接続するとubu01:5900へルーティングされて、
めでたくlxdeのデスクトップへ到達します。

日本語化!

忘れてました。いつも端末ばっかりだったので、GUIには日本語化ってのがありました。
そもそも lxc で作った ubuntuコンテナってロケールがen_US.UTF-8だし・・・そこからか。

日本語フォント インストール(IPA入れとけばいいっしょ)
$ sudo apt-get install fonts-ipafont

とりあえずフォントさえ入れれば、lxdeで日本語が表示されます。

日本語パッケージインストール
$ sudo apt-get install language-pack-ja

ロケール設定
$ sudo update-locale LANG=ja_JP.UTF-8

/etc/default/localeに書き込まれる。が、今のシェルの環境変数はen_US.UTF-8のままです。

インプットメソッド
$ sudo apt-get install ibus-anthy

mozcの方が評判いいらしいが、自分にはぴんとこなかった。
ibusじゃなくてfcitxか?とも思って入れてみたけど、??な感じ。ibus-anthyで十分っす。

タイムゾーン変更(日本語化というより日本時間でってだけだけど)
$ sudo dpkg-reconfigure tzdata

CUIメニュー操作でAsiaからTokyo選ぶ

ここまでやったら、一度コンテナを再起動したほうが良い。環境変数とか変わるんで。
(ホストでリブート)
$ lxc-stop -n ubu01 -r

そしたら改めてコンテナ上で vncserver を起動して、そとからVNC接続すると lxdeデスクトップ自体も日本語表示になって、IMもibusで動いている状態に。


後処理
$ sudo iptables -t nat -D PREROUTING 1

遊び終わったら、DNAT設定を消しておこう。
コンテナも終わらせるか、vncserverを $ vncserver -kill :0 しておこう。
油断していると外から潜り込まれちゃうのでね。