いま私が自宅で使用しているプロバイダーは、マンションタイプです。
んで、グローバル IP アドレスをくれないというクソ仕様です。

実は半年くらい前に引っ越したのですが、引っ越す前は普通にグローバル IP アドレスをもらえるプロバイダだったので、FTP やら VPN やらを外に出してたんですね。
それができなくなったことで、もう不便で不便で……w

そこで、ファイル転送だけは何とかしようと、ファイル転送ゲートウェイ的なプログラムを組んでみようかな、なんて思いました。

ゲートウェイ ソフトウェア開発計画

無理。 プロジェクトの規模が大きすぎて諦めましたw

んじゃー、一体どんな方法があるのか……と考え抜いたところ、VPN があるじゃない、と思い付きました。
VPN サーバーを外の VPS かなんかに立てて、ウチ側ゲートウェイをそこに繋ぎっぱなしにすればいい、と。

VPS の選定

VPS は、さくらにしました。
石狩にデータセンターがあることが決め手となりました。 ←北海道出身

インストールと設定

CentOSで自宅サーバー構築 – VPNサーバー構築(OpenVPN)を参考にしました。

(4)証明書廃止リスト作成 までの間で、記載の内容と違う部分

・easy-rsa がいない
Blog on fuketch.net – OpenVPNの設定(その1:認証用ファイルの生成)
>OpenVPN 2.3からeasy-rsaが同梱されていないので別途ダウンロード。

ので、上記のページを参考にダウンロード、およびコピーします。

・whichopensslcnf の修正
バージョン更新に伴い、既に修正されているのでいらないみたいです。

これに従ってできるネットワークは、以下のようになると思います。

VPN ネットワーク図

各マシンの呼称

図中にも記載していますが、各マシンは以下のように呼ぶこととします。

・VPS に構築した VPN サーバー
ext-gateway
・自宅側の VPN クライアント
int-gateway
・外出先ネットワークの VPN クライアント
mobile
・自宅ネットワーク内のファイル サーバー
file-server

IP アドレスの固定

int-gateway の IP アドレスは、固定にしたいです。
というのも、ほかのクライアントが向く先になるからです。
そのためには、以下の設定をします。
なお、証明書は int-gateway という名前で作成したものとします。

[ext-gateway] /etc/openvpn/server.conf


client-config-dir ccd

コメントアウトを解除します。

[ext-gateway] ccd ディレクトリの作成


# mkdir /etc/openvpn/ccd

[ext-gateway] /etc/openvpn/ccd/int-gateway (新規)


ifconfig-push 10.8.0.5 10.8.0.6

ルーティング等の設定

このネットワークでのパケットの往復のイメージを示します。

VPN ルーティング図

まずは往路です。 青い線と番号で記された経路です。
① 192.168.0.0/24 宛のパケットは、10.8.0.5 に送る
② クライアント間の通信を許可する
③ 10.8.0.5 と 192.168.0.50 の間は、パケットを転送する
④ 192.168.0.5 にパケットが到着する

次に復路です。 赤い線と番号で記された経路です。
これに大ハマりしました。
⑤ 10.8.0.zzz は、192.168.0.0/24 外であるので、デフォルト ゲートウェイに送る
⑥ デフォルト ゲートウェイは、10.8.0.0/24 のパケットを 192.168.0.50 に転送する
⑦ 10.8.0.5 と 192.168.0.50 の間は、パケットを転送する (③ と同じ)
⑧ クライアント間の通信を許可してあるので、10.8.0.zzz にパケットが到着する

それでは、設定方法です。

① 経路情報を追加する
VPN クライアントに対して、経路情報を追加するよう設定します。

[ext-gateway] /etc/openvpn/ccd/int-gateway


iroute 192.168.0.0 255.255.255.0

[ext-gateway] /etc/openvpn/server.conf


route 192.168.0.0 255.255.255.0

②、⑧ クライアント間通信を許可する

[ext-gateway] /etc/openvpn/server.conf


client-to-client

コメントアウトを解除します。

③、⑦ ルーティングする

参考にしたサイトでは、VPN サーバーがルーティングを担っていますが、今回の環境では、int-gateway がルーティングすることになります。
int-gateway のルーティングの設定は以下のようになります。

[int-gateway] /etc/rc.d/rc.local に以下を追記 (どこでもよい)


echo 1 >/proc/sys/net/ipv4/ip_forward

[int-gateway] /etc/sysconfig/network


NETWORKING=yes
HOSTNAME=int-gateway
FORWARD_IPV4=yes
GATEWAY=
GATEWAYDEV=

[int-gateway] /etc/sysctl.conf


net.ipv4.ip_forward = 0

ここまで設定したら、一度再起動します。

⑥ 静的ルーティング

192.168.0.0/24 のネットワークに属する file-server は、10.8.0.zzz から受け取ったパケットをデフォルト ゲートウェイに返します。
なので、デフォルト ゲートウェイが 10.8.0.0/24 を返す先として、192.168.0.50 とするよう静的ルーティングを設定してあげます。

静的ルーティング

なお、静的ルーティングを設定できないルーターを使用している方は、以下の方法もあります。

IP マスカレード

この、masquerade と書かれている部分でポート番号と IP アドレスを変換しています。
うまいこと変換してもらえたので、file-server は 192.168.0.50 にパケットを返せばいいことになります。
その設定は以下の通りに int-gateway で設定します。


# iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

ファイアウォールについて

ext-gateway の iptables は


# iptables -A INPUT -p udp -m state --state NEW -m udp --dport 1194 -j ACCEP

だけでおk

int-gateway の iptables は、全解除。


# iptables -A INPUT -P ACCEPT
# iptables -A FORWARD -P ACCEPT
# iptables -A OUTPUT -P ACCEPT
# iptables -F

内側のサーバーの eth0 はインターネットからアクセスできず、また、都合上外側に向いている tun0 は証明書なしでの接続ができないため、利便性を考慮し、全スルーとします。
不安な方は、絞ってもよいかと。

トラックバック

このブログ記事に対するトラックバックURL:

コメント & トラックバック

他の説明を見てもなかなかうまくいかなかったものが、ここを見るとうまく行きました。ありがとうございます。

Hi there. Merely desired to question an instant dilemma. cdecccbefgeg

Comment feed

コメントする