LinuxでWindows用VPNサーバを立ち上げる


初版2002年4月21日(日)
2002年4月23日(火) VPNのNAT越えについて追記
2002年4月26日(金) chapmsのセキュリティホールについて追記
(文字コードをUTF-8に修正2022年6月)
松元隆二

注:文章中でRPMファイルへリンクしてますが、Windowsのブラウザからクリッ クすると、OSが発狂する(藁)事があるようですので、右クリックで保存してく ださい。


はじめに

学科のネットワーク管理をやっとるのですが、先日学科内の教授より、学科の 無線LANでネットワークに接続して、別サブネット(の依頼した教授の講座)の LANに直接つながるようにして欲しいと依頼されたのですが、技術的に色々検 討した末、VPNサーバを立ててみる事にしました。

構成はこんな感じです。

大学幹線 +--- router +--- 学科の無線LAN
                +
                | 
                | (講座のLAN)
             VPNサーバ  
参考にした資料は雑誌「Software Desingn」2001年9月号です。

Windowsのクライアントで使われるVPN(Virtual Private Network)プトロコル はPPTPが多いようです。今回立ち上げたサーバはPPTPサーバです。

以下の設定で、Windows XP Pro/98SE/95での接続を確認しています。他は知りませ ん。


1.構成


2.サーバの設定

2.1カーネルの再構築

PPTPの暗号化フォーマットのパッチをカーネ ルに当ててください。ここ(http://planetmirror.com/pub/mppe/linux-2.4.16-openssl-0.9.6b-mppe.patch.gz)に あります。コピー。
cd /usr/src
mv linux linux.OLD  古いソースの退避
tar xvfz linux-2.4.18.tar.gz
cd linux
gzip -dc linux-2.4.16-openssl-0.9.6b-mppe.patch.gz | patch -p1
カーネルの初期設定ファイルを作ってください。雛型は /usr/src/linux-2.4.5/configsにあります。今回はSMPマシンなので kernel-2.4.5-3smp-i586.configを使用。
cp /usr/src/linux-2.4.5/configs/kernel-2.4.5-3smp-i586.config .config
make menuconfig 
menuconfigで CONFIG_PPPを有効にしてください。作成した .config において 「CONFIG_PPP=m」となってればOK。私の作った コンフィグ
make dep
make clean
make bzImage
make modules
make modules_install
make install
カーネルを更新したら「/etc/lilo.config」を適切に書き換える。そしてliloを 実行後reboot。無事立ち上がる事を祈りましょう(藁。

2.2pppdの更新

Turbolinux7にすでに入っているpppdが新たに入れるpppdと競合するので削除し てください。
rpm -e rp-pppoe-gui-3.0-2
rpm -e rp-pppoe-3.0-2
rpm -e ppp-2.4.0-3
次にpppのrpmのソースをhttp://planetmirror.com/pub/mppe/ppp-2.4.1-3mppe.src.rpmから取ってきて ください。コピー。

rpm -i ppp-2.4.1-3mppe.src.rpm
cd /var/src/rpm/SPECS
Turbolinux7ではそのまま動かないようですので、SPECファイルを修正してくだ さい。というかpam-develが見つけられなかった。
** ppp.spec.ORG        Fri Apr 19 19:08:07 2002
--- ppp.spec    Fri Apr 19 19:08:15 2002
***************
*** 16,22 ****
  Patch6: ppp-2.4.1-openssl-0.9.6-mppe.patch
  Patch7: ppp-2.4.1-MSCHAPv2-fix.patch
  BuildRoot: %{_tmppath}/%{name}-root
- BuildPrereq: pam-devel
  Requires: glibc >= 2.0.6, /etc/pam.d/system-auth
  
  %description
--- 16,21 ----
---------------------
パッケージ作成。インストール
rpm -bb ppp.spec 
rpm -i  /var/src/rpm/RPMS/i586/ppp-2.4.1-3mppe.i586.rpm
作ったパッケージはこれ(ppp-2.4.1-3mppe.i586.rpm)。

2.3 pptpdのインストール

次にpptpdのrpmのソースをhttp://planetmirror.com/pub/mppe/pptpd-1.1.2-2.src.rpmから取ってきて ください。コピー。

rpm -i pptpd-1.1.2-2.src.rpm
cd /var/src/rpm/SPECS
パッケージの作成をしてください。なんかしらないですが、1回目は失敗しま したが、2回目は成功しました。よく分かりません。
rpm -bb pptpd-1.1.2.spec 
rpm -bb pptpd-1.1.2.spec 
rpm -i /var/src/rpm/RPMS/i586/pptpd-1.1.2-2.i586.rpm 
作ったパッケージはこれ(pptpd-1.1.2-2.i586.rpm)。

以上でソフトウエアのインストールは終わりです。

2.4 設定ファイルの変更

そしてreboot。「ps axuw|grep pptpd」でpptpdが立ち上がっている事を確認 してください。

2.5 クライアントの設定

Windows側でVPNのダイヤルアップアダプタを作る必要があります。詳細は googleで「Windows VPN ダイヤルアップ」とかして探してください。


3.Tip

3.1 ルータでのVPNのパケットの通過許可のルール

講座のルータはLinuxなのですが、ipchainsで以下のルールでVPNの通過が出来 ました. VPNはTCPの1723番ポートと特殊なプロトコルGRE(47番)を使います。

ipchains -A `環境に合わせる` -s 0/0 -d `VPNサーバ` 1723 -p tcp -j ACCEPT 
ipchains -A `環境に合わせる` -s 0/0 -d `VPNサーバ` -p 47 -j ACCEPT 
ipchains -A `環境に合わせる` -s `VPNサーバ` -d 0/0 -p 47 -j ACCEPT 
ちなみにプロトコルTCPは6番、UDPは17番です。一覧は /etc/protocolsにあります。

3.2 NAT越え

VPNは標準ではNAT(IP masquerade)をうまく越えられないようです。原因はプ ロトコルGRE(47番)です。試した限りでは普通のNATでも繋がる事は稀にあるよ うですが、安定して繋がるという事はないようです。

GRE用のNATパッチ http://www.impsec.org/linux/masquerade/netfilter-pptp-2.4.17-rev2.patch.gz が提供されています。

自宅で構成しているNATサーバでインストールしました。プロバイダはODNです。 なお、以下のメモは、すでに通常のNATの設定を行っている事を前提としてい ます。NATの標準的な設定についてはgoogleでも使って検索してください

カーネルの構築。自宅サーバのため、カーネルのバージョンは遊んでます。 安定版ではありません。
tar xvfz linux-2.4.18.tar.gz
cd linux
gzip -dc patch-2.4.19-pre7.gz | patch -p1
gzip -dc netfilter-pptp-2.4.17-rev2.patch.gz | patch -p1
パッチがうまくあたらず2つのrejectファイルができます。
include/linux/netfilter_ipv4/ip_conntrack.h.rej
net/ipv4/netfilter/Makefile.rej
しかし、大したエラーじゃないので、手パッチ当ててください。そして.configの生成。 生成した .config ファイルにおいて「CONFIG_IP_NF_PPTP=m」となっていればOKです。 私の作ったコンフィグ。かなり遊んでるので そのまま使わない方が良いでしょう。

コンパイル。

cp /usr/src/linux-2.4.7-10/configs/kernel-2.4.7-athlon-smp.config .config
make menuconfig 
make dep
make clean
make bzImage
make modules
make modules_install
make install
次に、boot loaderの設定。 RedHat7.2Jで、私はLILOではなくgrubを使ってい るので/boot/grub/grub.confを編集。liloを使っている方はlilo.confを編集 してliloを実行してください。

/etc/rc.d/rc.localの最後に以下の行を挿入してください。

/sbin/modprobe ip_nat_pptp
そしてreboot。 reboot後pptpのモジュールが読み込まれているか/sbin/lsmod で確認してください。ip_nat_pptp, ip_conntrack_pptpが読み込まれていたら 正常のようです。

以上で設定は終了です。無事PPTPはNATを通過できるでしょうか…

3.3 Windowsの「ネットワークコンピュータ」で remote接続した先のLAN内部 の別コンピュータが見えない

VPNで接続すると、Windowsの「ネットワークコンピュータ」で remote接続し た先のLAN内部の別コンピュータが見えない。

VPNを設定する前は、これが当然出来ると思っていたのですが出来ません。 tcpdumpをかけてみたのですが、どうもpppがnetbios-*のbroadcastを中継して いないみたいです。(きちんと調べたわけではない。)

これが出来ないと、意味ないじゃん。という事で悩んだのですが、次の手順で 別コンピュータが見えるようになります。

接続先のLANでsambaを使い、winsサーバを立ち上げてください。

Solaris2.6で立ち上げたsambaサーバ(samba-2.2.2-ja-1.1)ではsmb.confの [global]セクションに以下の行を追加したらwinsサーバになりました。

domain master = yes
local master = yes
preferred master = yes
os level = 65
wins support = yes
そして、/etc/ppp/options.pptpd で winsサーバを指定してください。DNSサー バも指定した方が良いようです。
ms-wins winsサーバ名
ms-dns dnsサーバ名

以上で、 Windowsのネットワークコンピュータで LAN内部の別コンピュータの が見えるようになりました。

Windows98SEでは上記方法でうまくwinsサーバが割り当てられない場合がある ようです。その場合は、winsサーバをじかに指定してください。

「コントロールパネル」 →「ネットワーク」 →「TCP/IP→ダイヤルアップアダプタ#2(VPNサポート)」 →「プロパティ」 →「WINS設定」 →「WINSの解決をする」

多分にWindows2000/NT4.0 Serverでもwinsサーバは作れるのでしょうが、手も とに無いので知りません。

なお、特定の1台のマシンだけ見えればOKでしたら、IPアドレスで直接指定し てもOKです。例えば IPアドレスが123.123.123.123のマシンに接続するには、 IEを立ち上げてURLとして

¥¥123.123.123.123
と指定してください。「¥」は実際には半角を使う。

4. セキュリティ

VPNのクライアント側のセキュリティに注意してください。講座内のLANのよう にFirewallがあるわけではありません。

Windowsでは、簡単にファイル共有可能ですが、

VPNのクライアント側でファイル共有設定していると、VPNで接続したLANだけ でなく、本当に接続しているネットワークからもファイル共有されています。

具体的に言うと、学科の無線LANからVPNでつなぐと、VPNで接続した講座のネッ トワークだけではなく、無線LAN内部にいる別のコンピュータからもファイル 共有できてしまいます。(当然と言えば当然なのですが)


5.ファイルのサンプル

今回のVPNサーバで設定したファイルです。必ず環境にあわせて変更して利用 ください。誤動作防止のため日本語のコメントは消してください。
以上。