ラズパイでVPNアクセスルータを作ってみた

ネットワーク

はい!ムチャぶりおにぃです。

とある案件にてVPNアクセスルータが必要になった為、普通に売っているブロードバンドルータではなく技術会社っぽくLinuxを使ってVPNアクセスルータを作ってみた。案件に必要最低限の設定のみしています。
といいつつ、先人たちのお知恵を存分に拝借しています。

 

(1)~機材集め~

まず、機材選定をする段階で、Linuxが動くことが前提になったが今となるとどんな機器でも動くので、コストを抑えるためにRaspberry Piを選んでみました。

Raspberry Piにもいろいろなバージョンがあり、【Raspberry Pi 3 Model B】で搭載されている無線LANは今回不要なので、あえて【Raspberry Pi 2 Model B】(ラズパイ2)を選択。

あと、動かすためのmicroSD(後述のOSイメージが3Gあるので4GB以上を用意)・スマホの充電器・ケースを購入。全部で9千円いかないぐらい(安いね)。

 

(2)~OS選択~

ラズパイで利用できるLinux

・Raspbian(Debianベース)
・Pidora(Fedoraベース)
・Arch Linux
・CentOS 7

とあり、去年の3月ぐらいから利用できるようになった【CentOS 7】を選択しました。
弊社のシステム基盤としては、CentOSをベースとして使っていますので。

 

(3)~OSインストール~

CentOSのオフィシャルサイトからラズパイ2用のイメージファイルをダウンロードして、microSDに書き込みます。

ダウンロード先:
https://wiki.centos.org/Download
 └ RaspberryPi2 (img) 

microSDに書き込むツールは、シリコンリナックス社様が公開している【DD for Windows】を利用しています。
ダウンロード先:
http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows
 └ Ver.0.9.9.8
【DD for Windows】の使い方は、検索して調べてね。
Windows10で作業していますが、「管理者として実行」で実行しないと利用できませんでした。Windows7以降必須らいしいです。

 

(4)~初期設定~

CentOSを書き込んだmicroSDをラズパイ2に差し込んで起動します。
この時、minimalでインストールされた状態のCentOSが起動しますので、ログイン画面が表示されたらroot/centosでログインします。
とりあえず、LANケーブルを刺せばDHCPでIPが取得できるので、アップデートだったりパッケージのインストールは可能です。
ということで、以下の流れで設定しています・・・

◆操作しやすいようにコンソールログインをして、ifconfigをしましょう。
# ifconfig
・インターフェースのIPアドレスをWindows/MacからSSHで接続しましょう。

◆microSDをすべて利用できるようにパーティションの拡張
# fdisk /dev/mmcblk0
・パーティション領域確認します。
「p」
・拡張するパーティション(最後のパーテ)を一度削除する。
「d」「3」
・再度パーティション領域を設定する。
「n」「p」「入力せずENTER」「入力せずENTER」
※First sector/Last sectorは自動で入力されます。
・パーティション領域を保存します。
「w」

# shutdown -r now
・変更したパーティションを反映させる

# resize2fs /dev/mmcblk0p3
・パーティション領域を実際に使えるよう拡張する

◆キーボード・タイムゾーンの設定
# localectl set-keymap jp
# timedatectl set-timezone Asia/Tokyo

◆ログインユーザー追加(wheel追加)・公開鍵を作成
# adduser hogehoge
# usermod -G wheel hogehoge
# passwd hogehoge
・コンソールでログインするためにパスワードを設定。
# su – hogehoge
・作成したユーザーにスイッチ。
$ mkdir -m 700 ~/.ssh
$ ssh-keygen -q -N “” -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ cat ~/.ssh/id_rsa
・リモート元に転記。
$ exit

◆sshログインを公開鍵方式に設定変更
# sed -i -e “/^root/a\hogehoge ALL=(ALL) NOPASSWD:ALL” /etc/sudoers
# sed -i -e ‘s/^%wheel/# %wheel/g’ /etc/sudoers
# sed -i -e ‘/#PermitRootLogin/a\PermitRootLogin no’ /etc/ssh/sshd_config
# sed -i -e ‘s/^PasswordAuthentication yes/#PasswordAuthentication no/g’ /etc/ssh/sshd_config
# service sshd restart
・ログインチェック(rootログインできないこと・作成したユーザーで鍵ログインできること)

◆rootパスワード削除
# sed -i -e ‘s/^root/#root/g’ /etc/shadow
# sed -i -e ‘/root/a\root:*LOCK*:14600::::::’ /etc/shadow
# sed -i -e ‘/#root/d’ /etc/shadow

◆CTRL+ALT+DELETEを無効化
# ln -s /dev/null /etc/systemd/system/ctrl-alt-del.target

◆IPv6を無効化
# cat << EOL > /etc/sysctl.d/disable_ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOL
# sysctl -p /etc/sysctl.d/disable_ipv6.conf

◆irqbalanceバグ
# cat << EOF > /etc/cron.daily/irqbalance
#!/bin/sh
/bin/systemctl restart irqbalance.service
EOF

◆キャッシュクリア・パッケージアップデート
# yum clean all
# yum -y update

◆基本パッケージをインストール
# yum -y install chrony ntpdate perl bind-utils iptables-services wget
# yum -y groupinstall “Development Tools”

◆フィルタリングソフトをiptablesに変更
# systemctl stop firewalld
# systemctl disable firewalld
# mv /etc/sysconfig/iptables /etc/sysconfig/iptables.orig
# cat << EOL > /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state –state INVALID -j DROP
-A INPUT -p tcp -m tcp –sport 80 –dport 80 -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -s 事務所の固定IP/32 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -j DROP
COMMIT
EOL
# systemctl enable iptables
# systemctl start iptables

◆時刻設定
# sed -i -e ‘s/0.centos.pool.ntp.org/ntp.nict.jp/g’ /etc/chrony.conf
# sed -i -e ‘s/1.centos.pool.ntp.org/ntp1.jst.mfeed.ad.jp/g’ /etc/chrony.conf
# sed -i -e ‘s/2.centos.pool.ntp.org/ntp2.jst.mfeed.ad.jp/g’ /etc/chrony.conf
# sed -i -e ‘s/3.centos.pool.ntp.org/ntp3.jst.mfeed.ad.jp/g’ /etc/chrony.conf
# ntpdate ntp.nict.jp
# systemctl start chronyd
# systemctl enable chronyd

 

(5)~ルータ設定~

初期設定が完了したらルータにすべく以下の流れで設定しています・・・
設定が終わり再起動するタイミングでLANケーブルをONU(光回線終端装置)とつなぎ替えます。

◆パッケージインストール
# yum -y install rp-pppoe ppp-devel

◆PPPoE設定
# pppoe-setup
・出てくる質問に答えて設定をしていく。
Enter your Login Name:ISPの接続IDを入力
Enter the Ethernet interface:LANケーブルを刺すインターフェイス名を入力
Enter the demand value:常時接続なので「no」
Enter the DNS information here:ネームサーバーを固定するので「8.8.8.8」
Enter the secondary DNS server address here:ネームサーバーを固定するので「8.8.4.4」
Please enter your Password:ISPの接続パスワード
normal user to start or stop DSL connection:rootユーザー以外操作させないので「no」
Choose a type of firewall:ルータとして利用するので「2」
Please enter no or yes:起動時に有効かするので「yes」
※入力確認が表示されたら「y」で保存

◆インターフェイス設定
・pppoeで使うインターフェースのプライベートIPを固定する
# cp /etc/sysconfig/network-scripts/ifcfg-eth0.bak /etc/sysconfig/network-scripts/ifcfg-eth0
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.bak
# nmcli c modify eth0 ipv4.addresses “10.10.10.254/24”
# nmcli c modify eth0 +ipv4.dns 8.8.8.8
# nmcli c modify eth0 ipv4.method manual
# nmcli c modify eth0 ipv4.gateway “10.10.10.254”
# nmcli c modify eth0 ipv4.never-default yes

◆SELinuxを無効化する
sed -i -e ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

◆起動時にpppoe接続できない対応
・/etc/sysconfig/networkのファイルがないとpppoe接続ができない
touch /etc/sysconfig/network

◆再起動してルータになっているかテストをする
# shutdown -r now
・設定不備がなければpppoe接続できていてログイン画面になる

 

(6)~VPN設定~

VPNにも、IPsec, L2TP/IPsec, PPTP, IPIP, L2TPv3と多種多様の方式があります。

今回は、セキュリティーレベルを考えると【L2TP/IPsec】なのですが、通信速度が遅くなるので【pptp】を選択しました。
ということで、VPN設定についても以下の流れで設定しています・・・

◆パッケージインストール
・yumでインストールできないのでソースインストールになります。
# cd /usr/local/src
# wget https://jaist.dl.sourceforge.net/project/poptop/pptpd/pptpd-1.4.0/pptpd-1.4.0.tar.gz
# tar xvzf pptpd-1.4.0.tar.gz
# cd pptpd-1.4.0
# ./configure –prefix=/usr
# make
# make install
# cp samples/pptpd.conf /etc/
# cp samples/options.pptpd /etc/ppp/

・conf設定
# cp /etc/pptpd.conf /etc/pptpd.conf.orig
# echo “localip 10.10.10.254” >> /etc/pptpd.conf
# echo “remoteip 10.10.10.11-30” >> /etc/pptpd.conf
# cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.orig
# sed -i -e ‘/ms-dns 10.0.0.2/a\ms-dns 8.8.4.4’ /etc/ppp/options.pptpd
# sed -i -e ‘/ms-dns 10.0.0.2/a\ms-dns 8.8.8.8’ /etc/ppp/options.pptpd
# echo “#” >> /etc/ppp/options.pptpd
# echo “mtu 1200” >> /etc/ppp/options.pptpd
# echo “mru 1200” >> /etc/ppp/options.pptpd

・pptp認証ユーザー設定
# cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.orig
# echo ‘hogeuser pptpd “hogepass” *’ >> /etc/ppp/chap-secrets

・パケット転送をできるように設定
# sed -i -e ‘/net.ipv4.ip_forward/d’ /etc/sysctl.conf
# echo ‘net.ipv4.ip_forward = 1’ >> /etc/sysctl.conf
# sysctl -p

・pptpd起動スクリプト設定と自動起動設定
# cat << EOL > /etc/init.d/pptpd
#!/bin/sh
#
# Startup script for pptpd
#
# chkconfig: – 85 15
# description: PPTP server
# processname: pptpd
# config: /etc/pptpd.conf

# Source function library.
. /etc/rc.d/init.d/functions
# See how we were called.
case “\$1” in
start)
    echo -n “Starting pptpd: “
    /sbin/modprobe nf_conntrack_proto_gre
    /sbin/modprobe nf_conntrack_pptp
    if [ -f /var/lock/subsys/pptpd ] ; then
        echo
        exit 1
    fi
    daemon /usr/sbin/pptpd
    echo
    touch /var/lock/subsys/pptpd
    ;;
stop)
    echo -n “Shutting down pptpd: “
    killproc pptpd
    echo
    rm -f /var/lock/subsys/pptpd
    ;;
status)
    status pptpd
;;
condrestart)
    if [ -f /var/lock/subsys/pptpd ]; then
        \$0 stop
        \$0 start
    fi
    ;;
reload|restart)
    \$0 stop
    \$0 start
    echo “Warning: a pptpd restart does not terminate existing “
    echo “connections, so new connections may be assigned the same IP “
    echo “address and cause unexpected results. Use restart-kill to “
    echo “destroy existing connections during a restart.”
    ;;
restart-kill)
    \$0 stop
    ps -ef | grep pptpd | grep -v grep | grep -v rc.d | awk ‘{print \$2}’ | uniq | xargs kill 1> /dev/null 2>&1
    \$0 start
    ;;
*)
    echo “Usage: \$0 {start|stop|restart|restart-kill|status}”
    exit 1
esac

exit 0
EOL
# chmod +x /etc/init.d/pptpd
# chkconfig pptpd on
# /etc/init.d/pptpd start

・iptablesにpptpdとパケット転送の許可設定を追加
# sed -i ‘/icmp/a\-A INPUT -p tcp -m state –state NEW -m tcp –dport 1723 -j ACCEPT’ /etc/sysconfig/iptables
# sed -i ‘/icmp/a\-A INPUT -p gre -j ACCEPT’ /etc/sysconfig/iptables
# sed -i ‘/-A INPUT -j DROP/a\-A FORWARD -o ppp+ -j ACCEPT’ /etc/sysconfig/iptables
# cat << EOL >> /etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ppp+ -j MASQUERADE
COMMIT
EOL
# service iptables restart

 

(7)~クライアント設定~

WindowsだったりLinuxだったりにpptp認証ユーザー設定で登録したID/PWを使って設定をしてVPN接続しVPNアクセスルータ経由で外部にアクセスできれば設定完了!!

あとどのように運用するかは貴方次第!
・固定IPのプロバイダを使ってない場合・・・ラズパイを再起動するとIP変わっちゃうよ!なので何かしらの方法でIPを確認する方法を実装しないとです。。。
・pppoe接続タイミングの兼ね合いでiptablesがうまく適応できないことがわかっています。現在は/etc/rc.localなどで調整をしています。

 

そんな感じで設定は完了です。では。

▼ 感じるほどテクってる 関連記事