linux で pptp サーバを active directoryと連携させよう。

linux で作った pptp サーバの認証を active directoryと連携させてみようという話です。


pptp には poptop (10年前ぐらいからある安心のブランドw)、 AD と連携する部分に winbind を利用します。

図解するとこんな感じ
pptp ---> winbind ----> Active Directory

A1.samba winbind の環境構築

samba winbind の環境を構築します。
http://d.hatena.ne.jp/rti7743/20110426/1303840756

A2.pptpd 導入。

残念ながら yum では入りません。なんでだろうw
しかし、親切な方が rpm を作られているので、そちらで入れることは可能です。
http://poptop.sourceforge.net/yum/beta/packages/

wget http://poptop.sourceforge.net/yum/beta/packages/ppp-2.4.5-8.1.rhel5.x86_64.rpm
wget http://poptop.sourceforge.net/yum/beta/packages/pptpd-1.3.4-2.rhel5.1.x86_64.rpm
rpm -Uvh pp*.rpm

10年ぐらい昔は、カーネルにパッチあてたりいろいろしないといけなかったよーなこともありましたが、それも遠い昔。ふつーに動作します。便利な世の中になったものですw。

A3. sysctl で ip_forward を有効にします。

このままだとpptpサーバまでしか接続できないので、
このpptpサーバをルータとして使い他のサーバにも行けるように設定します。

vi /etc/sysctrl.conf 
------------------------------
net.ipv4.ip_forward = 0
---↓変更---------------------
net.ipv4.ip_forward = 1
------------------------------


設定ファイルを再読込させます。

sysctl -p

設定が有効になったか確認します。
以下のコマンドの結果が 1 と表示されればOKです。

cat /proc/sys/net/ipv4/ip_forward

C1.pptpd の認証を winbind に委託します。

一番下に追記してください。

vi /etc/ppp/options.pptpd
--内容----------------------------------------------------------
plugin winbind.so
ntlm_auth-helper "/usr/bin/ntlm_auth --helper-protocol=ntlm-server-1"
----------------------------------------------------------------

これで終わりですw
あと pptpd を再起動すれば、それで完了です。
これだけで、 pptpd と active directory が連携できてしまうのです。
超絶楽ですね。
しかし、これでは割り当てするIPアドレスの指定などができていないのでもうちょっと調整します。

D1. 割り当てるIPアドレスなどを調整します

ファイルの一番下に追記してください。

vi /etc/pptpd.conf
--内容----------------------------------------------------------
localip   192.168.59.1
remoteip  192.168.59.100-200
----------------------------------------------------------------

E1.pptp起動。

できたので、 pptpd を起動します。

/etc/init.d/pptpd start


windows機から接続しています。
ADと連携しているので、ADにいるユーザーでログインします。
ただし、ドメインのところは空白でやります。

うまくつながるはず。

うまくいかんゾ

うまくつながらない場合、 message(めっさげと一部の人は呼ぶ)にログが出ているので確認してください。
pptpd または、 ppp と表示されている項目がヒントになると思います。

less /var/log/messages
--内容例-----------------------------------------------------------------------------------
Apr 27 03:05:20 samba3 pptpd[6454]: CTRL: Client 192.168.56.1 control connection started
Apr 27 03:05:20 samba3 pptpd[6454]: CTRL: Starting call (launching pppd, opening GRE)
Apr 27 03:05:20 samba3 pppd[6455]: Plugin winbind.so loaded.
Apr 27 03:05:20 samba3 pppd[6455]: WINBIND plugin initialized.
Apr 27 03:05:20 samba3 pppd[6455]: Plugin /usr/lib64/pptpd/pptpd-logwtmp.so loaded.
Apr 27 03:05:20 samba3 pppd[6455]: pppd 2.4.5 started by root, uid 0
Apr 27 03:05:20 samba3 pppd[6455]: Using interface ppp0
Apr 27 03:05:20 samba3 pppd[6455]: Connect: ppp0 <--> /dev/pts/1
Apr 27 03:05:23 samba3 pptpd[6454]: CTRL: Ignored a SET LINK INFO packet with real ACCMs!
Apr 27 03:05:23 samba3 pppd[6455]: MPPE 128-bit stateless compression enabled
Apr 27 03:05:25 samba3 pppd[6455]: Cannot determine ethernet address for proxy ARP
Apr 27 03:05:25 samba3 pppd[6455]: local  IP address 10.0.0.10
Apr 27 03:05:25 samba3 pppd[6455]: remote IP address 10.0.0.101
Apr 27 03:08:24 samba3 pppd[6455]: LCP terminated by peer (yl^JM-:^@<M-Mt^@^@^@^@)
Apr 27 03:08:24 samba3 pppd[6455]: Connect time 3.0 minutes.
Apr 27 03:08:24 samba3 pppd[6455]: Sent 0 bytes, received 39608 bytes.
Apr 27 03:08:24 samba3 pppd[6455]: Modem hangup
Apr 27 03:08:24 samba3 pppd[6455]: Connection terminated.
Apr 27 03:08:24 samba3 pppd[6455]: Exit.
---------------------------------------------------------------------------------------------

もっと詳細なエラーがみたい人は、 デバッグモードに切り替えることもできます。

vi /etc/pptpd.conf
--変更-------------------------------------------------------------
#debug

↓変更↓

debug
------------------------------------------------------------------

設定変更後、 pptpd を再起動します。

/etc/init.d/pptpd restart

MACOSXで繋がらない

iOS(iphone)やwindowsからだと繋がるのに、MACOSXからだけ繋がらない場合がありました。
mtuを直すと大丈夫です。

vi /etc/ppp/options.pptpd
--内容----------------------------------------------------------
mtu 1200
----------------------------------------------------------------

F1. グループで制限をかける

グループに制限をかけてみます。
vpn-allow というグループを作って、そのグループに所属している人だけが VPN できるようにします。

vpn-allowという文字列を SID 化して登録しました。
SIDの求め方の解説は、前回を参考にしてください

id rti2
uid=11107(rti2) gid=10513(domain users) 所属グループ=10513(domain users),11109(linux_logon),11110(vpn-allow)

wbinfo --gid-to-sid 11110
S-1-5-21-2558067586-3132001088-1936578106-1110


SIDによる制限を記述しました。

vi /etc/ppp/options.pptpd
--内容----------------------------------------------------------
plugin winbind.so
ntlm_auth-helper "/usr/bin/ntlm_auth --helper-protocol=ntlm-server-1 --require-membership-of=S-1-5-21-2558067586-3132001088-1936578106-1110"
----------------------------------------------------------------


試してみます。資格を持っていないユーザがアクセスすると接続エラーになり、以下のようにエラーが /var/log/messages に記録されました。
デバッグモードで動かしているのでログの量が多めです。

Apr 27 03:40:50 samba3 pppd[7201]: Connect: ppp0 <--> /dev/pts/1
Apr 27 03:40:53 samba3 pptpd[7200]: CTRL: Ignored a SET LINK INFO packet with real ACCMs!
Apr 27 03:40:53 samba3 pppd[7201]: Winbind has declined authentication for user!
Apr 27 03:40:53 samba3 pppd[7201]: Logon failure
Apr 27 03:40:53 samba3 pppd[7201]: Peer rti failed CHAP authentication
Apr 27 03:40:53 samba3 pppd[7201]: Connection terminated.
Apr 27 03:40:53 samba3 pppd[7201]: Exit.


次に資格を持っているユーザーでアクセスしてます。
こちらは、うまくいきました。

Apr 27 03:40:30 samba3 pppd[7155]: Connect: ppp0 <--> /dev/pts/1
Apr 27 03:40:30 samba3 pppd[7155]: MPPE 128-bit stateless compression enabled
Apr 27 03:40:30 samba3 pptpd[7154]: CTRL: Ignored a SET LINK INFO packet with real ACCMs!
Apr 27 03:40:32 samba3 pppd[7155]: Cannot determine ethernet address for proxy ARP
Apr 27 03:40:32 samba3 pppd[7155]: local  IP address 192.168.59.1
Apr 27 03:40:32 samba3 pppd[7155]: remote IP address 192.168.59.100


メモ:文字列グループ名で制限をかけるために require-membership-of=RTI7743+vpn-allow や require-membership-of=RTI7743/vpn-allow や require-membership-of=RTI7743\vpn-allow や require-membership-of=RTI7743\\vpn-allow などといろいろ指定してみたのですが、すべてエラーで弾かれてしまいました。
やはり、SID で指定するのが一番なようです。

文字列したときのエラーログ

Apr 27 03:27:07 samba3 pppd[6740]: Connect: ppp0 <--> /dev/pts/1
Apr 27 03:27:07 samba3 ntlm_auth: [2011/04/27 03:27:07.652344,  0] utils/ntlm_auth.c:274(get_require_membership_sid)
Apr 27 03:27:07 samba3 ntlm_auth:   Could not parse vpn-allow into seperate domain/name parts!
Apr 27 03:27:07 samba3 pppd[6740]: Winbind has declined authentication for user!
Apr 27 03:27:07 samba3 pppd[6740]: (null)
Apr 27 03:27:07 samba3 pppd[6740]: Peer rti failed CHAP authentication
Apr 27 03:27:07 samba3 pppd[6740]: Connection terminated.
Apr 27 03:27:07 samba3 pppd[6740]: Exit.