Home > Archives > 2012年08月

2012年08月

Linux の電源周りの情報

/proc/acpi/battery/ とか /proc/acpi/ac_adapter/ とかを見れば分かるのね.液晶閉じてるかどうかとかも /proc/acpi/lid/LID/state で分かると.へ〜.

んで,バッテリーふたつ積んでると /proc/acpi/battery/ に BAT1 と BAT2 のふたつが出てきた.個別に情報がとれるので,バッテリーの数だけバッテリーインジケータを増殖させるとかも出来そう.まあ,バッテリーを複数積んでるPCとかあまりない気もするのだけど.

Ubuntu 12.04 LTS で L2TP/IPsec を証明書で

VPN サーバを Ubuntu 10.04 から 12.04 にクリーンインストールで更新.ついでなので証明書で認証できるように設定追加.前回と同様,VPNの接続先は VPN サーバに作った仮想的な LAN (192.168.222.0/24) で,そこから VPN のぶら下がっている LAN に IPマスカレードで出ていくと.

とりあえず,openswan と xl2tpd をインストール.openswan のインストールで X.509 certification は使わないとしとく.

sudo apt-get install openswan xl2tpd

そしたら ipsec の設定./etc/ipsec.conf を下記の内容に.とりあえず共有鍵で認証する設定のみ.

version 2.0
  
config setup
        nat_traversal=yes
        virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!192.168.222.0/24
        oe=off
        protostack=netkey
  
conn L2TP-PSK
        forceencaps=yes
        authby=secret
        pfs=no
        auto=add
        keyingtries=3
        rekey=no
        ikelifetime=8h
        keylife=1h
        type=transport
        left=%defaultroute
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any

ついで /etc/ipsec.secrets で秘密鍵の設定.下記の行の PRE SHARED KEY HERE に共有鍵である文字列を突っ込んで /etc/ipsec.secrets に追記する.

: PSK "PRE SHARED KEY HERE"

以上で ipsec の設定はひとまず終了.次に xl2tpd の設定.まず /etc/xl2tpd/xl2tpd.conf を下記の内容に.

[global]
[lns default]
ip range = 192.168.222.2-192.168.222.32
local ip = 192.168.222.1
length bit = yes
refuse chap = yes
require authentication = yes
name = l2tpd
pppoptfile = /etc/ppp/options.l2tpd.lns

そして,上の xl2tpd の設定で指定した ppp 部分の設定を /etc/ppp/options.l2tpd.lns に書く.内容は下記の通り.YOUR_DNS_SERVER には vpn サーバのあるLANのDNSサーバを指定.

require-mschap-v2
ms-dns YOUR_DNS_SERVER
auth
lock
hide-password
modem

んで ppp用のユーザパスワードを /etc/ppp/chap-secrets に書き込む.面倒なのでサーバ名とかワイルドカードで.USERNAME と PASSWORD_HERE にユーザ名と対応するパスワードを適当に.

USERNAME * PASSWORD_HERE *

デーモン達の設定は以上で終わって,次にファイアウォールとかの設定を.とりあえず ufw で 500 (IKE)と 4500 (IPsec NAT-T) のUDPを開けておく.

sudo ufw allow 500/udp     
sudo ufw allow 4500/udp   

ついで ufw では設定できない部分を /etc/ufw/before.rules で設定.ESP を通すための設定と,xl2tpd を IPsec 以外から使えないようにする設定と,LAN の NAT をさせる設定とを適切な場所に追加.

## *filter に対応する COMMIT の手前に
# for ESP protocol of IPsec
-A INPUT -p 50 -j ACCEPT
# restricts l2tp to be used under ipsec
-A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT
-A INPUT -p udp -m udp --dport l2tp -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -p udp -m policy --dir out --pol ipsec -m udp --sport l2tp -j ACCEPT
-A OUTPUT -p udp -m udp --sport l2tp -j REJECT --reject-with icmp-port-unreachable
 
## *filter の COMMIT の後に
# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic from 192.168.222.0/24
-A POSTROUTING -s 192.168.222.0/24 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT
# end of nat rules

さらにフォワーディングなどの設定を /etc/ufw/sysctl.conf に下記のように追記.

net/ipv4/ip_forward=1
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0
net/ipv4/conf/default/accept_redirects=0
net/ipv4/conf/default/send_redirects=0
net/ipv4/conf/eth0/accept_redirects=0
net/ipv4/conf/eth0/send_redirects=0
net/ipv4/conf/lo/accept_redirects=0
net/ipv4/conf/lo/send_redirects=0

さらについでに /etc/default/ufw で ufw のフォワーディングのデフォルト値を許可に変えておく.これをしておかないと ufw に全てブロックされて悲しくなる.

DEFAULT_FORWARD_POLICY="ACCEPT"

最後に,SSH を使っているならその許可をしつつ,ufw を有効化して再起動.

sudo ufw allow 22/tcp
sudo ufw enable
sudo reboot

ここまでで共有鍵で L2TP/IPsec が使えるようになった.Windows の VPN のプロパティのセキュリティで L2TP/IPsec を指定したうえで詳細設定で事前共有キー(/etc/ipsec.secrets に書いたやつ)を入れてやって,あとは /etc/ppp/chap-secrets に書いたユーザ名とパスワードでつなぐだけ.

閑話休題.

PCの認証に証明書を使う設定を入れてみる.そのために,まずはオレオレ認証局を作る.

とりあえず openssl が入っていることを確認.

sudo apt-get install openssl

ついで,簡便のために /etc/ssl/openssl.cnf のデフォルト値を変えてあげる.

default_days = 3650
countryName_default = JP
stateOrProvinceName_default = Tokyo
localityName_default = Chuoh-ku              # これだけ書換えでなく追記
0.organizationName_default = IPL

そしたら下記のコマンドでオレオレ認証局作成.とりあえず /var/certs/ とかに全部おいておくことにする.無駄に sudo がついているけど気にしない.CA用のパスワードを聞かれるので適当に.Common Name だけはまともに答える(このマシンの名前とか).他はデフォルト値でいい.最後にもう一度CA用のパスワードを聞かれるので,それを入れてあげると demoCA というディレクトリにオレオレ認証局が出来上がる.

sudo mkdir /var/certs
cd /var/certs
sudo /usr/lib/ssl/misc/CA.pl -newca

んで,鍵のパーミッションを変更しつつ,CRL を生成.CA用パスワードを入れてあげる.

sudo chmod 600 demoCA/private/cakey.pem
sudo openssl ca -gencrl -out crl.pem

以上で認証局が準備出来たので,次にホスト用の証明書を作成する為にホスト毎に以下の作業をば.整理のために各ホスト毎にサブディレクトリ作ってるけど,基本的に Common Name に各ホストの名前(ここでは VPNサーバの vpn と Windows のクライアント win)を入れてあげればいい.CA.pl -newreq-nodes でリクエストを作って,A.pl -sign で署名を入れる.署名の時に CA のパスワードが必要.

cd /var/certs
sudo mkdir vpn; cd vpn; sudo ln -s ../demoCA .
sudo /usr/lib/ssl/misc/CA.pl -newreq-nodes
# Common Name に vpn
sudo /usr/lib/ssl/misc/CA.pl -sign

Windows 用には最後にプライベートキーと証明書をまとめてあげる.

cd /var/certs
sudo mkdir win; cd win; sudo ln -s ../demoCA .
sudo /usr/lib/ssl/misc/CA.pl -newreq-nodes
# Common Name に win
sudo /usr/lib/ssl/misc/CA.pl -sign
openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -out win.p12

以上で証明書の準備完了.あとはこれらをそれぞれに配置する.

Windows には,オレオレ認証局の demoCA/cacert.pem と Windows マシンの証明書である win.p12 とを配置する.これらを適当に windows マシンにコピーした上で mmc.exe を実行して,ファイル → スナップインの追加と削除 → 証明書 → 追加 → コンピュータ アカウント → ローカルコンピュータ → 完了 → OK とやって,左のペインの証明書の個人で右クリック → すべてのタスク → インポート → win.p12 を個人へインポート,同様に証明書の信頼されたルート証明機関で右クリック → すべてのタスク → インポート → cacert.pem を信頼されたルート証明機関へインポート.

VPN サーバでの配置は下記のコマンドで.プライベートキーのフォーマットは PEM だと ipsec が読んでくれないので DER に変換しとく.

sudo cp /var/certs/demoCA/cacert.pem /etc/ipsec.d/cacerts/
sudo cp /var/certs/vpn/newcert.pem /etc/ipsec.d/certs/vpnCert.pem
sudo openssl rsa -in /var/certs/vpn/newkey.pem -out /etc/ipsec.d/private/vpnKey.pem -outform DER
sudo cp /var/certs/crl.pem /etc/ipsec.d/crls/crl.pem

そしたら最後に証明証での認証の設定を ipsec に追加する.まず /etc/ipsec.secrets に鍵の情報を追記.

: RSA vpnKey.pem

ついで /etc/ipsec.conf に証明証での認証の接続設定を追記.

conn L2TP-RSA
        forceencaps=yes
        authby=rsasig
        pfs=no
        auto=add
        keyingtries=3
        rekey=no
        ikelifetime=8h
        keylife=1h
        type=transport
        left=%defaultroute
        leftprotoport=17/1701
        leftcert=vpnCert.pem
        right=%any
        rightprotoport=17/%any
        leftrsasigkey=%cert
        rightrsasigkey=%cert

あとは sudo reboot してあげれば準備完了.Windows の VPN のプロパティのセキュリティで L2TP/IPsec を指定して詳細設定で認証に証明書を使うにしてやって(デフォルトだけど), /etc/ppp/chap-secrets に書いたユーザ名とパスワードでつなぐだけ.

とりあえず以上で手元の環境でうまく行った.NAT越えをするときには windows のレジストリの設定に注意?

MACアドレスが重複してた……

KVM で VM を2つにするとパケットロスが起きるという現象に悩まされていたのだけど,原因は2台の VM が同じ MACアドレスを使っていることだった.そりゃまぁ,パケットなくなるわな.つか,不安定ながらもそれで動いていた事に驚いた.

ちなみに,MAC アドレスを同じにして2台に同時に ping を飛ばしてやると,飛ばしている ping が交互にロストする.この現象を観測したので MACアドレスの重複に気づいた.ぶっちゃけ,MACアドレスとか指定しておかなければテキトウに重複しないようにランダムで発行してくれるだろうとか思ってたのが間違い.ちゃんと -net のオプションに nic,macaddr=XX:XX:XX:XX:XX:XX を書いてあげないとだめよと.そうしないとよく分からんデフォルト値が常に使われてしまうのでMACが重複する.

とりあえず,MAC アドレスを指定するようにしてから快調に動いているのでめでたしめでたし.

閑話休題.

libvirt とか virsh とか vmbuilder とか使いこなせない…… 

一定時間使われなかったら勝手にシャットダウン

とかいう動作を crontab にワンライナーで:

if ps aux | awk '{print$1}' | sort | uniq | grep -v '68\|USER\|avahi\|dbus\|gdm\|root\|rpc\|rpcuser\|smmsp\|xfs' > /dev/null; then touch working; fi; idlesec=`expr \`date +%s\` - \`stat -c %Y working\``; if test $idlesec -gt 3600; then /sbin/shutdown -h now; fi

オチ:起動時に /root/working というファイルの時刻を更新しておかないと起動後にすぐにシャットダウン./etc/rc.local に touch /root/working を書いて対処.

これと WOL での起動を合わせて節電のための計算サーバのオンデマンド運用.

Home > Archives > 2012年08月

Search
Feeds

Page Top