「PPTP サーバ構築 VPN インターネット 外部 接続できない」でお困りの方へ。ほとんど iptables のせいです。

固定IPの代わりなどに活用できるPPTPですが、結構落とし穴が多いので注意してください。というお話。コピペで動くレベルの記事が見当たらなかったので、日本で一番わかり易い導入方法を書くつもりで頑張ります。ちなみにググって出る記事の多くは、社内PCへの接続のみ(インターネットへの接続ができない)とかいろいろややこしいです。

今回は基本的に、自宅PCからさくらのVPNなどにアクセスして、そこからインターネットに接続する方法となります。プロバイダでは固定IP契約してないけど、VPNあるし安いから固定IPを使いたい場合や、ちょっとしたプロクシ程度には使えるでしょう。

まず先に手順書きます。以下の手順で進めればOKです。 さすがに vi の基本的な使い方までは省略しますので、最低限のコマンド操作は別途調べてくださいませ。

PPTP サーバ設定(おそらく完全版)

さくらVPS(CentOS6)で動作確認済。 その他環境でも基本動くと思います。

sudo yum install pptpd

vi /etc/pptpd.conf
# これを下に追記
connections 10
localip 192.168.0.1
remoteip 192.168.0.2-105

vi /etc/ppp/chap-secrets
# これを下に追記
# 「username」と「password」はそのまま、VPNの接続IDとパスワードになります。
username pptpd  password *

vi /etc/ppp/options.pptpd
# これを下に追記
# 「ms-dns」はさくらのコンパネでDNSのIPを確認できるので、それでも良い。
#iphoneで繋がらないとかあればmtuを疑ってみる。
ms-dns 8.8.8.8
ms-dns 8.8.4.4
mtu 1400

vi /etc/sysctl.conf
# net.ipv4.ip_forward を 0 から 1 に変更
net.ipv4.ip_forward = 1

#反映
/sbin/sysctl -p

# SELINUXがdisableになってるか確認
# (さくらだと最初から disable なので気にしなくていいかも)
/usr/sbin/getenforce
/usr/sbin/setenforce 0
/usr/sbin/getenforce
vi /etc/selinux/config
SELINUX=disabled

#pptp再起動
service pptpd restart

#ここ超重要。接続できない系の不具合はほぼこいつ。
iptables -A INPUT -i eth0 -p tcp –dport 1723 -j ACCEPT
iptables -A INPUT -i eth0 -p gre -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
service iptables save
service iptables restart

Window での接続方法

バージョンによって少しずつ違ったりするので別途ググったほうが早そうです。「Windows VPN PPTP」 とか。「Windows 7のVPN(PPTP)設定手順」なども参考に!

Mac での接続方法

システム環境設定→ネットワーク→左下にある「+」(新規作成)→VPNを選び、PPTPを選ぶ→ID入力し認証設定→パスワード入力しOK→左下にあるギアマークの「サービスの順序〜」→今回登録したVPNを一番上(現在接続中のものより上)にする→適用&接続。

「先生! やっぱり VPN に繋がりません!」

そもそもVPNにすら繋がらない場合、一旦 iptables を 停止して様子を見てみます。

service iptables stop

して接続してみましょう。それでもコケたら、iptables 以外のどこかの設定を記載ミスしてるかも。手入力だと結構ミスがあったりするので気をつけて下さい。ちなみに自分は、「ms-dns」 「md-dns」と書き間違えて小一時間無駄にしました…。

「先生!VPN には繋がったけど、インターネットに繋がらなくなりました!」

本題ですね。これを書きたいがために記事にしました(笑)。VPNには接続できてるのに、なぜかインターネットに接続できないケースがあまりにも多かった!タイトルにも書いたとおり、基本的に iptables が悪いです。これは私が無知なこともあるんですが、とはいえ、手探りで設定してる程度の人にとってiptablesって相当難解なんですよね…。

解決方法を伝える前に、「手順通りに設定しても動かない!」をなくすため以下のことを知っておきましょう。これ知らなかったせいで自分は相当時間を無駄にしたので超重要。

iptables コマンドで設定したものは、先に save をしないと restart の段階で消える

iptables -A INPUT -i eth0 -p tcp –dport 1723 -j ACCEPT
〜略
service iptables restart

みたいなことやっても無意味です。必ず save してから restart するようにしましょうね。なお私は、この事実に気がつくまで数時間かかりました。

service iptables stop (iptables停止中)の状態はインターネットに接続できない

「一通り動作が安定してから、最後に iptables の設定をしよう」と思い、iptables を止めたまま作業しても一生VPN経由でインターネットに接続できません(笑)。

つまり、 iptables が稼働中じゃないと外部への接続はできません!

iptables ってファイアウォールの設定なので、使ってないポートを塞いだりといったセキュリティ目的の利用が基本じゃないですか。これが前提知識としてないと、一時的に off にしてVPN接続のセットアップを行ってしまう人もいるかと思います。

で、解決方法

iptables には記載する順番みたいなものがあって、ただしい順序じゃないとやっぱり繋がらないみたいです。しかも環境により変動するので一概には言えません。で、 iptables さんは viから編集もできるので、ちゃんと動かない場合は直接触って確認してみます。

vi /etc/sysconfig/iptables
-A INPUT -i eth0 -p tcp -m tcp --dport 1723 -j ACCEPT
-A INPUT -i eth0 -p gre -j ACCEPT
-A FORWARD -i ppp+ -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o ppp+ -j ACCEPT

↑の4行が追記されているかと思いますが、この「-A INPUT 〜」 は、「-A INPUT -j REJECT 〜」みたいなやつより上に、「-A FORWARD 〜」 は、「-A FORWARD -j REJECT 〜」より上に書かれている必要があります。 例えばこんな感じになってればOK。

vi /etc/sysconfig/iptables
# 順番の入れ替えは、viで直接行ってwqしてから service iptables restart でOK

(略)
*nat
(略)
-A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
(略)
*filter
(略)
-A INPUT -i eth0 -p tcp -m tcp --dport 1723 -j ACCEPT
-A INPUT -i eth0 -p gre -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i ppp+ -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o ppp+ -j ACCEPT
-A FORWARD -j REJECT 〜
(略)

service iptables restart

まとめ

固定IP外出先とかで使いたい時もあると思います。この機会にぜひ。