OpenVPN

Arch LinuxのVPSにVPN serverを構築して、VPN Proxyを自前でつくった。
SoftEtherも構築が簡単そうで、スループットも期待できそうだが、pacmanで管理できないパッケージは、Arch Linuxらしくないと考えてあきらめた。
公式 Arch リポジトリにあるVPNのパッケージは、OpenVPNとStrongSwanしかないので、資料がそろっているOpenVPNを選択した。
pacman -S openvpn easy-rsa
本来は、別に認証局が必要だが、easy-rsaを使って、サーバで一気に作成。
パスフレーズは入力が必要だが、Common Nameの入力はENTERで省略できる。
cd /etc/easy-rsa
easyrsa init-pki
easyrsa biuild-ca
easyrsa gen-dh
openvpn –genkey –secret ./pki/ta.key
easyrsa build-server-full server nopass
easyrsa build-client-full client nopass

後は作成したファイルをサーバとクライアントのディレクトリにコピー。
また、サーバの設定ファイルもコピーする。
mv pki/dh.pem pki/dh2048.pem
cp ca.crt ta.key dh.pem private/server.key issued/server.crt /etc/openvpn/server
cp ca.crt ta.key private/client.key issued/client.crt /etc/openvpn/client

設定ファイルをルーティング方式に設定して、起動設定。

cd /etc/openvpn/server
cp /usr/share/openvpn/examples/server.conf ./srv.conf
vi srv.conf
systemctl start openvpn-server@srv
systemctl enable openvpn-server@srv

/etc/open/vpn/server/srv.confの設定例

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 8.8.8.8”
push “dhcp-option DNS 8.8.4.4”
duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0 # This file is secret
comp-lzo adaptive
push “comp-lzo yes”
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/status.log
log /var/log/openvpn/vpn.log
verb 4
mute 20
explicit-exit-notify 1

/etc/iptables/iptables.rulesの設定に以下を加える。
iptables -A INPUT -p udp -m udp –dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A INPUT -p udp -m udp –dport 1194 -j ACCEPT

systemctl reload iptables
これで、サーバの設定は終了。

andoroidのクライアントは、OpenVPN ConnectをPlayストアからインストール。
その後は、証明書と鍵をインラインで記載したoovpnファイルを読み込ませて接続できる。
ovpn fileの例
インライン作成は,, , , のタグで囲む。
tls-authディレクティブの代わりに,key-direction 1を記載する。

client
dev tun
proto udp
remote domain.name.com 1194

resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verb 3
#tls-auth
key-direction 1
mute 10

—–BEGIN CERTIFICATE—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END CERTIFICATE—–

—–BEGIN CERTIFICATE—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END CERTIFICATE—–

—–BEGIN PRIVATE KEY—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END PRIVATE KEY—–

—–BEGIN OpenVPN Static key V1—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END OpenVPN Static key V1—–

これでよいのだが、注意として,Chromeのdata savingオプションはオフにしておくこと。
そうしないと、IPがgoogle USAのIPに固定されてしまうので,VPN proxyの意味がない。
また,Playストアのregion情報は起動時しないと更新されないようなので,
VPNを接続した後に,設定!アプリで、Playストアを一度Force stopしてから、再起動する。

暗号のdefaultはbf-cbcで非推奨だが、接続後にaes-256-gcmにアップグレードされる。
# openvpn -show-ciphers

statusとlogは、標準の/etc/openvpn/severから、/var/log/openvpnに移す。ファイル名は、systemd-escapeで、エスケープ処理されているようなので、/の代わりに-が使用できる。

android clientでは、fragment未サポート

2019/10/13
標準の1194 udpの場合、中国から繋がりにくい。TLS errorが起こっているので、great firewallの影響か。ポートを変更したら改善した。

iptables

Conohaは、コントロールパネルに接続許可ポートが設定できるので、iptablesの設定をサボっていたが、必要に迫られて設定する。
基本インストールで、iptablesパッケージは設定されているので、ルールを設定して、サービスを起動するだけ。
cd /etc/iptables
cp simple_firewall.rules iptables.rules
systemctl start iptables
systemctl status iptables
iptables -L
systemctl enable iptables
vi iptables.rules
systemctl reload iptables

確認は、nmapでおこなうとよいが、localhostからのアクセスはオープンにしていることが多いので、外部からの状態の確認は、https://www.cman.jp/network/support/port.htmlなどの外部サービスを利用するしかない。
また、DHCPサーバーサービスの確認は、-sUのオプションが必要。
pacman -S nmap
nmap localhost ; scan tcp only
nmap -sU localhost; scan udp only

# ss -atunp; 使用中のtcpとutpポートを数字でプロセス名と表示
# pacman -S lsof; lsof -i -n -P; 使用中のプロセスを表示
これらで、不要なサービスを止める。

Strongswanの設定

Strongswanを設定してみた。
結論からいうと、スループットは、OpenVPNより少しよいが、動画視聴などでは劇的にはかわらない。
サーバーの設定をすれば、クライアント側の設定が不要で、Windows 7では、接続に追加ソフトが不要。

まずは、wikiのとおりに証明書を作成する。
https://wiki.archlinux.jp/index.php/StrongSwan
次に、ipsec.confとipsec.secretsを設定。
ipsec.confで、ikeを設定しなくとも、androidは接続できるが、windows 7は接続できない。
両者で、暗号の提案が違う。
/etc/ipsec.conf

config setup

uniquids=never
charondebug=”cfg2, dmn 2, ike 2, net2″

conn %default

ikelifetime=24h
keylife=24h
kyexchange=ikev2
ike=aes128-sha1-modp4096,aes256-sha256-modp1024!
dpdaction=clear
dpdtimeout=300s
dpddelay=300s
compress=yes
rekey=no

conn IKEv2

left=%any
leftsubnet=0.0.0.0/0
leftauth=pubkey
leftcert=vpnHostCert.pem
leftfirewall=yes
right=%any
rightsourceip=192.168.10.0./24
rightauht=pubkey
rigthcert=ClientCert.pem
rightfirwall=yes
auto=add

/etc/ipsec.secrets

: RSA vpnHostKey.pem

/etc/strongswan.d/charon-logging.confを編集して、ログファイルを設定。

iptablesで、500と4500のポート、espのacceptとnatを設定する。
systemctl start strongswan-starter
systemctl enable strongswan-starter
以上でサーバは終了。

androidは、strongSwan VPN Clientをインストールし、IKEv2 Certificateを選び、Clinet.p12を読み込むと設定終了。

windows 7では証明書のインストールが必要なので、C:\Windows\System32\mmc.exeを管理者として起動。
ファイル、スナップインの追加と削除、証明書を追加、コンピュータアカウントを選択。
Clinet.p12を個人に証明書を追加。ルート証明書を信頼されたルート証明機関に移動。
あとは、ネットワークと共有センターでVPNを作成し、セキュリティで、IKEv2を選択し、認証でコンピュータの証明書を使うを選ぶ。

WindowsでVPNに接続できても、ゲートウェイアドレスが設定されないために使えないことがある。”リモートネットワークでデフォルトゲートウェイを使う”のチェックが抜けているためであった。

中国からgoogleサイトにアクセスするためには、DNSの追加が必要。rightdns=8.8.8.8,8.8.4.4

サーバの認証だけでよい場合は、標準ディレクトリからlet’s encryptの証明書にリンクを貼る。認証局証明書、サーバ証明書、サーバ秘密鍵の3つだけが必要で、サーバ証明書に認証局証明書を加えたfullchain.pemは不要。この方法だと、クライアントにルート認証局証明書を追加する必要がない。
# ln -s /etc/letsenrypt/live/domain/chain.pem /etc/ipsec.d/cacerts
# ln -s /etc/letsenrypt/live/domain/cert.pem /etc/ipsec.d/certs/cert.pem
# ln -s /etc/letsenrypt/live/domain/privkey.pem /etc/ipsec.d/private/privkey.pem

# ipsec statusall
# ipsec status
# ip xfrm status

壁を越えて

中国のgreat firewall対策が必要になりそうだ。
最近はVPNだけでは、だめそうなので、Shadowsocks を導入してみる。

arch linuxだと、パッケージがあるので、簡単。
# pacman -S shadwosocks
# cd /etc/shadowsocks
# cp example.json config.json
# vi config.json
; “server”はデフォルトの0.0.0.0でよいので、その行は削除。
; “password”にパスワードを設定。
; 必要に応じて、サーバポートを変更する。
# chmod go-r config.json
; 平文パスワードを含むので、読み出し禁止にしておく。
# vi /etc/iptables/iptables.rules
; サーバの使用ポートを許可する。
# ssserver -c /etc/shadowcsocks/config.json
; これでテスト。sserverはケロベロスのサーバなので注意。

デーモンとして実行するためには、
# mkdir /etc/systemd/system
# cd /etc/systemd/system
# cat > start-as-root.conf
[Service]
User=root
# systemctl start shadowsocks-server@config
# systemctl status shadowsocks-server@config
# systemctl enable shadowsocks-server@config
VPNではなく、proxyなので通信速度は速い。
# pacman -S libsodium
暗号をchacha20にした方が早いので、パッケージを追加して、”method”を変更する。

windowsだと、https://shadowsocks.org/en/download/clients.htmlからクライアントをダウンロードする。
実行すると、インジケータ(通知領域)にアイコンが表示される。右クリックしてシステムプロキシを有効にして、モードを全般を選択する。
ヘルプの項目に、ログの表示があるので、確認する。
最初の起動時にサーバーの編集が開かれるので、アドレス、ポート、パスワードを設定する。編集する場合は、サーバーの項目にサーバーの編集でできる。

アンドロイドの方は、shadowsocksのアプリを導入して、プロファイルを変更する。サーバの設定は、”fast_open”はfalseの方が早いように思われる。

2019/9/26
SSだと1〜2日でブロックされるので、ポート変更が必要になる。ポート変更していたら、数日でipがブロックされた。
SSRは偽装設定するといまのところブロックされない。
open-vpnはなぜか繋がりにくいが使える。StrongSwanのIKE2は普通に使える。

let’s encryptの定期更新

Arch Linuxでは、標準ではcronがインストールされていない。
cronieまたはfcronをインストールすればよいが、標準にしたがって、timerで、let’s encryptの定期更新。

# cd /etc/systemd/system
# vi certbot.timer
[Unit]
Description=Run certbot on 2nd day bimonthly
[Timer]
OnCalendar=*-01,03,05,07,09,11-02 03:00:00
RandomizedDelaySec=60min
Persistent=true
[Install]
WantedBy=timers.target

# vi certbot.service
[Unit]
Description=bimonthly certbot
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew –quiet –agree-tos –max-log-backups 9

# systemctl start certbot.timer
# systemctl status certbot.timer
# systemctl enable certbot.timer
# systemctl list-timers –all

ログは、logrotateではなく自前で管理しており、 /var/log/letsencrypt/に1000までログができるので、オプションで制限する。
ヘルプ表示は、certbot -h all。
強制実行で確認する。
# systemctl start certbot.service

3か月前には更新できたcertbot renewで以下のエラーが発生する。
Attempting to renew cert (domain.name.com ) from /etc/letsencrypt/renewal/domain.name.com.conf produced an unexpected error: Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/domain.name.com/fullchain.pem (failure)

解決のために、/etc/httpd/conf/extra/httpd-vhosts.confを編集して、以下を追加。
<VirtualHost:80>
ServerName domain.name.com
</VirtualHost>

/etc/httpd/conf/httpd.confを編集して、rewriteモジュールをコメントアウト。
LoadModule rewrite_module modules/mod_rewrite.so

# httpd -t ; syntax check
# systemctl restart httpd
# certbot renew –dry-run; 動作確認
# stemctl daemon-reload; ファイルを修正した場合

shadowsocks-libev

shadowsocksのインストールは簡単だが、obfsを使えない。shadowsocksRは標準パッケージがない。
libev+simple-obfsに挑戦。

# pacman -S shadowsocks-libev simple-obfs

サービスファイルを作成
# cat > /etc/systemd/system/shadowsocks-libev.service
[Unit]
Description=Shadowsocks-libev Default Server Service
Documentation=man:shadowsocks-libev(8)
After=network.target
[Service]
Type=simpleEnvironment
File=/etc/sysconfig/shadowsocks-libev
User=nobody
Group=nobody
LimitNOFILE=32768
ExecStart=/usr/bin/ss-server -c /etc/shadowsocks-libev/config.json
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target

設定ファイルを作成
# mkdir /etc/shadowsocks
# cat > /etc/shadowsocks-libev/config.json
{
“server”:”0.0.0.0″,
“server_port”:8388,
“local_port”:1080,
“password”:”passpass”,
“timeout”:300,
“method”:”chacha20-ietf”,
“plugin”: “obfs-server”,
“plugin_opts”: “obfs=tls”
}

サービスファイルを修正したら、リロード
# systemctl daemon-reload
# systemctl start shadowsocks-libev
# systemctl enable shadowsocks-libev

アンドロイドのクライアントをインストール
Shadowsocks offered by Max Lv
Simple Obfuscation offered by Max Lv

strongswanのユニット変更

なぜか、突然、strongswanが接続できなくなった。
no IKE config found for xx.xx.xx…xx.xx.xx.xx, sending NO_PROPOSAL_CHOSEN
[IKE] received NO_PROPOSAL_CHOSEN notify error

暗号形式が一致しない??
以下のサイトによると、5.8.0からユニットが変更されたので、/etc/ipsec.confがなんと読み込まれないらしい。
https://chitoku.jp/computers/strongswan-swanctl-migration

とりあえず、Legacy unitに変更して解決。
# systemctl stop strongswan
# systemctl disable strongswan
# systemctl start strongswan-starter
# systemctl enable strongswan-starter

今回、ログの勉強になった。
# journalctl -b

auditのパーミッション

# pacman -Syuのアップデートで、/var/log/auditのパーミッションエラーとなった。
warning: directory permissions differ on /var/log/audit/
filesystem: 755 package: 700
パーミッションは755になっているが、700にしろと丁寧に表示されているので、変更して解決。
# chmod 700 /var/log/audit
# ls -ld /var/log/audit

pacmanとexpacなど

いろいろ設定していたら,変更したファイルがわからなくなった。
pacman -Qii | grep ^MODIFIEDで設定を変更したファイルがわかる。
パッケージのファイルを抽出する場合,tarを使えばよいのだが,
tar: Ignoring unknown extended header keyword ‘SCHILY.fflags’の警告がでる。
気持ちがよくないので,pacman -S libarchiveでbsdtarをインストールする。
# bsdtar tvf /var/cache/pacman/pkg/package* *file.conf
目的のファイルを確認する。
# bsdtar xOf /var/cache/pacman/pkg/package* etc/dirname/file.conf > orig.conf
目的ファイルを標準出力。復元するときは、属性等が必要なのでxで抽出。
diff -y –suppress-common-lines file.conf orig.confで変更点が確認できる。

パーケージリストだけなら、以下で簡単に表示される、。
# pacman -Qe

expacをインストールすると、以下のように、最近インストールしたパッケージの表示ができるので、便利。
# expac -t ‘%Y-%m-%d %T’ ‘%l\t%w\t%n’ | sort | tail -n 20

pkgfileもパッケージ内容が確認できて、検索できるので便利。
検索前に、pkgfile -uでデータベースを更新しなければならないが、自動更新のためのタイマーが付属しているので、セットすると毎日自動更新してくれる。
# systemctl start pkfile-update.timer
# systemctl enable pkgfile-update.timer

Arch Linux MBR+BIOS編

ARCHを久々にインストール。今回は、MBRのパーティションにセットアップ。
インストールガイドどおりで問題ないのだが、ブートローダーにsyslinuxを使用したので、嵌ってしまった。
ISOをダウンロードしたら、DDWinでUSBに書込み。
USBから起動したら、インストールするパーティションを、”fdisk -l”で確認したら、ext4でフォーマット。
mkfs.ext4 -O \^64bin /dev/sdxx
ここで、64bitオプションを無効にしておかないと、syslinuxの起動の時に、”Failed to load ldlinux.c32″でエラー終了する。
あとは簡単。
“wifi-menu”で無線LANに接続したら、”ping www.yahoo.com”でインターネットアクセスを確認。
mount /dev/sdxx /mnt
pacstrap /mnt base base-devel
genfstab -U /mnt >> /mnt/etc/fstab
arch-chroot /mnt
“vi /etc/locale.gen”で、en_US.UTF-8とja_JP.UTF-8をコメントアウトして
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf
# echo hname > /etc/hostname,再起動時のホスト名を設定。
# hostname hname; 現在のホスト名を変更。
vi /etc/hosts
pacman -S syslinux
syslinux-install_update -ima
vi /boot/syslinux/syslinux.cfg
wifi-menuのために、”pacman -S dialog wpa_supplicant”を導入しておく。
exit
reboot
wifi-menuで無線LANに接続したら、次回から自動化のために
pacman -S wpa_actiondを導入。
ip linkでポートの確認
systemctl enable netctl-auto@wlp3s0でセット。
vi /etc/pacman.confで,Colorのコメントを外すと表示がわかりやすい。
その他、pacman -S pkgfileを導入して、pkgfile -uで更新。
その後、pkgfile arch-chrootで検索して、pacman -S arh-install-scriptsをレスキュー用に導入しておく。
pacman -S sudoも入れたら、visudoで、%wheel ALL=(ALL) ALLを追加(コメントアウト)。
useradd -m -G wheel xxxで常用アカウントを追加するが,固有のグループを作らないときは,-g wheel。
# gpasswd -a user group //後から追加する場合
pacman -S bind-toolsで,digとhostをインストール。

syslinuxは昔から慣れていたのだが,どうも最近は更新がない様子。