自宅のネットワークに外部からアクセスするためにVPNを導入します(`・ω・´)
iPhoneやiPadでも使いたい。 & 簡単に導入したい。のでPPTPでVPNサーバを構築します。
PPTPで用いられている認証プロトコルはクラックされています(ここ参照)
ただ,iPhoneなどで気軽に使えるVPNサーバは,PPTPだけといっても過言ではないので,これを使います。
iPhoneをjailbreakしてOpenVPNを入れれば,話は別ですが。。
$ sudo apt-get install pptpd
ここでは,以下ように動作するように設定をしていきます.
・VPNサーバのIP:192.168.0.11
・クライアントに割り振られるIP:192.168.0.201~210
・ログインユーザ名:hoge
・ログインパス:hogepass
$ sudo vim /etc/pptpd.conf
以下を追加
# VPNサーバを動かすPCのIPアドレス
localip 192.168.0.11
# VPNでアクセスしてきたクライアントのIPアドレス
remoteip 192.168.0.201-210
$ sudo vim /etc/ppp/ptpd-options
以下を追加
ms-dns 10.0.1.1
noipx
mtu 1490
mru 1490
複数のユーザを設定したい場合は,ここに複数記述するのかな?
$ sudo vim /etc/ppp/chap-secrets
以下を追加
hoge * hogepass *
$ sudo vim /etc/sysctl.conf
コメントアウトされているので,有効化(頭に付いている#を消す
net.ipv4.ip_forward=1
以前設定したfirewall.shに追加する。
sshの設定の下辺がいいかなー。
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -i eth0 -p 47 -j ACCEPT
iptables -A OUTPUT -p 47 -j ACCEPT
iptables -A INPUT -i ppp+ -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo reboot
外部からのアクセスは,ルータの設定が必要!
・ルータのPPTPパススルーを許可する
・プロトコルの47番(GRE)とTCPの1723番のポートをVPNサーバに開放する
サーバを外部に公開するにあたり,このままだとセキュリティ的に不安で仕方がないです。。
なので,iptablesを使って,ファイヤーウォールを構築します(`・ω・´)
と言っても,以下のサイトを参考?(ほとんどまんま。。)にさせていただいています。
ブローヴちゃん:Debian に iptables を設定
ほんとうにありがとうございます!!
以下のファイルを適当な場所に作成。
#! /bin/sh
# firewall.sh
# 内部ネットワークのネットマスク取得
WANINT="eth0"
LOCALNET_MASK=`ifconfig $WANINT|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`
# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $WANINT|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK
MY_SSHD_CONFIG=/etc/ssh/sshd_config
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done
# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done
# フラグメント化されたパケットはログを記録して破棄
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP
# 外部とのNetBIOS関連、Dropbox関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445,17500 -j DROP
iptables -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445,17500 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445,17500 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445,17500 -j DROP
# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
# ポートスキャン対策
iptables -N LOG_PORTSCAN
iptables -A LOG_PORTSCAN -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A LOG_PORTSCAN -j LOG --log-level info --log-prefix '[IPTABLES PORTSCAN] '
iptables -A LOG_PORTSCAN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j LOG_PORTSCAN
# 不正パケット対策
iptables -N LOG_NEWSYNCHECK
iptables -A LOG_NEWSYNCHECK -j LOG --log-prefix '[IPTABLES NEWSYNCHECK] '
iptables -A LOG_NEWSYNCHECK -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG_NEWSYNCHECK
# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP
# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# 確立に成功した tcp 接続は許可
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# Ping 送受信
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# DNS 送信
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
# HTTP, HTTPS, POP3(SSL), IMAP, SMTP(TLS/STARTTLS, SSL), git, hkp 送信
iptables -A OUTPUT -p tcp -m state --state NEW -m multiport --dports 80,443,995,993,587,465,9418,11371 -j ACCEPT
# HTTP, HTTPs 受信
iptables -A INPUT -p tcp -m state --state NEW -m multiport --dport 80,443 -j ACCEPT
# SSH 受信 / ブルートフォース攻撃対策
# sshd_config ファイルの中からポート番号を指定している箇所を探す
SSHD_LISTEN_PORT=`sed -e 's/^Port\s\+\([0-9]\+\)/\1/p' -e d $MY_SSHD_CONFIG`
iptables -N LOG_SSHBRUTEFORCE
iptables -A LOG_SSHBRUTEFORCE -m limit --limit 3/min --limit-burst 4 -j ACCEPT
iptables -A LOG_SSHBRUTEFORCE -j LOG --log-level info --log-prefix '[IPTABLES SSHBRUTEFORCE] '
iptables -A LOG_SSHBRUTEFORCE -j DROP
iptables -A INPUT -p tcp -m state --state NEW --dport $SSHD_LISTEN_PORT -j LOG_SSHBRUTEFORCE
# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
for ip in `cat /root/deny_ip`
do
iptables -I INPUT -s $ip -j DROP
done
fi
# 上記のルールにマッチしなかったアクセスで外部からのものはログを記録(その後自動的に破棄)
iptables -A INPUT ! -s $LOCALNET -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES NOMATCHINPUT] '
WebサーバへのアクセスをすべてHTTPSで通信するように設定する。
$ cd /var/www
$ sudo vim .htaccess
以下追加項目
SSLRequireSSL
これでwww以下へのアクセスはすべてHTTPSで行われる。apache.confなどに記述されている
AllowOverride none を
AllowOverride All に変更する
例:
<directory /var/www/>
Options FollowSymLinks MultiViews
AllowOverride none
</Directory>
↓
<directory /var/www/>
Options FollowSymLinks MultiViews
AllowOverride All
</Directory>
あとはapache再起動で設定完了!
httpでアクセスすると403エラーがでるようになる。
外部から安全にアクセスするために,SSLを使ってHTTPSでの暗号化通信を導入します(`・ω・´)
まず,SSLを使用するためにopensslをインストールします。(apacheが入っている前提で話を進めます
$ sudo apt-get update
$ sudo apt-get install openssl
インストールできたら,opensslを使って自己証明書と鍵を作っていきます。
作業するフォルダに移動して,ルートになっておきます。
$ mkdir /etc/apache2/ssl
$ cd /etc/apache2/ssl
$ sudo su
ここから,コマンド実行後に入力項目があるので,適宜入力していきます。# openssl genrsa -aes128 1024 > server.key
以下表示内容
Generating RSA private key, 1024 bit long modulus
......................++++++
..++++++
e is 65537 (0x10001)
Enter pass phrase: [パスワード入力]
Verifying - Enter pass phrase: [パスワード入力]
# openssl req -new -key server.key > server.csr
以下表示内容
Enter pass phrase for server.key: [さっき入力したパスワード]
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: [てきとーに入力:JP]
State or Province Name (full name) [Some-State]: [てきとーに入力:Nara]
Locality Name (eg, city) []: [てきとーに入力:Nara-Shi]
Organization Name (eg, company) [Internet Widgits Pty Ltd]: [てきとーに入力:Connecting The Dots]
Organizational Unit Name (eg, section) []: [てきとーに入力:]
Common Name (e.g. server FQDN or YOUR name) []: [てきとーに入力:]
Email Address []: [てきとーに入力:]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: [空白]
An optional company name []: [空白]
# openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt
以下表示内容
Signature ok
subject=/C=JP/ST=Nara/L=Nara-Shi/O=Connecting The Dots/CN=
Getting Private key
Enter pass phrase for server.key: [さっき入力したパスワード]
ここまでで,SSLを使用するために必要なファイルを生成することができました。$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/ssl.conf ssl.conf
$ sudo ln -s ../mods-available/ssl.load ssl.load
$ sudo a2enmod ssl
$ cd /etc/apache2/sites-enabled
$ sudo ln -s ../sites-available/default-ssl ssl
以下の内容を/etc/apache2/sites-enabled/sslに追加
<virtualhost _default_:443>
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
</VirtualHost>
$ cd /etc/apache2/ssl
$ sudo su
# mv server.key server.key.back
# openssl rsa -in server.key.back > server.key
以下表示内容
Enter pass phrase for server.key.back: [上で入力したパスワードを入力]
writing RSA key
$ sudo service apache2 restart
で,問題が無ければ完成!!Raspberry Piの初期設定をします(`・ω・´)
細かい説明は抜きで,設定の流れを書いてきますっb
OSのインストールは,Macを使って行なっていきます。
・Raspberry Piと付属するケーブル類
・インストールするOSのイメージ
・キーボード
・OSをインストールするSDカード
・Mac OS Xが動いているPC
・怖いもの知らずな心(失敗するとMacが起動しなくなります。。
Downloads | Raspberry Piから最新版のOSをダウンロード
Raspbian “wheezy”(Debian)とArch Linuxの二種類がありますが,好きな方をどうぞb
私は使い慣れたDebianベースのRaspbianの方で進めます。
まず,OSをインストールするSDカードをフォーマットします。
これは普通にディスクユーティリティを開いて,FATでフォーマットしてあげれば終了です!
ダウンロードしてきたzipファイルを解凍して,isoファイルを取り出して,
ターミナルを開いてゴニョゴニョするとインストールの完了です!!
。。。
しょうじき,めんどくさい。。&失敗するとMacにもダメージが。。
でも大丈夫!便利なツールが公開されています。
その名もRPi-sd card builder!!
これをダウンロードしてきて,実行して,インストールするisoファイルとインストール先のSDを指定してあげれば完了です。
ターミナルを使って,自分でインストールしたい方はここなどを参照
初回起動時にRaspi-configが表示されます。
ここで,以下を選択して,処理を実行します.
(タブと方向キーで移動して,エンターで確定します。
・expand_rootfs
初期設定ではSDカードのごく一部しか使用できないので,すべての領域を使用できるように設定
・configure_keyboard
Generic 105-key (Intl) PC からの Japanese からの Japanese (OADG 109A) でOK
人の好みで変えてください。
・change_pass
初期ユーザ pi のパスワードを設定
・change_timezone
タイムゾーンの設定。Asia からの Tokyo でOK
・ssh
sshを有効にして,ネットワークからのアクセスを許可
で,再起動して,以下のコマンドを実行して完了!
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot
$ sudo raspi-config