さくらのクラウドにCentOS7でVPNルーターを構築する


前回はCentOS6でVPNルーターを作ってみましたが、今回はCentOS7で同じようにVPNルーターを構築してみたいと思います。今回も環境はさくらのクラウドです。ネットワーク構成は以下になります。

nwmap_centos_20150218

■ eth1 IPアドレス追加

さくらのクラウドでNICを追加すると、eth1としてアタッチされますが、IPアドレスは自分で付与する必要があります。RHEL7(CentOS7)からは、設定ファイルの直接編集は推奨されていないようなので、nmcliコマンドで設定を追加します。

$ ip a show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 9c:a3:ba:21:0a:9c brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9ea3:baff:fe21:a9c/64 scope link 
       valid_lft forever preferred_lft forever
$ sudo nmcli c add type eth ifname eth1 con-name eth1
接続 'eth1' (1a4667c0-2ee5-4084-8141-6dbf244af051) が正常に追加されました。
$ sudo nmcli c mod eth1 ipv4.method manual ipv4.addresses "10.0.0.10/8"
$ sudo nmcli c up eth1
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/2)
$ ip a show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 9c:a3:ba:21:0a:9c brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.10/8 brd 10.255.255.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe21:a9c/64 scope link 
       valid_lft forever preferred_lft forever

 

■ PPTPサーバー インストール

・ パッケージ検索

CentOS7はデーモンの起動にsystemdを使うのですが、serviceコマンドでpptpdを起動したい人のために pptpd-sysvinit というパッケージも用意されています。

$ yum list | grep pptp
pptp.x86_64                              1.7.2-22.el7                   base
pptp-setup.x86_64                        1.7.2-22.el7                   base
pptpd.x86_64                             1.4.0-2.el7                    epel
pptpd-sysvinit.noarch                    1.4.0-2.el7                    epel

予想通り、yum info pptpd-sysvinit してみると「The SysV initscript for PoPToP Point to Point Tunneling Server.」とのことでした。

・ パッケージインストール

今回はpptpdとpptpd-sysvinitをインストールすることにします。

$ sudo yum install pptpd pptpd-sysvinit

 

■ PPTPサーバー 設定

・ /etc/pptpd.conf 編集

自分自身のIPアドレスと、VPNクライアントに配布するIPアドレスの範囲を指定します。

$ sudo cp -p /etc/pptpd.conf{,.orig}
$ cat << _EOL_ | sudo tee -a /etc/pptpd.conf
localip 10.0.0.10
remoteip 10.0.0.231-240
_EOL_

・ /etc/ppp/chap-secrets 編集

VPNクライアントが使うアカウントを、以下のパラメーターで設定します。

アカウント名: nullpopopo
パスワード: P@sSw0rD

$ sudo cp -p /etc/ppp/chap-secrets{,.orig}
$ echo "nullpopopo pptpd P@sSw0rD *" | \
awk '{print $1"\t"$2"\t"$3"\t"$4}' | \
sudo tee -a /etc/ppp/chap-secrets

・ /etc/ppp/options.pptpd 編集

ms-dns 133.242.0.3
ms-dns 133.242.0.4

の2行を、以下のコマンドで追記します。

$ sudo cp -p /etc/ppp/options.pptpd{,.orig}
$ echo 133.242.0.{3,4} | sed -e 's/[[:space:]]/\n/g' | \
sed -e 's/^/ms-dns /g' | sudo tee -a /etc/ppp/options.pptpd

 

■ pptpd起動

以下のコマンドでpptpdを起動します。

$ sudo systemctl enable pptpd.service
$ sudo systemctl start pptpd

 

■ パケット転送許可

CentOSのカーネルパラメーターは、デフォルトでパケット転送を拒否しています。以下のコマンドで値が0になっています。

$ sudo sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 0

このままでは、次の手順 NAT設定を行ってもうまく通信できないのでパケット転送を許可してあげることにしますが、今までのsysctl.conf編集→sysctlコマンドでの反映とは手順がちょっと変わっています。

・ /etc/sysctl.d/10-ipv4.conf にパケット転送許可設定を書く(新規ファイル)

$ echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/10-ipv4.conf

・ sysctlコマンドで反映させる

$ sudo sysctl -p /etc/sysctl.d/10-ipv4.conf
net.ipv4.ip_forward = 1

・ 反映されていることを確認する

$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

 

■ firewalldのNATルール作成

さくらのクラウドはfirewalldが動いていないので、まずは動かします。

$ sudo systemctl start firewalld.service
$ sudo systemctl enable firewalld.service

次に、eth0とeth1がどのゾーンに属しているか確認します。

$ sudo firewall-cmd --get-active-zones
public
  interfaces: eth0 eth1

eth0、eth1ともにpublicゾーンに属しています。それではpublicゾーンの設定を確認してみましょう。

$ sudo firewall-cmd --list-all --zone=public
public (default, active)
  interfaces: eth0 eth1
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:

上記のように、まだ「masquerade: no」となっています。

・ IPマスカレード設定を追加する

$ sudo firewall-cmd --zone=public --add-masquerade
success
$ sudo firewall-cmd --permanent --zone=public --add-masquerade
success

それでは再度publicゾーンの設定を確認してみましょう。

$ sudo firewall-cmd --list-all --zone=public
public (default, active)
  interfaces: eth0 eth1
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: yes
  forward-ports: 
  icmp-blocks: 
  rich rules:

上記のように「masquerade: no」が「masquerade: yes」に変わりました。以下のコマンドでも確認することができます。

$ sudo firewall-cmd --zone=public --query-masquerade
yes

NATルールの作成と、もう1つ、PPTPが使用するTCP1723番ポートの穴あけも行います。

$ sudo firewall-cmd --zone=public --add-port=1723/tcp
$ sudo firewall-cmd --zone=public --add-port=1723/tcp --permanent

以上の設定で、PPTPクライアントからPPTPサーバーに繋がるようになりました。VPNクライアントから接続し、デフォルトゲートウェイをPPTPサーバーに向けて確認してみましょう。

$ ping 10.0.0.10
PING 10.0.0.10 (10.0.0.10) 56(84) bytes of data.
64 bytes from 10.0.0.10: icmp_seq=1 ttl=63 time=42.9 ms

 

$ traceroute -n 10.0.0.20
traceroute to 10.0.0.20 (10.0.0.20), 30 hops max, 60 byte packets
 1  10.0.0.10  24.283 ms  25.557 ms  26.326 ms
 2  10.0.0.20  27.183 ms  27.892 ms  28.304 ms

 

こんな感じでPPTPサーバー、10.0.0.0/8につながっている他ノードにつながればOKです。また、インターネットに出られることも確認しましょう。

以上です。ね、簡単でしょう?