- 投稿日:2020-07-06T23:13:00+09:00
iptablesを使ってWebサーバをポートフォワーディング
概要
Linuxで、あるwebサーバの「ホスト名:ポート番号」を「別のホスト:ポート番号」へ転送(つまりポートフォワーディング)する方法について記載。実現にはCentOSやUbuntu等に標準搭載されている「iptables」を利用。
今回紹介する内容は、おそらくCentOS7以降にデフォルトで入っているfirewalldなどでも実現できるが、極力環境に依存せずにポートフォワーディングする方法を模索した結果、iptablesを使うことにした。
iptableでのポートフォワーディング方法を紹介する記事はそれなりにあるが、それらの方法を素直に試しても上手くいかず、実現までにかなりハマったので本記事で改めてまとめる。
今回動作を確認したのはhttp(https)のプロトコルのみだが、TCP通信であれば他のプロトコル(ssh,ftpなど)でも動くはず。実現したい構成
- webサーバ(転送先)のIPアドレスは
23.45.67.89
、ポートは80
- ポートフォワーディングの設定を行う転送元サーバのIPアドレスは
192.168.1.4
- クライアントから転送元サーバに
http://192.168.1.4:10080
をリクエストすると、転送元サーバがwebサーバにポートフォワーディングして、http://23.45.67.89:80
のサイトへリクエスト。- リクエスト送信後、webサーバが返すレスポンスをクライアントで閲覧可能
iptablesによる実装
転送元サーバで、以下のコマンドを実行
(1) PREROUTINGチェイン
- クライアント入ってくるリクエストで、宛先のIPアドレスとポートを変換
--dport
: 変換前の宛先ポート番号--to-destination
: 変換後の「宛先IP : ポート番号」$ sudo iptables -t nat -A PREROUTING -p tcp \ --dport 10080 -j DNAT \ --to-destination 23.45.67.89:80(2) POSTROUTINGチェイン
- 転送元サーバから外に出ていくパケットに関する記述
--d
: 変換後のIPアドレス--dport
: 変換後の宛先ポート番号-j MASQUERADE
: IPマスカレードを行う$ sudo iptables -t nat -A POSTROUTING -p tcp \ -d 23.45.67.89 --dport 80 \ -j MASQUERADE(3) FORWARDチェイン
- クライアントから送信したパケットの通過を許可するために必要な記述。
TCP通信の場合、3way-handshakeと呼ばれる方法で双方向通信が行われるため、両方の通信を許可するための設定が必要
- 参考サイト : Linuxで作るファイアウォール[パケットフィルタリング設定編]
「クライアント → webサーバ」へのパケット通過を許可するコマンドが下記
$ sudo iptables -A FORWARD -p tcp \ -d 23.45.67.89 --dport 80 \ -j ACCEPT
- 一方で「webサーバ → クライアント」へのパケット通過を許可するコマンドが下記
- 逆方向の設定なので、webサーバのIPアドレスとポートを記載したオプションが「
-s
: 送信元アドレス」「--sport
: 送信元ポート番号」になっていることに注意- 2行目の記述「
! --syn -m state --state ESTABLISHED
」は特定の条件を満たした通信のみ許可するための記述。セキュリティを気にしなければ省略しても問題ないはず。$ sudo iptables -A FORWARD -p tcp \ ! --syn -m state --state ESTABLISHED \ -s 23.45.67.89 --sport 80 \ -j ACCEPT(4) OUTPUTチェイン
- 転送元サーバからのリクエストもポートフォワーディングしたい場合に記載
- 書き方はチェイン名をOUPUTとする以外は(1)のPREROUTINGと同じ
$ sudo iptables -t nat -A OUTPUT -p tcp \ --dport 10080 -j DNAT \ --to-destination 23.45.67.89:80
- 投稿日:2020-07-06T21:07:58+09:00
Linuxコマンド<基礎1>
Linuxの基礎コマンドを備忘録として記載する。
カーソル移動コマンド
コマンド 内容 Ctrl + b 後方に1文字分移動 Ctrl + f 前方に1文字文移動 Ctrl + a 行頭に移動 Ctrl + e 行末に移動 lsコマンド
ファイルやディレクトリを一覧表示するコマンド
[wataru@localhost ~]$ ls #引数なしの場合は、ファイル、ディレクトリのみが出力される 123.gz diary.sh Downloads head.txt Pictures tmp wc.txt case.sh dir1 echo.sh homesize.sh Public tree.sh Desktop dir1.tar for.sh if.sh Templates Videos diary Documents func.sh Music test.sh[wataru@localhost ~]$ ls -l #-lオプションを使用すると、ファイル属性等の詳細情報も込みで出力される total 64 -rw-rw-r--. 1 wataru wataru 97 Jul 3 20:39 123.gz -rwxrwxr-x. 1 wataru wataru 71 Jun 22 04:52 case.sh drwxr-xr-x. 2 wataru wataru 6 Jun 6 17:30 Desktop drwxrwxr-x. 2 wataru wataru 28 Jun 24 04:46 diary -rwxrwxr-x. 1 wataru wataru 174 Jun 24 04:45 diary.sh drwxrwxr-x. 2 wataru wataru 60 Jul 3 04:28 dir1 -rw-rw-r--. 1 wataru wataru 10240 Jul 3 21:25 dir1.tar#-lオプションで出力された詳細情報の意味は以下となる drwxrwxr-x. 2 wataru wataru 60 Jul 3 04:28 dir1 --------------------------------------------------- d :ファイルタイプ rwxrwxr-x. :ファイルモード 2 :リンク数 wataru :オーナー wataru :グループ 60 :ファイルサイズ Jul 3 04:28 :タイムスタンプ[wataru@localhost ~]$ ls -a #-aオプションを使用すると、隠しファイルも合わせて出力される #ファイル名が「.(ドット)」で始まるファイルを隠しファイルとしている . .cache dir1.tar head.txt Pictures Videos .. case.sh Documents homesize.sh .pki .viminfo 123.gz .config Downloads .ICEauthority Public wc.tar.gz[wataru@localhost ~]$ ls -F #-Fオプションを使用すると、ファイル種別が出力される 123.gz diary.sh* Downloads/ head.txt Pictures/ tmp/ wc.txt case.sh* dir1/ echo.sh* homesize.sh* Public/ tree.sh* Desktop/ dir1.tar for.sh* if.sh* Templates/-Fオプションの種別
種別 記号 通常ファイル なし ディレクトリ / 実行可能ファイル * シンボリックリンク @ pwdコマンド
カレントディレクトリを表示する
[wataru@localhost ~]$ pwd /home/watarucdコマンド
カレントディレクトリを変更する
[wataru@localhost ~]$ cd .. [wataru@localhost home]$ pwd /home [wataru@localhost home]$mkdirコマンド
ディレクトリを作成する
[wataru@localhost tmp]$ ls -l total 0 [wataru@localhost tmp]$ mkdir testdir #mkdirコマンドの後に作成するディレクトリ名を入力する [wataru@localhost tmp]$ ls -l total 0 drwxrwxr-x. 2 wataru wataru 6 Jul 3 22:12 testdir[wataru@localhost tmp]$ mkdir -p work/2020/07 #-pオプションを使用すると、深いディレクトリを一気に作成できる #今回の場合、work ⇒ 2020 ⇒ 07と作成されている [wataru@localhost tmp]$ ls -l total 0 drwxrwxr-x. 2 wataru wataru 6 Jul 3 22:12 testdir drwxrwxr-x. 3 wataru wataru 18 Jul 3 22:16 work [wataru@localhost tmp]$ cd work [wataru@localhost work]$ ls -l total 0 drwxrwxr-x. 3 wataru wataru 16 Jul 3 22:16 2020 [wataru@localhost work]$ cd 2020 [wataru@localhost 2020]$ ls -l total 0 drwxrwxr-x. 2 wataru wataru 6 Jul 3 22:16 07touchコマンド
ファイルを作成する
[wataru@localhost tmp]$ touch ./testdir/work2020.txt #touchでwork2020.txtを作成した [wataru@localhost tmp]$ ls -lF ./testdir/work2020.txt -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:21 ./testdir/work2020.txt[wataru@localhost testdir]$ touch test.{01..10} #一気に複数ファイルを作成することができる #{01..10}はブレース展開という機能 #連番リストを作成できる [wataru@localhost testdir]$ ls -l total 0 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.01 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.02 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.03 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.04 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.05 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.06 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.07 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.08 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.09 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.10 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:21 work2020.txtrmコマンド
ファイル・ディレクトリを削除する
[wataru@localhost testdir]$ ls -l total 0 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.01 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.02 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.03 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.04 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.05 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.06 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.07 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.08 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.09 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.10 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:21 work2020.txt [wataru@localhost testdir]$ rm test.01 test.10 #複数ファイル削除することが出来る #今回の例だと、test.01 test.10を削除した [wataru@localhost testdir]$ ls -l total 0 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.02 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.03 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.04 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.05 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.06 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.07 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.08 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:24 test.09 -rw-rw-r--. 1 wataru wataru 0 Jul 3 22:21 work2020.txt[wataru@localhost tmp]$ ls -l total 0 drwxrwxr-x. 2 wataru wataru 146 Jul 5 03:59 testdir drwxrwxr-x. 3 wataru wataru 18 Jul 3 22:16 work [wataru@localhost tmp]$ rm testdir #rmコマンドでディレクトリを削除すると、エラーが出る #ただ、-rオプションを使用すると、ディレクトリを削除できる #削除対象のディレクトリの中のファイルやディレクトリもまとめて削除される rm: cannot remove 'testdir': Is a directory [wataru@localhost tmp]$ rm -r testdir/ [wataru@localhost tmp]$ ls -l total 0 drwxrwxr-x. 3 wataru wataru 18 Jul 3 22:16 work[wataru@localhost work]$ rm -i work.01.txt #-iオプションを使用すると、削除前の確認をすることができる rm: remove regular empty file 'work.01.txt'? y [wataru@localhost work]$ ls 2020 work.03.txt work.05.txt work.07.txt work.09.txt work.02.txt work.04.txt work.06.txt work.08.txtwataru@localhost tmp]$ ls testGo work [wataru@localhost tmp]$ rmdir testGo/ #rmdirコマンドは空のディレクトリを削除する [wataru@localhost tmp]$ ls workcatコマンド
ファイルを表示する
[wataru@localhost work]$ cat work.02.txt #ファイルの中身が表示される 2020/07/05 test?cat 123445[wataru@localhost work]$ cat -n work.02.txt #-nオプションを使用すると、行番号を付けて内容が表示される 1 2020/07/05 2 test?cat 3 123445 4cpコマンド
ファイルやディレクトリをコピーする
[wataru@localhost work]$ ls testgo work.03.txt work.05.txt work.07.txt work.09.txt work.02.txt work.04.txt work.06.txt work.08.txt [wataru@localhost work]$ cp work.0* testgo #cp <コピー元> <コピー先>でファイルをコピーすることができる #「work.0*」のように「*」指定すると複数のファイルが一気にコピーできる [wataru@localhost work]$ cd testgo/ [wataru@localhost testgo]$ ls work.02.txt work.04.txt work.06.txt work.08.txt work.03.txt work.05.txt work.07.txt work.09.txt[wataru@localhost work]$ cp -i work.0* testgo #-iオプションを使用すると、rmコマンド同様に実行前に確認することができるwataru@localhost work]$ cp gogodur testgo #ディレクトリをコピーすると、エラーとなる cp: -r not specified; omitting directory 'gogodur' [wataru@localhost work]$ cp -r gogodur testgo #-rオプションを使用すると、コピーすることができる [wataru@localhost testgo]$ ls gogodur work.03.txt work.05.txt work.07.txt work.09.txt work.02.txt work.04.txt work.06.txt work.08.txtmvコマンド
ファイルを移動する
[wataru@localhost testgo]$ mv work.03.txt gogodur [wataru@localhost testgo]$ ls gogodur/ work.03.txt [wataru@localhost testgo]$ ls #mvコマンドで移動したファイルは移動元からはなくなる gogodur work.04.txt work.06.txt work.08.txt work.02.txt work.05.txt work.07.txt work.09.txtwataru@localhost testgo]$ ls gogodur work.04.txt work.06.txt work.08.txt work.02.txt work.05.txt work.07.txt work.09.txt [wataru@localhost testgo]$ mv work.04.txt mvfile.txt #mvコマンドで移動元、移動先にファイルを指定すると、 #ファイル名が書き換わる [wataru@localhost testgo]$ ls gogodur work.02.txt work.06.txt work.08.txt mvfile.txt work.05.txt work.07.txt work.09.txt#lnコマンド
リンクを張る(ファイルに別名を付ける)
長いパス名を省略することもできるwataru@localhost testgo]$ ln -s gogodur go #-sオプションを使用すると、シンボリックリンクになる [wataru@localhost testgo]$ ls -l total 4 lrwxrwxrwx. 1 wataru wataru 7 Jul 6 05:01 go -> gogodur #矢印でどのファイルを指定しているか分かる drwxrwxr-x. 2 wataru wataru 25 Jul 6 04:46 gogodur -rw-rw-r--. 1 wataru wataru 0 Jul 5 04:26 testtest.txt -rw-rw-r--. 1 wataru wataru 28 Jul 5 04:26 work.02.txt
- 投稿日:2020-07-06T21:04:52+09:00
Ubuntu Desktop 20.04 の開発環境の構築メモ
はじめに
開発環境としての Ubuntu Desktop 20.04 LTS 日本語 Remix のインストールメモです。
基本的には「Ubuntu Desktop 18.04 開発環境の構築メモ」とほぼ同じです。インストール先のマシンは以下です。
- ThinkPad T480s
手順
Ubuntu Desktop 18.04 をインストール後に、以下の手順でアップグレード。
sudo apt update sudo apt install update-manager sudo apt dist-upgrade sudo do-release-upgrade -d -f DistUpgradeViewGtk3ホームディレクトリ内の日本語のディレクトリ名を英語に変更
「端末」から以下のコマンドを実行。
$ LANG=en_US.utf8 xdg-user-dirs-gtk-updateそして、上記実行後に「Update standard foloders to current language?」というウィンドウが出たので、「Update Names」ボタンを押下。
左 Ctrl キーと Caps Lock キーの入れ替え
以下を読みながら、いい感じにインストールしました。Emacs Input は OFF のままに。
システム時刻を UTC 管理から LocalTime 管理に変更
Windows 10 と Ubuntu のデュアルブート環境の場合、現状のこのままだと、Windows を起動すると、システム時刻が-9hになる。
以下のコマンドを実施して、Ubuntu のシステム時刻管理を LocalTime にする。
$ timedatectl status | grep local RTC in local TZ: no $ sudo timedatectl set-local-rtc true $ timedatectl status | grep local RTC in local TZ: yes Warning: The system is configured to read the RTC time in the local time zone. 'timedatectl set-local-rtc 0'.Google Chrome のインストール
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb $ sudo dpkg -i google-chrome-stable_current_amd64.debSlack のインストール
以下サイトから deb ファイルをダウンロードする
その後、以下でインストール。
$ sudo apt install gconf2 gconf-service $ sudo dpkg -i slack-desktop-4.0.2-amd64.debHyper のインストール
以下サイトから deb ファイルをダウンロードする
その後、以下でインストール。
$ sudo apt install libappindicator1 $ sudo dpkg -i Downloads/hyper_3.0.2_amd64.debfish のインストール
参考記事: fish shellが結構良かった話
$ sudo apt install fish $ fish $ fish_configブラウザで fish shell configuration が表示されるので、「prompt」で「Informative Vcs」を設定。
そして、~/.bashrc に以下を追記。exec fish
対話式で bash を使いたい場面があったときに、上記設定をすると
bash
を実行してもfish
が起動してしまうため、対話式で bash を fish 内で使うときは~/.bashrc
を読み取らないように~/.config/fish/config.fish
に以下を追記。alias bash="bash --norc"fisher をインストール。
$ sudo apt install curl $ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fishEmacs のインストール
以下のように Emacs 27 をインストール。(※)
$ sudo snap install --classic --beta emacs $ sudo apt install emacs-mozc-bin $ sudo apt install silversearcher-ag.emacs を以下のように設定。
; package.el (require 'package) ;; MELPAを追加 (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) ;; MELPA-stableを追加 (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/")) ;; Marmaladeを追加 (add-to-list 'package-archives '("marmalade" . "https://marmalade-repo.org/packages/")) ;; Orgを追加 (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/")) ;; 初期化 (package-initialize) ; 細かい設定 ;; site-lisp path (add-to-list 'load-path "~/.emacs.d/site-lisp") ;;not make backup files (setq make-backup-files nil) ;; tab width 2 (setq-default tab-width 2 indent-tabs-mode nil) ; twittering-mode (load "twittering-mode") (setq twittering-allow-insecure-server-cert t) (setq twittering-use-master-password t) ; web-mode ;; https://qiita.com/kwappa/items/6bde1fe2bbeedc85023e ;; どの拡張子を web-mode で開くかを指定 (add-to-list 'auto-mode-alist '("\\.php\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.html$" . web-mode)) (add-to-list 'auto-mode-alist '("\\.css$" . web-mode)) (add-to-list 'auto-mode-alist '("\\.js[x]?$" . web-mode)) ;; 拡張子 .js でもJSX編集モードに (setq web-mode-content-types-alist '(("jsx" . "\\.js[x]?\\'"))) ;; インデント (add-hook 'web-mode-hook '(lambda () (setq web-mode-attr-indent-offset nil) (setq web-mode-markup-indent-offset 2) (setq web-mode-css-indent-offset 2) (setq web-mode-code-indent-offset 2) (setq web-mode-sql-indent-offset 2) (setq indent-tabs-mode nil) (setq tab-width 2) )) ;日本語入力 ;; https://qiita.com/Maizu/items/fee34328f559c7dc59d8#emacs-mozc ;;半角全角キーで日本語入力をすると、日本語入力モードで `Ctrl + [なにか]` をやるときにうまく動作しない。 ;;また、`Ctrl + \` での日本語入力モードだと、「ん」を入力するときにうまくいかない。 ;;上記を解決するために emacs-mozc をインストールする。 (require 'mozc) ; mozcの読み込み (set-language-environment "Japanese") ; 言語環境を"japanese"に (setq default-input-method "japanese-mozc") ; IMEをjapanes-mozcに (prefer-coding-system 'utf-8) ; デフォルトの文字コードをUTF-8に(require 'mozc) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(package-selected-packages (quote (mozc)))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) ; Helm ;; https://qiita.com/jabberwocky0139/items/86df1d3108e147c69e2c (require 'helm-config) (helm-mode 1) (global-set-key (kbd "M-x") 'helm-M-x) (global-set-key (kbd "C-x b") 'helm-mini) (global-set-key (kbd "C-x C-f") 'helm-find-files) ;; rebind tab to run persistent action (define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action) ;; make TAB work in terminal (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) ;; list actions using C-z (define-key helm-map (kbd "C-z") 'helm-select-action) ; Helm-ag ;; 事前準備: sudo apt install silversearcher-ag ;; M-x helm-ag
M-x package-list-packages
で以下をインストールする
- mozc
- twittering-mode
- web-mode
- helm
- helm-ag
※
$ sudo snap install emacs --classic
で実行すると Emacs 26 がインストールされるが、M-x package-list-packages
の実行で Segmentation fault で落ちる問題にぶつかった。(解決のために参考にしたIssue)nvm のインストール
以下のコマンドを実行して nvm をインストール。
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash $ fisher add jorgebucaran/fish-nvmNode.js と npm をインストール。
$ nvm use 12.11.0 $ node -v v12.11.0 $ npm -v v6.11.3Yarn のインストール
「インストール|Yarn」を参考にしてインストール。
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - $ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list $ sudo apt-get update && sudo apt-get install yarntldr コマンドのインストール
$ npm install -g tldrJava のインストール
OpenJDK 11 のインストール
$ sudo apt install openjdk-11-jdkgit の設定
$ sudo apt install git $ git config --global user.name "ユーザ名" $ git config --global user.email "メールアドレス" $ git config --global core.editor "emacs"ssh の設定
ファイルサーバーからGitHub の秘密鍵を ~/.ssh にコピーする。
その後、以下のコマンドを実行して、オーナーユーザーの読み取り権限のみを秘密鍵に設定。$ chmod 400 ~/.ssh/id_rsaパスフレーズを毎回入力しなくて済むようにする
$ ssh-add ~/.ssh/id_rsa $ ssh-add -lDocker のインストール
以下を読みながら、いい感じにインストールしました
PHP のインストール
$ sudo apt install php $ php -v PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend TechnologiesPeek のインストール
デスクトップ画面を GIF キャプチャできるように Peek をインストールします。
$ sudo add-apt-repository ppa:peek-developers/stable $ sudo apt update $ sudo apt install peek参考資料
GIF形式でのキャプチャが簡単にできるPeekをUbuntuにインストールする手順と使い方Ruby のインストール
$ apt install ruby $ gem install bundlerPython のインストール
$ apt install python
- 投稿日:2020-07-06T16:25:15+09:00
Windows機でメタゲノム解析環境をつくる
シーケンシングコストの低下に伴って巷ではヒトゲノムプロジェクト以来のバイオインフォブームの再来があるようですが、そうやって時代が進む間も野山に混じりて虫を採りつつよろづのことを調べにけりみたいな現場主義いきものメインな人が長年の憧れだったメタゲノム解析に手を出すまでの道のりです。
とりあえず環境中のメタゲノム情報に対して系統解析を行うことを目標として進めます。
手に入る書籍がモデル生物に対する発現解析関係ばかりなので、非モデル生物の分子系統解析がメインの文献があればほしい(切実)。メタゲノム解析ツールは基本的にLinux OSかMac OS環境じゃないと使えない
あの本とかこの本ではとりあえずMac使えって書かれてますね。そんなお金ないよ。なのでLinux環境を利用することになりますが、Linux専用機を用意できるはずもないので手元のWindows機内にLinux環境を構築することにした。
仮想環境の構築となるとVirtualBoXやDockerを使うことになるかと思いますが、今回はWindows Subsystem for Linux (WSL)を使用します。Windows homeでも動くし軽そうだし。環境構築
今回は手元のWindows機にWSLを導入してUbuntuをインストール、Linux向けのメタゲノム解析ツールを導入していく。
WSLおよびUbuntuの導入
こことかここを参考にしてWSL(無印のWSL1の方)を入れた。
Linux環境のホームディレクトリにWin環境のデスクトップへのシンボリックリンクを作成しておくとファイルのやり取りなどが楽になるのでおすすめ
ln -s /mnt/c/Users/"username"/Desktop ~/Desktop
※"username"部分にはwindowsアカウントの名前を入れる
日本語化とかもできるけど解析ツールはどうせ英語だし日本語と英語が入り乱れると脳がバグるよわよわパーソンなのでそのままにした。文字化け防止に日本語の言語パックをインストールだけした。導入するUbuntuのバージョンについて
ここによるとWSL1にUbuntu20.04を入れると不具合が発生し、すぐには修正が難しい問題であるらしく安定した動作を求める人は18.04LTSを入れた方が良いとのこと。私は既に20.04に色々インストールしてしまってから知ったのでそのまま使った(めんどくさいし)。Ubuntuを開きながらChromeでウェブブラウンジグしてるとしばしばWindowsがクラッシュするが解析かけて放置した場合は今のところ大丈夫なので、WindowsとUbuntuで同時に作業しなければ大丈夫じゃないかなと思う(願望)。パッチはよ。
Miniconda
公式のドキュメントを参考にしてMinicondaをインストールした。インストール後に
conda --help
がcommand not foundだったのでcondaのPATHを環境変数$PATHに追記した記憶があるのでけどうろ覚え。
うちの環境の$PATHを確認したら
/home/"username"/miniconda3/condabin
だった。biocondaチャンネルの登録
この本を参考にして
conda config --add channels defaults
conda config --add channels conda-forge
conda config --add channels bioconda
以上のチャンネルを登録した。解析に必要なツールの導入
色々試したけど最終的に使ったものだけ
SRA-toolkit
公式ドキュメントを参考にしてインストールした。確かインストール後にこのアドレスにPATHを通せ的なことが表示されたはずなのでそれに従って環境変数$PATHに追記した。
今確認するとうちの環境では
/usr/local/ncbi/sra-tools/bin
だった。configの設定
fastq-dumpなどのコマンドを使うにはconfigの設定が必要なので公式ドキュメントを参考にして設定した。
vdb-config -i
でコンフィグ画面が開くので適当に設定。キャッシュなどを置いとく場所を聞かれるので適当に作った空のディレクトリを指定する。SqueezeMeta
こことここを参考にした。
今回はcondaからインストール
conda create -n SqueezeMeta -c bioconda -c fpusan squeezemeta
conda activate SqueezeMeta
データベースの構築
SqueezeMetaのインストールが終わったら
test_install.pl
を実行するとデータベースがあるか確認して、なければデータをダウンロードして構築してくれる。このときデータベースをインストールする場所を聞かれるので指定する。とりあえず/download/path
にしといた。ダウンロードと構築にだいたい2日くらいかかった。とりあえず動かしてみる
SqueezeMetaは自動で色々やってくれるのでとりあえず適当なデータをパイプラインに流してみた
配列の取得
今回はJi et al. (2018)の登録配列を使用した。
prefetch SRR5223441
でsraファイルを取得
fastq-dump --split-files SRR5223441.sra
でペアエンドファイルに変換。SRR5223441_1.fastq
とSRR5223441_2.fastq
というファイルが生成された。
これをSqueezeMetaによる解析に使う。SqueezeMetaによる解析
適当な作業ディレクトリを作ってペアエンドファイルを移動した。
解析にはサンプルごとにfastqファイルを指定した.samplesファイルが必要なので作った
touch list.sampls
touchコマンドでファイルを作成して
vim list.samples
vimで編集したSample1 SRR5223441_1.fastq pair1
Sample1 SRR5223441_2.fastq pair2中身はこんな感じ。blank spaceはダメなのでtab区切りを使う。
今回Sample1としている部分の名前を変えていけば複数サンプルを連続で処理してくれるらしい。今回はカレントディレクトリに必要なファイルを全部置いて解析を実行した
SqueezeMeta.pl -m coassembly -p "projectname" -s ./list.samples -f ./
coassemblyモードではプロジェクトネーム(-pで指定)のディレクトリが生成されそこに結果が保存される。すでに同じ名前のディレクトリが存在すると別のプロジェクトネームにしろと怒られる(た)。解析が終わったらディレクトリごとデスクトップにコピーするとやりやすい
cp -r SRR5223441 ~/Desktop
resultsの中に02."projectname".16S.txt
と19."projectname".bintable
がある。
メモ帳でも開けるけど読み辛いので適当なスプレッドシートに流し込んだ。これらのファイルにアノテーションとビニングで見つかった生き物が記録されている。とりあえず以上の手順でSqueezeMetaが動いた。
- 投稿日:2020-07-06T01:51:13+09:00
Linuxコマンド(順次更新)
ssh
サーバーへ接続する。
sshは、通信を暗号化してリモートサーバーへ接続するプロトコルscp
サーバーとファイルのやり取りを行う。
フルパスで指定する。
※ftpは通信経路が暗号化されていないため、現在はサーバー接続ではほとんど使われていない。
(個人のブログならやってもいいけど、基本的にはビジネスであれば使わないほうがいい)grep
$ grep 検索正規表現 ファイル名特定の文字が含まれている行を出力する。
パイプ(「|」)と使うことが多く、その方が大変便利。
$ ps aux | grep apacheと打つと、
apacheが動いているのか確認することができる。
ひとつひとつのプロセスを確認できる。
(詳しくは参考記事参照)参考
「grep」の参考記事
https://webkaru.net/linux/commands-pipeline/