Raspberry Piをサーバーにする

Raspberry Piにいくつかのサーバー機能を持たせた時の記録です。 家にVPNを張りたくて始めた作業です。

1. sshできるようにする

menu -> 設定 -> Raspberry Piの設定 -> インターフェイス と進んで、sshを有効化する。 再起動すればsshできるようになっている。

superuserを作成しておく sudo passwd root

2. ルーターのログを記録する

ラズパイのSDカードではストレージが少なすぎるので外部HDDに保存する。 後日書きます。

3. DNS severにする

3.1 必要なツールを入れる

recolvconfを入れる。 これがないと/ectc/resolv.confを編集しても再起動で元に戻されてしまう。

$ sudo apt-get install resolvconf

nslookup等を使えるようにする為に'dnsutils'を入れる。

$ sudo apt-get install dnsutils

dnsmasqをインストールする。

$ sudo apt-get install dnsmasq

3.2 dnsmasqの設定ファイルを書く 

元の設定ファイルを変えたくないので、/etc/dnsmasq.d/local-dnsmasq.confを作成する。

port=53
domain-needed 
bogus-priv
local=/local-domain.com/
no-hosts
addn-hosts=/etc/local-hosts
expand-hosts
domain=local-domain.com

それぞれの説明について(内容はもともと設定ファイルに書いてあるものです)

  • port : Listen on this specific port instead of the standard DNS port(53). Setting this to zero completely disables DNS function, leaving only DHCP and/or TFTP.
  • domain-needed : Never forward plain names (without a dot or domain part)
  • bogus-priv : Never forward addresses in the non-routed address spaces.
  • local : Add local-only domains here, queries in these domains are answered from /etc/hosts or DHCP only.
  • no-hosts : If you don't want dnsmasq to read /etc/hosts, uncomment the following line.
  • addn-hosts : or if you want it to read another file, as well as /etc/hosts, use this.
  • expand-hosts : Set this (and domain: see below) if you want to have a domain automatically added to simple names in a hosts-file.
  • domain : Provides the domain part for "expand-hosts"

3.3 名前の登録

上でaddn-hostsに設定した/etc/local-hostsファイルを作ります。 この中に登録したいサーバーの名前を登録します。

192.168.0.1    server01.local-domain.com server01
192.168.0.2    server02.local-domain.com server02
192.168.0.3    dns-server.local-domain.com dns-server

/etc/network/interfaces.d以下にinterfacesファイルを作る。

dns-server 127.0.0.1 8.8.8.8

を記入。

hostnameの変更を行っておく。 /etc/hosts/etc/hostnameの両方で変更する必要がある。 raspberrypiからdns-serverに変更します。 rebootすれば変わっていることが確認できます。

3.4 dnsmasqの起動

$ service dnsmasq start
or
$ systemctl enable dnsmasq

起動していることの確認

$ sudo netstat -anp | grep dnsmasq
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      457/dnsmasq
tcp6       0      0 :::53                   :::*                    LISTEN      457/dnsmasq
udp        0      0 0.0.0.0:53              0.0.0.0:*                           457/dnsmasq
udp6       0      0 :::53                   :::*                                457/dnsmasq
unix  2      [ ]         DGRAM                    12641    457/dnsmasq

4. firewall-cmd

firewall-cmdで接続の管理をします。 サービスごとに、defaultのポートを変更している時は注意

5. RasberryPiのusername変更

Raspbianでpiユーザ名とパスワードをうまいこと変更する - Qiita

6. OpenVPN構築

PiVPNによるOpenVPNのインストール - とある社畜の頭脳整理

6.1 firewall関連について

サブネット10.8.0.0/24にクライアントが割り振られているとします。 インターフェイスはwlan0で接続しているとします。

マスカレードの設定

$ sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -m comment --comment openvpn-nat-rule -j MASQUERADE

openvnのポートを開けます。1194/udpがデフォルトです。

$ sudo firewalld-cmd --permanent --add-service=openvpn

VPN接続先のネットワークのマシンへの接続を許可します。これしないとVPN繋いだ状態で外のネットワークに接続できなかったです。

$ sudo firewall-cmd --permanent --zone=trusted --add-interface=tun

✖️. VPN(過去の情報のログ)

内容が間違っています。後で修正します。

OpenVPNを使用します。

  1. パッケージのインストール
  2. 設定ファイルの編集
  3. 証明書と鍵の初期化、作成
  4. OpenVPNの設定ファイルの編集
  5. OpenVPN用のport解放 以下の内容は

  6. Raspberry Pi 3にOpenVPNをインストールする(サーバー編)

  7. VPNサーバー構築(OpenVPN) - CentOSで自宅サーバー構築

  8. HOWTO – OpenVPN Community

  9. OpenVPN - Debian Wiki

を参考にしました。よくまとまっていて見やすいです。

4.1 パッケージのインストール

$ sudo apt-get install openvpn openssl
$ cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa

4.2 設定ファイルの編集

/etc/openvpn/easy-rsa/varsを編集する。 証明書作成のコマンドを実行した時の初期値となるらしい。 編集したらsource ./vars

export EASY_RSA="/etc/openvpn/easy-rsa/"

export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Setagaya"
export KEY_ORG="Home"
export KEY_EMAIL="admin@example.com"
export KEY_OU="VPNServer"
export KEY_SIZE = 2048

4.3 証明書と鍵の初期化、作成

まず、初期化を行う。

# /etc/openvpn/easy-rsaで作業
$ ./clean-all

次に、認証局証明書と秘密鍵を作成する。

$ ./build-ca

defaultの設定のもので良いなら、Enterで進んでいく。

VPNサーバ証明書秘密鍵の作成。yesをおして進めば良い。 

$ ./build-key-server server

最後に、DHパラメータを作成する。

$ ./build-dh

(option)TLS鍵認証を作成する。

$ openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key

次はクライアント用の作業。クライアント証明書、秘密鍵の作成を行う。VPNクライアントの追加の際には毎回作る必要がある。

$ ./build-key client1

4.4 OpenVPNの設定ファイルの編集

OpenVPNの設定ファイルを編集する。サンプルファイルは/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gzで解凍して、/etc/openvpn/server.confにおく。 中身は以下のようにする。

mode server
tls-server

dev tun

dh dh2048.pem

server 10.8.0.0 2555.255.255.0 ; VPNが割り当てる仮想IP

push "route 192.168.1.0 255.255.255.0" ; ルーターへのルートをVPNserver(raspi)経由にする

push "dhcp-option DNS 192.168.xxx.xxx"

push "redirect-gateway def1 bypass-dhcp" 

tls-auth ta.key 0 ; TLS認証を有効化

cipher AES-256-CBC

comp-lzo

user nobody
group nobody

log-append /var/log/openvpn.log ; logの格納場所

client-to-client

management localhost 7505 ; 管理インターフェイスの有効化

; crl-verify crl.pem 証明書廃止リストの有効化。これはいらないのでは

4.5 VPNインタフェース用ファイアウォール自動設定

自動設定

/etc/openvpn/openvpn-startupを編集する。

#!/bin/bash

/etc/openvpn/openvpn-shutdown # VPN interface iptablesルール削除スクリプトの実行

iptables -l OUTPUT -o tun+ -j ACCEPT # VPN severからの送信を許可
iptables -l FORWARD -o tun+ -j ACCEPT

iptables -l INPUT -i tun+ -j ACCEPT # VPN clientからVPN serverへのアクセスを許可する場合

iptables -l FORWARD -i tun+ -d 192.168.1.0/24 -j ACCEPT

自動設定解除

/etc/openvpn/openvpn-shutdownを編集。実行権限も付与しておく。chmod +x /etc/openvpn/openvpn-shutdown

#!/bin/bash
# VPNインタフェース(tun+)用iptablesルール削除関数
delete() {
    rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
    for num in $rule_number
    do
        iptables -D $target $num
    done
}

# VPNインタフェース(tun+)用iptables受信ルール削除
target='INPUT'
delete

# VPNインタフェース(tun+)用iptables転送ルール削除
target='FORWARD'
delete

# VPNインタフェース(tun+)用iptables送信ルール削除
target='OUTPUT'
delete

4.6 OpenVPNログローテーション設定

/etc/logrotate.d/openvpnを編集。logを入れる場所に注意。

/var/log/openvpn.log {
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl restart openvpn 2>&1 > /dev/null || true
    endscript
}

4.7 OpenVPNの起動

起動

起動するときは

$ sudo systemctl enable openvpn

再起動は

$ sudo /etc/init.d/openvpn restart

自動起動設定

$ chkconfig openvpn on

ポート解放

iptableを使って制御します。

iptablesでファイアウォールを構築する方法!を参考にしました。

iptable install

$ apt-get install iptables iptables-persistent

アクセスルールの変更、適応

$ vi /etc/iptables/rules.v4 

# content
# Generated by iptables-save 
*filter
:FORWARD DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]
# loopback
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow IP
-A INPUT -s 192.168.0.0/24
# Multicast DNS
-A INPUT -p udp -m udp -d 224.0.0.251 --dport 5353 -j ACCEPT
# Ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# SSH
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# HTTP
-A INPUT -p tcp -m tcp --dport 80
# HTTPS
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# Webmin
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
# FTP-Data
-A INPUT -p tcp -m tcp --dport 20
# FTP
-A INPUT -p tcp -m tcp --dport 21
# FTP-Passive
-A INPUT -p tcp -m tcp --dport 49152:65534
# SMTP
-A INPUT -p tcp -m tcp --dport 25
# Submission
-A INPUT -p tcp -m tcp --dport 587
# IDENT
-A INPUT -p tcp -m tcp --dport 113 -j REJECT
# POP3
-A INPUT -p tcp -m tcp --dport 110
# IMAP
-A INPUT -p tcp -m tcp --dport 143
# DNS TCP
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
# DNS UDP
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
# VPN
-A INPUT -p udp -m udp -m state --state NEW -m udp--dport 1194 -j ACCEPT
# Masquerade outgoing traffic
-t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
-t nat -A POSTROUTING -s 10.8.0.0/24 -o tun0 -j MASQUERADE
-A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT

# Squid
-A INPUT -p tcp -m tcp --dport 3128

COMMIT

-j ACCEPTがついて入れば許可します。

変更を適応させます。

$ service netfilter-persistent restart
or
$ /etc/init.d/netfilter-persistent restart

iptables-persistentnetfilter-persistentに変わったらしい。

適応されているか確認

iptables -L

4.8 Client側の作業

openvpn client側の設定(ios) - 情報学関連の備忘録

iPhoneやiPad (iOS) でOpenVPNを使ってみよう! | OpenVPN.JP

トラブルシューティング

vpn - Route all traffic through OpenVPN - Ask Ubuntu