ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

VMware上のCentOSにVPNサーバーを構築し外部からリモートデスクトップ接続をする

やりたいこと

自宅にLinuxVPNサーバーを構築し、外部からVPN接続して自宅LANのWindowsリモートデスクトップで操作する。
今回はAndroidからVPN接続してみる。
VPNサーバーはVMware上のCentOSで構築して使用する。

環境

※自宅は固定IPを使用しています

ルーター
NEC製の"ATERM-7D10F1"
IP:192.168.10.1

VPNサーバー
ホストOS
OS:Windows10
IP:192.168.10.106

ゲストOS(VMware
OS:CentOS 6.6
IP:192.168.10.30

VPNクライアント
Android
ASUSのZenFone)

VPNプロトコル

VPNプロトコルは手軽なPPP(Point-to-Point Protocol)を使用する。
セキュリティが高いのはL2TP/IPsecらしい。
PPP使用時にはIP制限とかもした方が良いかも。

VPNプロトコルの比較は下記サイトがわかりやすかった。
VPNプロトコル比較表 PPTP vs L2TP vs OpenVPN ™ vs Chameleon ™ | VyprVPN

手順

ゲストOS(VMware

ライブラリをインストール

yum install -y ppp
yum install -y pppd

pppdのインストールで下記エラーが出た場合は、rmpでインストールする。

[root@lb ~]# yum install -y pppd
読み込んだプラグイン:fastestmirror, refresh-packagekit, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
パッケージ pppd は利用できません。
エラー: 何もしません

ダウンロードしてインストール

cd /usr/local/src
wget http://poptop.sourceforge.net/yum/stable/rhel6/x86_64/pptpd-1.4.0-1.el6.x86_64.rpm
rpm -Uhv pptpd-1.4.0-1.el6.x86_64.rpm

pptpd.conf編集

vi /etc/pptpd.conf

localipとremoteipを設定

localip 192.168.10.240
remoteip 192.168.10.241-249  

・localip
PPTP-VPNサーバー自身のローカルIP。
今回の例だと10.0.10.30

・remoteip
PPTP-VPNクライアントに割り当てられるIPアドレス範囲を指定。
上記設定だと241から249の9クライアントを最大接続数とする。
LAN内のコンピューターとIPが重なると 通信できないので被らないよう注意する。


コメントアウトを外しデバッグモードに設定

debug

ログ出力の為rsyslog設定

vi /etc/rsyslog.conf

下記を追記

*.=debug;\
        news.none;mail.none     -/var/log/pptpd

chap-secretsを編集し、VPNサーバーにアクセス可能なアカウントを作成します。

vi /etc/ppp/chap-secrets

ユーザー名 接続名(サーバー名) パスワード IPアドレス
を記入します。
サーバー名は/etc/ppp/options.pptpd の nameと同じにする必要があるようですが、アスタリスクを指定してもOKだそうです。
IPアドレスにはpptpd.confで設定した範囲のIPアドレスを指定しますが、ランダムに割り振る場合はアスタリスクで良いみたいです。

vpnuser *  passhoge  *

VPN接続したユーザーが外部ネットワークに接続できるように設定。
VPNユーザーに外部ネットワークアクセスを許可しない場合は設定不要です

vi /etc/ppp/options.pptpd

同LANネットワークで使用してるDNSサーバーを指定
外部DNSを使用してる場合はそれを指定(8.8.8.8等)

ms-dns 192.168.10.30 
ms-dns 192.168.10.1  

参考までにresolv.conf

[root@lb src]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.10.30
nameserver 192.168.10.1

ipv4転送設定

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

iptables設定

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 -o eth0 -j MASQUERADE
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT

VPN許可IPの制限を設ける場合は、上記の1行目を以下のように変更。

iptables -A INPUT -i eth0 -s ***.***.***.***/32 -p tcp --dport 1723 -j ACCEPT 

VPN接続されたパケットをログ出力する場合はこうなる。

iptables -N VPN_LOGGING
iptables -A VPN_LOGGING -j LOG --log-level debug --log-prefix "VPN : "
iptables -A VPN_LOGGING -j ACCEPT

iptables -A INPUT -i eth0 -s ***.***.***.***/32 -p tcp --dport 1723 -j VPN_LOGGING

SELinuxの状態確認
SELinuxは高度なセキュリティ機能だが、これが有効になっているとVPN接続が行えない。

getenforceを確認し、Enforcingだと有効になっているので無効にする。

/usr/sbin/getenforce
Enforcing

Enforcingを0に設定

/usr/sbin/setenforce 0

設定ファイルも修正

vi /etc/selinux/config
SELINUX=disabled

SELinux変更後はサーバー再起動が必要

reboot

pptpdの再起動

service pptpd restart

自動起動設定

chkconfig pptpd on

自動起動設定がされている事を確認。

chkconfig pptpd --list

pptpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

ルータの設定

詳細設定 > ポートマッピング設定

IPアドレス ... 192.168.10.30
VPNサーバーのローカルIP
プロトコルに ... TCP
ポート範囲 ... 1723
コメント ... 適当に

「設定」をクリック

AndroidからVPN接続

設定からVPN設定。
自宅のグローバルIPと上記で設定したアカウント情報を入力で接続できた。

接続後、VPNサーバーのifconfigではpppの接続が表示される

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:192.168.10.30  P-t-P:192.168.10.241  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1396  Metric:1
          RX packets:3871 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3747 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:401489 (392.0 KiB)  TX bytes:1244178 (1.1 MiB)

デバッグログも出力されている
(但し意味は分からない)

less /var/log/pptpd 

Feb  2 23:20:03 lb pptpd[6638]: MGR: Launching /usr/sbin/pptpctrl to handle client
Feb  2 23:20:03 lb pptpd[6638]: CTRL: local address = 192.168.10.30
Feb  2 23:20:03 lb pptpd[6638]: CTRL: remote address = 192.168.10.241