Debian GNU/Linux での pptpd 設定 (nat しない場合)

※ VPS 等で pptpd を設定し、nat する場合は、「Debian GNU/Linux での pptpd 設定 (nat する場合)」を参照下さい。

以前、VPS において、pptpd の設定を行ったが、これはグローバル IPv4 の割り当てが 1 個のみで、VPN クライアントはこの IPv4 を共有して出ていくように、VPN 用のプライベートネットワークから nat する構成だった。

今回は、PPTP クライアントの IPv4 アドレスが、その LAN のネットワーク内と同一ネットワーク内に存在するような設定を行ってみた。

例えば、自宅のルータで、GRE と TCP 1723 を LAN 内のサーバに通信できるようにしておいて、外部から自宅へ VPN 接続をする用途を想定している。

■前提

  • ネットワーク内において、いくつかのプライベート IP アドレスが自由に使用できる環境である。
  • 今回は 192.168.1.0/24 な一般的な家庭内 LAN を想定。
  • VPN 側に割り当てられる IPv4 アドレスは、他の機器で使用されていない、されない事。
  • OS は Debian GNU/Linux 6.0 squeeze を利用した。
  • PPTP サーバ名は localpptpd とする。

■想定するネットワーク

  • ネットワークアドレス : 192.168.1.0/24
  • デフォルトゲートウェイ : 192.168.1.1
  • DNS サーバ : 192.168.1.1
  • pptpd を設定するサーバ : 192.168.1.2 (インタフェースは eth0)
  • VPN クライアントに割り当てる IPv4 アドレス : 192.168.1.201 ~ 192.168.1.210 (サーバ側では ppp0 ~ ppp9 のインタフェースと通信する)

■設定

サーバ側設定手順としては、以下の通り。

・pptpd をインストール
# apt-get install pptpd

・/etc/pptpd.conf を修正

option /etc/ppp/pptpd-options
logwtmp
localip 192.168.1.2
remoteip 192.168.1.201-210

※ localip はサーバ自身の eth0 の IPv4 アドレスを指定する。
※ remoteip には、VPN クライアントに割り当てる IPv4 アドレスを指定する。

・/etc/ppp/pptpd-options を修正

name localpptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 192.168.1.1 # DNS サーバを指定
proxyarp
nodefaultroute
lock
nobsdcomp
mtu 1280
mru 1280

※ mtu と mru の指定をしておかないと、接続できないサイトなどが出る可能性がある。

・/etc/ppp/chap-secrets に PPTP 接続するアカウントを設定

ユーザ名 localpptpd パスワード *

※上記のような書式で指定する。

・pptpd を再起動
# /etc/init.d/pptpd restart

・iptables のルールに以下を追加。

# iptables -P FORWARD DROP
# iptables -A INPUT -i eth0 -p 47 -d 192.168.1.2 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 1723 -d 192.168.1.2 -j ACCEPT
# iptables -A INPUT -i ppp+ -j ACCEPT
# iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
# iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
# iptables -A FORWARD -i ppp+ -o ppp+ -j ACCEPT

※必要に応じて、上記の設定が恒常的に有効となるように何らかの方法で設定する。

・/etc/sysctl.conf を修正

net.ipv4.ip_forward = 1

を追加。

・/etc/sysctl.conf の設定内容を有効とする
# sysctl -p

・必要に応じて、pptpd への接続制限
/etc/hosts.allow, /etc/hosts.deny にて pptpd への接続制限を設定。

■結果

以下の通り、一応正常に通信できたことを確認。

  • 自宅ルータ側で、GRE プロトコルと、TCP 1723 を今回設定した自宅サーバにスルーする様に設定。
  • iPhone でクライアント側設定し、3G 経由で自宅ルータの IPv4 アドレス宛 (自宅サーバ) サーバ側に、PPTP 接続が行えることを確認。
  • その上で、自宅 LAN 内の機器にアクセス可能であることを確認。
  • さらに、自宅ルータに当たっている IPv4 アドレスから、インターネットへ出て行っていることを確認。
  • VPN 接続されている機器同士での ping 疎通が出来ていることを確認。

AirMac Extreme や AirStation からのログを rsyslog で受け取る

LAN 内サーバ (Debian GNU/Linux 6.0 を実行) に、AirMac Extreme からのログを /var/log/airport.log 、AirStation からのログを /var/log/airstation.log に取得するように設定した際の覚え書き。

・各機器で、LAN 内のサーバにログが飛ぶように設定する。
AirMac Extreme では、syslog レベルは 5 とした。
AirStation ではこのあたりを指定は出来ない。

以下、LAN 内サーバでの設定となる。

・外部からの UDP 514 Port の着信を許可
iptables 等で、各機器からの UDP 514 Port 宛の通信を許可する。

・ログファイルを用意する
# touch /var/log/airport.log
# touch /var/log/airstation.log
# chmod 640 /var/log/airport.log /var/log/airstation.log

・/etc/rsyslogd.conf に以下の設定を追加する

$ModLoad imudp
$UDPServerRun 514
local0.notice -/var/log/airport.log
local1.* -/var/log/airstation.log

※ AirMac Extreme では local0 で、AirStation では Local1 のファシリティで出力されるようだ。
※ログファイルの先頭に「-」記号をつけているのは、ディスクへの書き込みをバッファリングさせる指定。(ディスクアクセスを減らすため)

・/etc/rsyslogd.conf の下記の既存の設定を変更する

*.*;auth,authpriv.none -/var/log/syslog

*.*;auth,authpriv.none;local0.none;local1.none -/var/log/syslog

に変更。

次に、

#*.=info;*.=notice;*.=warn;\
    auth,authpriv.none;\
    cron,daemon.none;\
    mail,news.none -/var/log/messages

*.=info;*.=notice;*.=warn;\
    auth,authpriv.none;\
    cron,daemon.none;\
    mail,news.none;\
    local0.none;\
    local1.none -/var/log/messages

に変更。

※各機器のログが /var/log/syslog や /var/log/messages に出力されないようにしている。

・rsyslogd を再起動する
/etc/init.d/rsyslog restart

これでそれぞれのファイルに、各機器のログが取得できているはず。

・参考資料
Syslogサーバにおけるファシリティ値を教えてください。【AirStation】 | BUFFALO バッファロー

Linux: PowerBook G4 の CPU 温度などをグラフ化

MRTG で CPU 温度などを取得するには、lm-sensors を使用するようだが、うちの PowerBook G4 で動作している Debian GNU/Linux の lm-sensors では目的のデータが取得できなかった。

色々調べてみたところ、「#2355 (Adding PowerBook G4 support) – lm-sensors」を参考に以下を参照すれば目的のデータが取れそうだったので設定してみた。

CPU TOPSIDE
/sys/devices/temperatures/sensor1_temperature

GPU ON DIE
/sys/devices/temperatures/sensor2_temperature

上記を MRTG に渡す以下のようなスクリプトを作成する。(/opt/scripts/mrtg-temperature.sh)

#!/bin/bash
LANG=C
CPU=`cat /sys/devices/temperatures/sensor1_temperature`
GPU=`cat /sys/devices/temperatures/sensor2_temperature`
echo $CPU
echo $GPU
exit 0

/etc/mrtg.cfg に下記を追加

# Temperature
Target[temperature]: `/opt/scripts/mrtg-temperature.sh`
MaxBytes[temperature]: 150
Options[temperature]: gauge, nopercent, noinfo
YLegend[temperature]: Temperature
LegendI[temperature]: CPU TOPSIDE
LegendO[temperature]: GPU on DIE
ShortLegend[temperature]: deg C
Title[temperature]: Temperature
PageTop[temperature]:<h1>Temperature</h1>

以下のような形でグラフが取れた。

参考にさせていただいたページ

Linux: Apache2 のプロセス数を MRTG で表示する

最近、VPS で動作中の Apache2 へのアクセスが増加した際に頻繁にメモリ不足が生じるため、参考情報として MRTG で apache2 + php-cgi のプロセス数をグラフに取るように設定してみた。その際のメモ。

/etc/snmp/snmpd.conf に以下を記述する

proc apache2
proc php-cgi

上記のように snmpd.conf で 2 つの proc を設定した場合、以下の MIB で情報を取得可能。
.1.3.6.1.4.1.2021.2.1.5.1→ Apache2 のプロセス数
.1.3.6.1.4.1.2021.2.1.5.2→ php-cgi のプロセス数

これは snmpd.conf で設定した順番に、
.1.3.6.1.4.1.2021.2.1.5.1
.1.3.6.1.4.1.2021.2.1.5.2
.1.3.6.1.4.1.2021.2.1.5.3
と続くらしい。

あとは、mrtg.cfg で読み出すように設定すればよい。私の場合は以下のようにしてみた。

Target[apache2]: .1.3.6.1.4.1.2021.2.1.5.1&.1.3.6.1.4.1.2021.2.1.5.2:コミュニティ名@ホスト名:
MaxBytes[apache2]: 150
Options[apache2]: gauge, nopercent, integer, noinfo
YLegend[apache2]: Processes
ShortLegend[apache2]: Processes
LegendI[apache2]: Apache2
LegendO[apache2]: PHP-CGI
Legend1[apache2]: Apache2 Processes
Legend2[apache2]: PHP-CGI Processes
Title[apache2]: Web Server Processes
PageTop[apache2]: <H1>Web Server Processes</H1>

上記のように設定した結果、以下のようにグラフ表示がされた。

 

Linux: mod_limitipconn.c のメモ

諸事情あって、Debian GNU/Linux 6.0 squeeze の Apache 2.2 に mod_limitipconn.c をインストールしたメモ。

# apt-get install apache2-prefork-dev

Makefile 中を以下のように修正

APXS=/usr/bin/apxs2
APACHECTL=/usr/sbin/apachectl

# make install

以上で完了する。

設定方法としては、例えばバーチャルホスト内で、以下のように Location を使用して指定する。

<Location />
<IfModule mod_limitipconn.c>
MaxConnPerIP 4
</IfModule>
</Location>

Net: Debian GNU/Linux 6.0 で USAGI Project の dtcpc を利用するメモ

基本的には「Net: Feel6 で静的な IPv6 アドレスを得る」の内容と同じだが、dtcpc について、一部ファイルを修正しないと make 出来なかったのでそのメモ。

ビルドに必要なパッケージをインストール
# apt-get install build-essential

ファイルをダウンロード
# cd /usr/local/src/
# wget ftp://ftp.linux-ipv6.org/pub/usagi/snap/kit/usagi-linux26-s20060918.tar.bz2

展開
# tar jxf usagi-linux26-s20060918.tar.bz2

ディレクトリを移動して make
# cd usagi
# make prepare TARGET=linux26
# cd usagi/libnetlink/
# ./configure
# make
# cd ../dtcp/
# wget http://www.tugumi.net/tips/feel6linux/dtcpc.c.password.diff
# patch -p0 < dtcpc.c.password.diff

util.c ファイルの「#include <stdio.h>」を「#include "stdio.h"」に変更。

インクルードファイルをコピー
# cp -a /usr/include/stdio.h ./

stdio.h の下記部分をコメント化する

extern _IO_ssize_t getline (char **__restrict __lineptr,
                            size_t *__restrict __n,
                            FILE *__restrict __stream) __wur;

# ./configure --prefix=/usr/local
# make
# make install

参考サイト
feel6で自宅LANをIPv6化してみる - kai881と愉快な仲間たち
Fedora11に日本語TeX環境をインストール | DJ_SATORUの研究日誌

Net: SaaSes の VPS 上の Debian GNU/Linux を 6.0 へ

以下、仮想サーバを起動できなくなる可能性があるので、この情報ついての取り扱いは自己責任でお願いします。
この通りやったから、サーバが起動しなくなったとか言われても、私は知りません。

SaaSesOsukini サーバ (VPS) のほうも、Debian GNU/Linux を lenny から squeeze にアップグレードしてみました。

こちらのサーバは Xen による準仮想化サーバなので、さくらの VPS とは若干事情が異なります。

まずはサポートに、自分の仮想サーバを実行している Domain-0 サーバについて、Domain-U のカーネルの読み込みが PyGrub であるか、また、Linux カーネル 2.6.32-5 の Xen 用カーネルが動作するか、を確認してみました。

当然ながらサポート外のバージョンを動かすことになるので、自己責任にはなるのですが、私が借りているサーバに置いては、PyGrub 起動、Linux カーネル 2.6.32-5 については動く可能性がある、とのことでしたので、思い切ってアップグレードを行いました。(注意: 同じブランドのサービスでもほかのサーバが同等の構成になっているかどうかは不明です)

ちなみに Xen の仮想化では、カーネルが仮想サーバ側からは触れない位置に置かれることもあり、そのような設計の場合は、ユーザによるカーネルの入れ替えは出来ません。カーネルの読み込みに、PyGrub を採用していると、仮想サーバ内のカーネルを読んで起動してくれるので、これが可能になります。

手順としては、基本的には「Debian 5.0 (lenny) からのアップグレード」にしたがって、進めていく形になります。

  1. まずはファイルをバックアップ。
  2. hold されているパッケージがないか確認。
  3. /etc/apt/sources.list を書き換え。
  4. 既存パッケージを削除されないようにして、パッケージをアップグレードする。
    # apt-get update; apt-get upgrade
  5. カーネルをインストールする。
    # apt-get install linux-image-2.6.32-5-xen-amd64
    ※必ず Xen 用のカーネルをインストールする。(この例では 64bit なので -xen-amd64 となる)
  6. udev をインストールする。
    # apt-get install udev
  7. /boot/grub/menu.lst を以下のように修正する。

    default 0
    timeout 5

    title Debian/Ubuntu
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.32-5-xen-amd64 root=/dev/xvda1 ro
    initrd /boot/initrd.img-2.6.32-5-xen-amd64

    ※kernel や initrd は実際にインストールされたパス・ファイル名を指定する。
  8. 意を決して再起動する。(※この再起動でサーバにアクセスできない場合は失敗。諦めてコントロールパネルから、OS を再インストール。)
  9. パッケージをアップグレードする。
    # apt-get dist-upgrade
  10. やっぱり意を決して再起動する。
  11. 設定などを確認する。必要であれば、一時的に削除していたパッケージをインストールして設定する。
  12. 完了

SaaSes の Osukini サーバはリモートコンソールがないので、一発勝負的なところがありますね。

※実際一発勝負的にやってしまい、ミドルウェアの調整で四苦八苦してしまい、環境を戻してくるまで、のべ 16 時間程度かかっています。疲れました。(例えば、MySQL サーバのバージョンが変わって、起動できなくなったり、色々面倒な設定変更が多数ありました。当たり前ではありますが、バックアップは必ず取って作業する必要があります。)

Linux: Squeeze での snmpd.conf

Debian GNU/Linux 6.0 squeeze で、snmpd.conf が今までと大幅に変更されていた。

どうやら、SNMP v3 に関する設定項目が増えていたようだ。MRTG を設定するのが目的だったので、結局、調べたことの大部分は無意味だったのだけど、メモとして残しておこう。

SNMP v2c に関する /etc/snmp/snmpd.conf での設定

rocommunity public localhost

これだけ。これで、ローカルの MRTG から値を読むことが出来る。(当然コミュニティ名 "public" が分かれば、ローカルユーザは誰でも値を読み取ることが出来てしまう。)

SNMP v3 に関する /etc/snmp/snmpd.conf での設定

rouser [SNMPv3 ユーザ名] priv
※ noauth (ユーザ名合致のみ) 、auth (要認証) 、priv (要認証・要暗号化)

createUser [SNMPv3 ユーザ名] SHA [パスワード] AES [暗号化パスフレーズ]
※ SHA の部分は MD5 も指定可能。
※ AES の部分は DES も指定可能。
※暗号化パスフレーズを省略すると、パスワードと同じになる。

例えば、読み出し専用ユーザ mrtg を、パスワード "examplepassword" 、要認証・要暗号化で作成する場合は以下のように指定する。
rouser mrtg priv
createUser mrtg SHA "examplepassword" AES

上記の指定を行い、snmpd を再起動。

以下のコマンドを叩いて、値が取得できるかチェック。

snmpwalk -v 3 SHA -x AES -l authPriv -u mrtg -A examplepassword -X examplepassword 127.0.0.1

※ snmpwalk -v 3 -a SHA -x AES -l authPriv -u [SNMPv3 のユーザ名] -A [SNMPv3 のユーザ名に対するパスワード] -X [SNMPv3 の暗号化パスフレーズ] 127.0.0.1
※ SNMP v3 では、コミュニティ名ではなく、ユーザ名で認証するらしい。

・・・

あと、気になる点としては、「"Unknown payload OID: fileName"」がログに出るのだが、これはバグっぽい?

Debian GNU/Linux での pptpd 設定 (nat する場合)

※自宅サーバ等で pptpd を設定し、nat する必要が無い場合は、「Debian GNU/Linux での pptpd 設定 (nat しない場合)」を参照下さい。

・・・

pptpd の設定で混乱して悔しいので、再度設定してみたメモ。

とは言っても、ほとんど「さくらのVPSでiPhone用の野良WiFi通信傍受対策のPPTPサーバ(VPN)を設定したメモ - nori_no のメモ」を参考にさせて頂いた。

今回の設定は NAT する場合。(VPN 側ネットワークからの通信は、サーバのグローバル IPv4 アドレスである、aaa.bbb.ccc.ddd を経由してインターネットに出ていく)

※以前、混乱した原因は、NAT する場合とそうでない場合がごっちゃになったからだと思う。

■前提

  • WAN 側インタフェースは eth0 でグローバル IPv4 アドレスは aaa.bbb.ccc.ddd
  • VPN 側インタフェースは ppp0 ~ 9 で IPv4 アドレスは 192.168.64.1
  • VPN クライアント側に当てる IPv4 アドレスは 192.168.64.11 ~ 192.168.64.20
  • OS は Debian GNU/Linux 6.0 squeeze
  • PPTP サーバ名は pptpd
  • DNS サーバは PPTP サーバ上で動作しており、VPN 側ネットワークからの問い合わせに応答する様に設定しているものとする

■設定

サーバ側設定手順としては、以下の通り。

・pptpd をインストール
# apt-get install pptpd

・/etc/pptpd.conf を修正

option /etc/ppp/pptpd-options
logwtmp
localip 192.168.64.1
remoteip 192.168.64.11-20

※ localip はサーバ自身の IPv4 アドレスではなく、VPN 側の PPTP サーバのもの。(任意のプライベート IPv4 アドレス)
※前回は、ここを取り違えていた・・・。

・/etc/ppp/pptpd-options を修正

name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 192.168.64.1
nodefaultroute
lock
nobsdcomp
mtu 1280 # 2012/01/14 修正
mru 1280 # 2012/01/14 追記

※ proxyarp は必要ない。(これはおそらく、クライアント側にあてるネットワークと PPTP サーバ外側のネットワークを LAN 上において同一にする場合に必要だと思う。)

・/etc/ppp/chap-secrets に PPTP 接続するアカウントを設定

ユーザ名 pptpd パスワード *

※上記のような書式で指定する。

・pptpd を再起動
# /etc/init.d/pptpd restart

・iptables のルールに以下を追加。
# iptables -P FORWARD DROP
# iptables -A INPUT -i eth0 -p tcp --dport 1723 -d aaa.bbb.ccc.ddd -j ACCEPT
# iptables -A INPUT -i eth0 -p 47 -d aaa.bbb.ccc.ddd -j ACCEPT
# iptables -A INPUT -i ppp+ -p udp --dport 53 -d 192.168.64.1 -j ACCEPT
# iptables -A FORWARD -i ppp+ -o eth0 -s 192.168.64.0/24 -j ACCEPT
# iptables -A FORWARD -i eth0 -o ppp+ -d 192.168.64.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.64.0/24 -j MASQUERADE
※必要に応じて、上記の設定が恒常的に有効となるように何らかの方法で設定する。

・/etc/sysctl.conf を修正

net.ipv4.ip_forward = 1

を追加。

・/etc/sysctl.conf の設定内容を有効とする
# sysctl -p

・pptpd への接続制限
/etc/hosts.allow, /etc/hosts.deny にて pptpd への接続制限を設定。

■結果

以下の通り。

  • iPhone でクライアント側設定 → ちゃんと aaa.bbb.ccc.ddd を経由してインターネットへ接続している。
  • Mac OS X でクライアント側設定 → ちゃんと aaa.bbb.ccc.ddd を経由してインターネットへ接続している。(ただし、ppp0 インタフェースの MTU を 1200 程度に設定する必要有り)
    これは、下記の「/etc/ppp/pptpd-options」に「mtu 1280」および「mru 1280」の指定を追加することで解決した。

■修正

  • 2012/01/14
    タイトルを「Net: 再度 pptpd を設定」から改題。
    「/etc/ppp/pptpd-options」において
    ・mtu 1280
    ・mru 1280
    の指定を追加した。(一部のサイトが VPN 経由で接続できなかったため。)

Linux: Squeeze にアップグレードしてみた

Debian 6.0 Squeeze released」とあるとおり、新しいバージョンの Debian GNU/Linux がリリースされた。

と言うわけで、「Debian 5.0 (lenny) からのアップグレード」にしたがって、さくらの VPS で動作している lenny を squeeze にアップデートしてみた。

手順通り作業を行ったところ、何の問題もなくアップグレードが完了した。(ちゃんとシリアルコンソールからもアクセスできた)

とは言え、何も書かないのもアレなので、行った手順を以下に記す。

  1. まずはファイルをバックアップ。
  2. 該当サーバは、以前 Web サーバとして使用していた際の残骸があったので、不要なパッケージを削除。
  3. hold されているパッケージがないか確認。
  4. /etc/apt/sources.list を書き換え。
  5. 既存パッケージを削除されないようにして、パッケージをアップグレードする。
    # apt-get update; apt-get upgrade
  6. カーネルをインストールする。
    # apt-get install linux-image-2.6-amd64
  7. udev をインストールする。
    # apt-get install udev
  8. 念のため、update-grub を実行する。
    # update-grub
  9. 再起動する。
  10. パッケージをアップグレードする。
    # apt-get dist-upgrade
  11. 再起動する。
  12. 設定などを確認する。必要であれば、一時的に削除していたパッケージをインストールして設定する。
  13. 一旦 VPS をシャットダウンし、コントロールパネルから起動する。(おまじない)
  14. 完了

影響があった、もしくはありそうなところでは、以下だろうか。

  • IPv6 サポートがモジュールではなくカーネルとなった。(ので /etc/moduels に ipv6 を書く必要がない。)
  • システムのシェルが dash になった。(シェルスクリプトで #!/bin/sh とか書いているものがあったら、動かないものが出てくるのかも)
  • sudo -s で root 権限を取った際の挙動が lenny の時と違う。(具体的には root 権限昇格後のホームディレクトリが root になる。(今までは昇格前のユーザのディレクトリだったから、こちらの方が正しい挙動のような気もする))
  • サーバ上からのネットワークアクセスが遅い気がする。(名前解決に時間がかかっているようにも思うので、もしかすると IPv6 を無効にしたらなおるのかもしれない。(追記: 予想通り「# echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6」して IPv6 を無効にした上で 6to4 のインタフェースを停止したら速くなった。「D: Software/Network - Debian GNU/Linux スレッドテンプレ」を参考とした。))

時間があったら、クリーンインストールからやってみたい。

Read More...