在 ArchLinux 製作給 BerryBoot 使用的 ArchLinux Image

因為之前是在 Raspbian 下製作的,但一直沒有成功,想會不會是系統的關係,所以改用 ArchLinux 來製作。

安裝所須套件
# pacman -S squashfs-tools kpartx
error: target not found: kpartx

但發現系統沒有 kpartx 這一個套件,在 Creating Arch Linux disk image – ArchWiki 這一篇中找到了解答,原來 kpartx 是屬於 multipath-tools-git 套件,而且是要以 AUR 的方式來安裝。
[@more@]
AUR 是 Arch User Repository 的縮寫,是由 ArchLinux 社群所維護的套件儲庫,每一個套件都包含 PKGBUILD,讓使用者可以使用 makepkg 指令把程式的始碼編譯成套件。

安裝編譯時所須套件
# pacman -S –needed base-devel
:: There are 25 members in group base-devel:
:: Repository core
   1) autoconf  2) automake  3) binutils  4) bison  5) fakeroot  6) file  7) findutils  8) flex  9) gawk  10) gcc
   11) gettext  12) grep  13) groff  14) gzip  15) libtool  16) m4  17) make  18) pacman  19) patch
   20) pkg-config  21) sed  22) sudo  23) texinfo  24) util-linux  25) which

Enter a selection (default=all):

連線到 AUR (en) – Home:https://aur.archlinux.org/
安裝 wget 來下載 Source Code
# pacman -S wget

安裝編譯 multipath-tools-git 所需套件
# pacman -S setconf

切換到一般使用者身份,因為系統不建議使用 root 身份來進行編譯
# su bananapi

下載 multipath-tools-git
$ wget https://aur.archlinux.org/packages/mu/multipath-tools-git/multipath-tools-git.tar.gz

解壓縮
$ tar xvzf multipath-tools-git.tar.gz

切換目錄
$ cd multipath-tools-git

進行編譯
$ makepkg
==> Tidying install…
  -> Purging unwanted files…
  -> Removing libtool files…
  -> Removing static library files…
  -> Removing empty directories…
  -> Compressing man and info pages…
  -> Stripping unneeded symbols from binaries and libraries…
==> Creating package “multipath-tools-git”…
  -> Generating .PKGINFO file…
  -> Generating .MTREE file…
  -> Compressing package…
==> Leaving fakeroot environment.
==> Finished making: multipath-tools-git 1397.aec68ab-1 (Sat Oct  4 16:48:36 CST 2014)

切換回 root 身份
$ exit

安裝 multipath-tools-git
# pacman -U /home/bananapi/multipath-tools-git/multipath-tools-git-1397.aec68ab-1-armv7h.pkg.tar.xz

# which kpartx
/usr/bin/kpartx

重新在 AcrhLinux 上製作給 BerryBoot 使用的 Image,還是失敗

不知道是什麼原因,但只好暫且先放棄了!

製作給 BerryBoot 使用的 ArchLinux – 失敗篇

原本以為在 BerryBoot 中使用的 Image 檔的製作方式都是一樣,所以製作了 Raspbian / Lubuntu / Bananian / ArchLinux,在測試時,前三者都沒有問題,唯獨 ArchLinux 有問題,後來使用 Google 在網路上搜尋了一下,發現好像 ArchLinux 的製作方式有些不一樣。
參考網頁:
‪Arch Linux ARM • View topic – Installation problems with BerryBoot
‪Convert other Linux distributions for Berryboot – Developer-Blog
‪Raspberry Pi • View topic – rPi, BerryBoot, ArchLinux (2 out of 3 ain’t bad!)

底下是重新製作的方式:[@more@]

kpartx 使用參數
$ kpartx
usage : kpartx [-a|-d|-l] [-f] [-v] wholedisk
    -a add partition devmappings
    -r devmappings will be readonly
    -d del partition devmappings
    -u update partition devmappings
    -l list partitions devmappings that would be added by -a
    -p set device name-partition number delimiter
    -g force GUID partition table (GPT)
    -f force devmap create
    -v verbose
    -s sync mode. Don’t return until the partitions are created

將 .img 檔的第二個分割區取出來
$ sudo kpartx -av ArchLinux_For_BananaPi_v2_0.img
add map loop0p1 (253:0): 0 102400 linear /dev/loop0 2048
add map loop0p2 (253:1): 0 7063552 linear /dev/loop0 104448

建立 /mnt/tmp 目錄
$ sudo mkdir /mnt/tmp

將第二個分割區掛載到 /mnt/tmp
$ sudo mount /dev/mapper/loop0p2 /mnt/tmp/

切換目錄到 /mnt/tmp
$ cd /mnt/tmp

刪除 /mnt/tmp/lib 目錄
$ sudo rm lib

搬移 /mnt/tmp/usr/lib 目錄成為 /mnt/tmp/lib 目錄
$ sudo mv usr/lib lib

切換到 /mnt/tmp/usr 目錄
$ cd usr

進行目錄連結
$ sudo ln -s ../lib lib

切換回使用者目錄
$ cd

進行轉換
$ sudo mksquashfs /mnt/tmp/ converted_ArchLinux_image_for_berryboot.img -comp lzo -e lib/modules
Parallel mksquashfs: Using 2 processors
Creating 4.0 filesystem on converted_ArchLinux_image_for_berryboot.img, block size 131072.
[=-                                                                                                                                                                        ]   191/29051   0%

卸載 /mnt/tmp 分割區
$ sudo umount /mnt/tmp
$ sudo rm -rf  /mnt/tmp
$ sudo kpartx -d ArchLinux_For_BananaPi_v2_0.img
loop deleted : /dev/loop0

將製作好的 Image 移到 BerrBoot  的 Image 目錄
$ sudo mv converted_ArchLinux_image_for_berryboot.img /media/berryboot/images/ArchLinux_For_BananaPi_v2_0_Server.img

測試結果:還是失敗

Banana Pi 測試 – Bananian 篇 安裝 OpenVPN Windows Client

OpenVPN 網站:https://openvpn.net/

各個作業系統 Client 端程式下載
[@more@]請依使用的 Windows 是 32/64 來選擇下載的程式
這裡 Windows 7 enterprise x86 為例

按滑鼠二下執行下載下來的軟體

Next 繼續安裝

軟體授權合約,請選擇 I Agree

Next 繼續安裝

Install 開始安裝

選擇 安裝(I)

網路設定中會出多一個網路介面

Next 繼續安裝

Finish 完成安裝

桌面上會出現一個 OpenVPN GUI 圖示

將在 Banana Pi 製作的 Client key 下載下來,可以利用 WinSCP or FileZilla
共有 capi.crt / banana.crt / banana.key
三個檔案複製到 C:Program FilesOpenVPNconfig 目錄之下
如果是 x86_64 的 Windows 作業系統則在
C:Program Files (x86)OpenVPNconfig 目錄之下

C:Program FilesOpenVPNconfig 目錄之下建立一個 .ovpn 的設定檔
bananapi.ovpn
client
dev tun
proto tcp
remote Your’OpenVPNServer 34567
resolv-retry infinite
nobind
persist-key
persist-tun
ca capi.crt
cert banana.crt
key banana.key
ns-cert-type server
cipher AES-256-CBC
comp-lzo
verb 3

執行桌面上的 OpenVPN GUI

1. 滑鼠左鍵按一下,以顯示隱藏的圖示
2. 在 OpenVPN GUI 上按滑鼠右鍵
3. 選擇 連接

連線畫面

連線成功會分配到一個 10.8.0.x 的 IP,也會顯示綠色

使用 IP Chicken 來檢查對外的 IP

原本的 IP 140.111.x.x

使用 VPN 後的 IP 111.249.x.x

BerryBoot – 使用 Image 來安裝系統

本來一直以為 BerryBoot 只能從網路上下載作業系統來安裝而已,而在 10/1(三)  下午與 Banana Pi  的開發工程師討論過,才發現原來 BerryBoot 的功能非常強大,可以將原本系統的 Image 檔,直接拿來使用,一張記憶卡可以安裝多種作業系統,而且系統有問題,只要修改或刪除在  data 目錄之下相對應的作業系統名稱即可,如果要測試系統,就會非常的方便。
原本一直以為直接將 Image 檔,直接放置到  image 目錄即可,但結果是只能在 BerryBoot 的開機功能表中出現,卻無法開機,所以在網路上找了一下,發現 Image 檔案要轉換過才能正常使用。
參考網站:
‪葉難: Raspberry Pi使用BerryBoot多重開機
‪How to Multi-Boot Your Raspberry Pi with BerryBoot

底下是在 Banana Pi Raspbian  下進行操作
切換到 BerryBoot 所在的目錄(另外一張記憶卡)
$ cd /media/berryboot

切換到存放各系統的目錄
$ cd images

下載系統的 Image 來進行轉換
$ sudo wget ftp://140.111.74.109/BananaPi/Raspbian_For_BananaPi_v3.1.tgz

解壓縮
$ sudo tar xvzf Raspbian_For_BananaPi_v3.1.tgz

安裝所須套件
$ sudo apt-get install kpartx squashfs-tools
[@more@]
將 .img 檔的第二個分割區取出來
$ sudo kpartx -av Raspbian_For_BananaPi_v3_1.img
add map loop0p1 (253:0): 0 114688 linear /dev/loop0 8192
add map loop0p2 (253:1): 0 7045120 linear /dev/loop0 122880

$ sudo mount /dev/mapper/loop0p2 /mnt
/mnt/etc/fstab 中的 /dev/mmcblk 前面加上 #
$ sudo sed -i ‘s/^/dev/mmcblk/#/g’ /mnt/etc/fstab

進行轉換
把 .img 的第二個分割區抓出來並變成 SquashFS 格式(BerryBoot 支援的格式)
$ sudo mksquashfs /mnt converted_image_for_berryboot.img -comp lzo -e lib/modules
Parallel mksquashfs: Using 2 processors
Creating 4.0 filesystem on converted_image_for_berryboot.img, block size 131072.
[==-                                                                                                                                       ]  1538/76511   2%

卸載 /mnt 分割區
$
sudo umount /mnt
$ sudo kpartx -d Raspbian_For_BananaPi_v3_1.img

刪除 Raspbian_For_BananaPi_v3_1.img
$ sudo rm -rf  Raspbian_For_BananaPi_v3_1.img

將轉換後的檔名改名
$ sudo mv converted_image_for_berryboot.img Raspbian_For_BananaPi_v3_1.img

將 Banana Pi 的 Raspbian 關機後,更換記憶卡,改用 BerryBoot 記憶卡開機,就可以看到成果了!
如果要加入其它的作業系統,再重複上面的步驟即可!

Banana Pi 測試 – Bananian 篇 安裝 OpenVPN Server

底下文章參考:
Raspberry Pi • View topic – [How to] Dynamic DNS and Openvpn server
chen: 安裝OpenVpn For Raspberry PI 的步驟
利用Raspberry Pi建立VPN server – TakoBear

安裝 OpenVPN
# apt-get install openvpn

建立目錄
# mkdir /etc/openvpn/easy-rsa/[@more@]
複製範例的設定檔到 /etc/openvpn/easy-rsa 目錄
# cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

將 KEY_SIZE 的長度由 1024 改成 204,增加憑證難度
# sed -i ‘s/KEY_SIZE=1024/KEY_SIZE=2048/’ /etc/openvpn/easy-rsa/vars

修改憑證預設資訊
# sed -i ‘s/KEY_COUNTRY=”US”/KEY_COUNTRY=”TW”/’ /etc/openvpn/easy-rsa/vars
# sed -i ‘s/KEY_PROVINCE=”CA”/KEY_PROVINCE=”Taiwan”/’ /etc/openvpn/easy-rsa/vars
# sed -i ‘s/KEY_CITY=”SanFrancisco”/KEY_CITY=”E-Land”/’ /etc/openvpn/easy-rsa/vars
# sed -i ‘s/KEY_ORG=”Fort-Funston”/KEY_ORG=”Home”/’ /etc/openvpn/easy-rsa/vars

切換目錄
# cd /etc/openvpn/easy-rsa

開始建立憑證
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

清空舊有憑證
# ./clean-all

建立所需憑證
# ./build-ca
# ./build-key-server bananapi
# ./build-dh
# ./build-key banana

將 tls.key 移到 keys 資料夾下
# mv ./tls.key ./keys/

切換到 /etc/openvpn/easy-rsa/keys 目錄
# cd /etc/openvpn/easy-rsa/keys

複製 Server 端的檔案到 /etc/openvpn
# cp ca.crt ca.key dh2048.pem bananapi.crt bananapi.key /etc/openvpn

建立用來存放 Client 端所須檔案的目錄
# mkdir $HOME/openvpn-client-files
複製 Client 端所須檔案
# cp ca.crt banana.crt banana.key $HOME/openvpn-client-files

更改檔案名稱
# mv $HOME/openvpn-client-files/ca.crt $HOME/openvpn-client-files/capi.crt
更改檔案權限
# chmod +r $HOME/openvpn-client-files/banana.key

建立 /etc/openvpn/server.conf 設定檔
# vim /etc/openvpn/server.conf
port 34567
proto tcp
dev tun
;; Key File 設定
dh /etc/openvpn/dh2048.pem
ca /etc/openvpn/ca.crt
cert /etc/openvpn/bananapi.crt
key /etc/openvpn/bananapi.key
;; vpn 使用網段
server 10.8.0.0 255.255.255.0
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
;; 允許 client 間互相連接
;client-to-client
push “redirect-gateway def1”
;; DNS 設定
push “dhcp-option DNS 168.95.1.1”
push “dhcp-option DNS 140.111.66.1”
keepalive 5 30
;; 最大使用者量
max-clients 12

防火牆上的設定,如果原本就有防火牆,就要將規則個整合
# vim /etc/firewall.vpn
#!/bin/bash
# Enable ip_forward
echo “1” > /proc/sys/net/ipv4/ip_forward
iptables -t filter -F
iptables -t nat -F
iptables -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s “10.8.0.0/24” -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s “10.8.0.0/24” -j MASQUERADE

更改檔案權限
# chmod 700 /etc/firewall.vpn

設定開機時執行
/etc/rc.local 最後一行 exit 0 之前加入 sh /etc/firewall.vpn
# sed -i ‘/^exit 0/ish /etc/firewall.vpn’ /etc/rc.local

測試 OpenVPN 是否能正常執行
# /etc/init.d/openvpn start
[ ok ] Starting virtual private network daemon: server.

# netstat -antp | grep 34567
tcp        0      0 0.0.0.0:34567           0.0.0.0:*               LISTEN      3617/openvpn

tun0 介面資訊
# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Banana Pi 測試 – Bananian 篇 更換 root 使用的 shell

Bananian 系統中的 Debian 7 root 預設的 shell 是使用 zsh,目前使用的 Linux 大部分都是使用 bash 當作是預設的 shell,所以之前也是習慣使用 bash。
在網路上搜尋了一下 zsh,可以找到相關的介紹:
Z Shell (zsh) 的特色與安裝

不過真正好好使用了一下子,發現我還是不太習慣,所以就決定將預設的 shell 換成 bash 了。
更換方式
# chsh -s /bin/bash

更換前
# grep root /etc/passwd
root:x:0:0:root:/root:/bin/zsh

更換後
# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

重新登出再行登入後即可生效!

Banana Pi 測試 – Bananian 篇 安裝 fail2ban

因為是測試及可能對外服務的系統,所以無法設定太嚴格的防火牆規則,所以加裝了 fail2ban 來加強系統的安全。
# apt-get install fail2ban

修改設定檔
# vim /etc/fail2ban/jail.conf
[ssh]

enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
bantime  = 86400
[@more@]
重新啟動 fail2ban 服務
# /etc/init.d/fail2ban restart
[ ok ] Restarting authentication failure monitor: fail2ban.

檢查 fail2ban 的狀態
# fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:           ssh

以 Client  IP 192.168.1.1 嘗試對 Server IP 192.168.1.109 嘗試連線錯誤幾次之後
列出 fail2ban 偵測到的 SSH 攻擊
# fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list:        /var/log/auth.log
|  |- Currently failed: 1
|  `- Total failed:     1
`- action
   |- Currently banned: 1
   |  `- IP list:       192.168.1.1
   `- Total banned:     1

列出 fail2ban-ssh 的規則
# iptables -t filter -L fail2ban-ssh -n
Chain fail2ban-ssh (1 references)
target     prot opt source               destination
DROP       all  —  192.168.1.1          0.0.0.0/0
RETURN     all  —  0.0.0.0/0            0.0.0.0/0

解除方式:
# iptables -D fail2ban-ssh  -s 192.168.1.1 -j DROP

運作一段時間後,看一下成果:
# iptables -t filter -L fail2ban-ssh -n
Chain fail2ban-ssh (1 references)
target     prot opt source               destination
DROP       all  —  61.174.51.211        0.0.0.0/0
DROP       all  —  122.225.109.100      0.0.0.0/0
DROP       all  —  61.174.51.215        0.0.0.0/0
RETURN     all  —  0.0.0.0/0            0.0.0.0/0

Banana Pi 測試 – Bananian 篇 iptables 防火牆

為了系統的安全,所以加上了 iptables 防火牆規則,主要是參考 ols3 的防火牆規則。

# vim /etc/firewall.server[@more@]#! /bin/bash
#
# $IPTABLES 範本
# written by OLS3 (ols3@lxer.idv.tw)
#
# 請自行參考修改,把註解拿掉即可啟用該項設定
#

###—————————————————–###
# 設定 $IPTABLES 的路徑
###—————————————————–###
echo “Set path of iptables”
echo

IPTABLES=”/sbin/iptables”

#載入相關模組
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp

###—————————————————–###
# 外部網段 IP 及介面
###—————————————————–###
echo “Set external ……”
echo

#FW_IP=”192.168.1.1″
#FW_IP_RANGE=”192.168.1.0/24″
FW_IFACE=”ppp0″

# loopback interface
LO_IFACE=”lo”
LO_IP=”127.0.0.1″

## 設定核心的安全相關參數
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 3 > /proc/sys/net/ipv4/tcp_retries1
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1400 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps

###—————————————————–###
# 清除先前的設定
###—————————————————–###
echo “Flush fiter table ……”
echo

# Flush filter
$IPTABLES -F
$IPTABLES -X

echo “Flush mangle table ……”
echo
# Flush mangle
$IPTABLES -F -t mangle
$IPTABLES -t mangle -X

echo “Flush nat table ……”
echo
# Flush nat
$IPTABLES -F -t nat
$IPTABLES -t nat -X

###—————————————————–###
# 設定 filter table 的預設政策
###—————————————————–###
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

# 允許流經 lookback 介面的封包進出
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# 阻可疑封包
$IPTABLES -A INPUT -i $FW_IFACE -m state –state INVALID -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp ! –syn -m state –state NEW -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ALL NONE -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags FIN,RST FIN,RST -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ACK,FIN FIN -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ACK,URG URG -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ACK,PSH PSH -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ALL ALL -j DROP
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –tcp-flags ALL FIN -j DROP

# 允許已建立連線和回應的封包通過
$IPTABLES -A INPUT -i eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $FW_IFACE -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $FW_IFACE -m state –state ESTABLISHED,RELATED -j ACCEPT

# 開放本機的 ssh port 22 服務
$IPTABLES -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –dport 22 -j ACCEPT

# 開放本機的 http port 80 服務
$IPTABLES -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –dport 80 -j ACCEPT

# 開放本機的 https port 443 服務
$IPTABLES -A INPUT -i eth0 -p tcp –dport 443 -j ACCEPT
$IPTABLES -A INPUT -i $FW_IFACE -p tcp –dport 443 -j ACCEPT

$IPTABLES -A INPUT -p icmp -s 0/0 –icmp-type 8 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 0/0 –icmp-type 0 -j ACCEPT

更改檔案權限
# chmod 700 /etc/firewall.server

設定開機時執行
/etc/rc.local 最後一行 exit 0 之前加入 sh /etc/firewall.server
# sed -i ‘/^exit 0/ish /etc/firewall.server’ /etc/rc.local