VMware上のCentOSにVPNサーバーを構築し外部からリモートデスクトップ接続をする
やりたいこと
自宅にLinuxのVPNサーバーを構築し、外部から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
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