nginxで全ポートをlistenする

nginxで全ポートをlistenする方法です。
実験がてら作ってみた方法ですから、実際にこのような事をしたい場合は、
iptablesでREDIRECTする方が良いでしょう。

この手法を取ると、システム全体でネットワーク接続を発生できなくなります。

今回はどうしてもserver_portを利用したかったので、
このような力業を利用しました。

環境

  • Debian 12 Bookworm
  • nginx-full 1.22.1-9+deb12u1 (Debianのパッケージ)

ポート利用状況の確認

下記のコマンドでポートをLISTENしているプロセスが無いか確認します。
もしLISTENしているプロセスがあれば、そのポートを利用しない事を選択するか、
LISTENしているプロセスの停止を検討してください。

lsof -i | grep LISTEN

nginxのインストール

今回は、server_tokenoffにしたいため、nginx-fullをインストールします。

apt install nginx-full

nginxの設定

まず、nginx.confserver_tokens off;をコメントアウトし、
サーバのバージョン情報などを秘匿します。

65535ポートをv4とv6でlistenするため、
worker_connectionsworker_rlimit_nofileを余裕を持って200000に設定します。

worker_rlimit_nofileはファイル先頭のworker_processesあたりに、
worker_connectionseventsセクションに設定します。

limits.confの設定

/etc/security/limits.confwww-dataユーザの最大ファイル数を設定します。
先ほど設定した、worker_rlimit_nofileの値よりも大きい値を設定してください。

www-data soft nofile 200000
www-data hard nofile 200000

sysctlの設定

/etc/sysctl.confに下記の設定を追加します。
先ほどと同じように、fs.file-maxの値は、worker_rlimit_nofileの値よりも大きい値を設定してください。

fs.file-max = 200000

設定変更後、下記のコマンドで適用します。
この後再起動をするので、下記のステップは省略しても良いです。

sysctl -p

systemdの設定

/etc/systemd/system.conf[Manager]セクションにある、DefaultLimitNOFILEを設定します。
この値も、worker_rlimit_nofileの値よりも大きい値を設定してください。

[Manager]
# 省略
DefaultLimitNOFILE=200000

コメントアウトされている行ですから、コメントアウトして編集しても良いですし、
最後の方に追記してもかまいません。

サイトの設定

listenディレクティブは下記のようになります。
この例では、listenしたいインターフェイスのIPアドレスを1.2.3.4cafe::1:2:3:4にしています。
環境に応じて変更してください。

listen 1.2.3.4:1-65535;
listen [cafe::1:2:3:4]:1-65535;

システムの再起動を行う

limites.confsystemdの設定を行ったので、再起動を行います。
デフォルトでnginxが起動するはずですから、動作確認も同時に行ってください。

参考サイト

  • https://www.antitree.com/2017/06/running-nginx-on-all-ports/
  • https://unix.stackexchange.com/questions/366352/etc-security-limits-conf-not-applied
  • https://serverfault.com/questions/279262/nginx-proxy-a-large-port-range-to-equivalent-port-on-a-different-ip-address

FortiGateでフレッツ光クロスのXpass 固定IP1を収容する

なぜか公式ドキュメントに記載されていない、DHCPv6-PDで収容する方法です。
OCX光のドキュメントのおかげで何とか収容できたので備忘として書いておきます。

環境

WANポートの設定

portAに10GBASE-Tのトランシーバを接続し、下記のコンフィグを投入します。
投入する際、set ip6-upstream-interface "portA"の箇所は必ず最後に入れてください。

もしportAに割り当てるアドレスを変更したい場合、ip6-subnet ::1/64の下位64ビットを変更してください。

config system interface
    edit "portA"
        set lldp-reception disable
        set lldp-transmission disable
        set role wan
        config ipv6
            set ip6-mode delegated
            set dhcp6-prefix-delegation enable
            set ip6-delegated-prefix-iaid 1
            set ip6-subnet ::1/64
            config dhcp6-iapd-list
                edit 1
                    set prefix-hint ::/56
                next
            end
            set ip6-upstream-interface "portA"
        end
    next
end

nd-proxyの設定(要るかは不明)

おそらく不要だとは思いますが、動いている物を触って壊したくはないので無くても動くかは未検証です。
もし動かなかったら入れてみてください。

config system nd-proxy
    set status enable
    set member "portA"
end

VNEインターフェースの設定

VNEインターフェースの設定です。FortiOS 7.6ではconfig system vne-tunnelが無くなり、vne-interfaceになっています。
公式Cookbookは、DS-Liteだけなぜかvne-tunnelのままですので修正を加えます。
editの中は従来の方法と同じように書けます。

これまではvne.rootとなっていたインターフェース名ですが、edit "xpass"の箇所を変更することで、手動で指定することができるようになりました。
また、update-url?は、シリアルコンソールでつないだ状態で、一度Ctrl + vを押し、その後?を押すことで入力できます。
この際、ターミナルソフトウェアにCtrl + vのシュートカットが割り当てられていないことを確認してください。

config system vne-interface
    edit "xpass"
        set interface "portA"
        set ipv4-address 17.123.123.123 255.255.255.255
        set br "ipv6 add"
        set update-url "..."
        set mode fixed-ip
        set http-username "..."
        set http-password "..."
    next
end

SD-WANへの割り当て

一般的なインターフェースを割り当てるようにxpassと言うインターフェースを割り当ててください。
この際、ゲートウェイは0.0.0.0のままで動作します。

SD-WANを使用していない場合も、Static Routeで同じように指定すれば動作します。

参考資料

MicrosoftのHigh Volume Emailを使う

現在ベータで提供されているMicrosoft 365のHigh Volume Emailの設定を行います。

Security Defaultsを無効化する

Microsoft Entra admin centerにて、Security defaultsを無効化し、
Conditional Accessを代わりに利用するようにします。

Entra admin centerのIdentityセクションにあるOverviewを選択し、
Propertiesタブを開きます。

一番下にSecurity defaultsの設定がありますので、ここから無効にしてください。
無効にする際に、Conditional Accessを代わりに利用する設定にすることを推奨します。

また、削除理由にHigh Volume Emailを使うためであることを記述すると、
将来的にMicrosoftが何かしらの方法を作ってくれるかもしれません。
是非記述しましょう。

詳しい設定の意味等はMicrosoft DocsのSecurity defaults in Microsoft Entra IDに記述されています。

High Volume Emailを利用するアカウントのグループを作成

次のConditional Accessで例外設定をするためにMicrosoft Entra admin CenterでSecurity Groupを作成します。

High Volume Emailで独自のメールドメインから送信する場合は、
下記のMembership ruleがそのまま利用できます。

(user.mail -contains "@domain.to.use.invalid")

このルールはセキュアでは無いことに注意してください。
本来であればendsWith等で明示的にこのメールがドメイン部であることを示すべきですが、
悲しいことにMembership ruleではstartsWithのみ対応のようです。

もしメールのプレフックスでHVEメールを示す場合は、startsWithでよりセキュアに設定できるでしょう。

下記のコードは動作検証していませんが、おそらく使えるはずです。

(user.mail -startsWith "system.hve.")

Conditional Accessの設定

Security Defaultsの設定画面まで移動すると、
Manage Conditional Accessというリンクが見えるようになっているはずです。
これをクリックし、Conditional Accessの設定に入ります。

本来であればBlock legacy authenticationの例外に先ほど作成したグループを設定すればいいはずですが、
念のためにMultifactor authentication for all usersにも同様に例外設定をし、
同時にStateをReport-onlyに設定しています。

この設定はとても危険ですので、一度例外設定を投入したのち、
しばらく放置して動くか確認すべきです。
もし動いたらIssueページから教えてもらえると助かります。

ドメインの追加

Microsoft Docs – Add a domain to Microsoft 365を参考に、
ExchangeとDKIMの設定を投入したドメインの追加を行います。

ここはおそらくExchangeを使っているテナントの場合は過去に設定している場合がほとんどだと思いますので、特に躓くことなく設定できるかと思います。

また、現在利用しているドメインからそのままメールを送信する場合、この手順はスキップできます。

HVEアカウントの作成

Exchange admin centerのMail flowセクションの中にあるHigh volume mailからHVEアカウントを作成します。

プライマリメールアドレスがメールの送信元になります。
また、同一テナント内に送信する場合は、表示名がFromの表示名より優先されるため、
わかりやすい名前を指定することを推奨します。

AllowBasicAuthSmtpポリシーの適用

Exchange admin centerのCloud Shellで下記のコマンドを実行し、
Exchangeの設定をコマンドでできるようにします。

Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline

最初にAllowBasicAuthSmtpの設定を持つポリシーの作成を行います。
下記のようなコマンドが利用できます。
また、一度ポリシーを作成した後は複数のHVEアカウントや一般のアカウントで使いまわすことができるため、この作業は最初の1回のみで大丈夫です。

New-AuthenticationPolicy -Name "AllowBasicAuthSmtp" -AllowBasicAuthSmtp

作成したHVEアカウントに作成したポリシーを割り当てます。
下記のようなコマンドを実行します。

Set-User -Identity "[email protected]" -AuthenticationPolicy "AllowBasicAuthSmtp"

メーラーへの設定

Microsoft DocsのManage high volume emails for Microsoft 365 Public previewに記述されている接続先をSMTPクライアントに設定します。

日本語版ドキュメントでは、smtp-hve.office365.comとなるべきホスト名がsmtp-have.office365.comと誤訳されているので注意してください。

また、ユーザ名とパスワードは送信元メールアドレスとHVEアカウント作成時に設定したパスワードとなります。

この記事の最後にはエラーコードとその原因が書いてありますので、必要に応じて参照してください。

Windowsの3本指タップをブラウジング向けカスタマイズにする

Windowsの3本指ジェスチャーは標準だとデスクトップを表示や、検索など、人によっては使わないものが多いです。
今回はマウス中ボタンとタブ切り替えに設定し、ブラウジングに便利な設定にします。

3本指タップを設定

Windowsの設定から、「Bluetoothとデバイス」->「タッチパッド」->「3本指ジェスチャー」を開きます。
タップを「Windows Search」から「マウスの中ボタン」に設定すればOKです。

この状態では、下記のショートカットが利用できます。

  • ブラウザでリンクを3本指タップすると新しいタブで開かれます
  • ブラウザのタブを3本指タップするとタブが閉じられます
  • Windowsタスクバーのアプリケーションを3本指タップすると、すでに開かれていても、新しいウィンドウで開かれます

3本指ジェスチャーの設定

Windowsの設定から、「Bluetoothとデバイス」->「タッチパッド」-> 「詳細ジェスチャー」->「3本指ジェスチャーの設定」を開きます。

「上へスワイプ」を「カスタム」に設定し、「記録を開始」を押し、「Ctrl + Shift + Tab」を入力し、「記録を終了」をクリックします。
「下へスワイプ」も同じように設定しますが、「Ctrl + Tab」を入力します。

この状態では、下記のショートカットが利用できます。

  • ブラウザなどのタブが使えるアプリケーションでタブの切り替えがジェスチャーでできるようになります
  • Edgeを縦タブ設定にすることで、直感的に操作できるようになります

FessとnginxでPDFを保管する全文検索可能なサーバを構築する

目的

PDFやdocs,xlsxなどを全文検索できるサーバを構築します。
nginxを使い、データにオンラインでアクセスできるようにします。

環境

  • Ubuntu 22.04 LTS

Nginxのセットアップ

Nginxをインストール

Ubuntuにnginxをインストールします。
server_tokensの設定も行うため、nginx-extrasも同時にインストールします。

sudo apt install nginx nginx-extras

Nginxのグローバル設定

/etc/nginx/nginx.confの20行目付近にあるserver_tokens off;をコメントインし、
nginxのバージョンが公開されないようにします。

Sitesの設定

/etc/nginx/sites-available/datastore.confを以下のように編集します。

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/content;

        server_name _;

        add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

        autoindex on;
        charset utf-8;

        location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }

        location / {
                autoindex on;
                allow 192.168.0.0/16;
                allow 172.16.0.0/12;
                allow 10.0.0.0/8;
                deny all;
        }
}

location /allowは適切な社内ネットワークなどを指定してください。
外部に公開する場合はdeny allごとこれらを削除し、
Robots系の設定も削除してください。

/var/www/contentにディレクトリを作成し、PDFなどを入れてください。

サイトを有効化し、デフォルトサイトを無効化します。

sudo ln -s /etc/nginx/sites-available/datastore.conf /etc/nginx/sites-enabled/datastore.conf
sudo rm /etc/nginx/sites-enabled/default

Nginxの再起動

設定を反映させるため、nginxを再起動します。

sudo systemctl reload nginx

OpenSearchのインストールと設定

OpenSearch公式ページからdeb形式でOpenSearchをダウンロードするか、aptリポジトリを追加してインストールします。

おすすめはaptリポジトリを使う方法です。

下記コマンドから必要なプラグインを、インストールしますが、
2.10.0の部分はインストールしたOpenSearchのバージョンに合わせてください。

$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-analysis-fess:2.10.0
$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-analysis-extension:2.10.0
$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-minhash:2.10.0
$ sudo /usr/share/opensearch/bin/opensearch-plugin install org.codelibs.opensearch:opensearch-configsync:2.10.0

最後に/etc/opensearch/opensearch.ymlに下記設定を追記します。

configsync.config_path: /var/lib/opensearch/data/config/
plugins.security.disabled: true

Javaのインストール

Fessのクロールに必要なJavaをインストールします。

FessはUbuntu PackagesのJava JREを使うとクラッシュするため、
Temurinを利用します。

公式ドキュメントを参考に、
apt Repositoryを設定し、temurin-17-jreをインストールしてください。

Fessのインストールと設定

Fessのインストールをする前にFessにい外部からアクセスする必要がある場合、
Fessは標準でIPv6のListenを行います。
もし、IPv4をListenさせたい場合は、
/etc/sysctl.confに下記内容を追記してsysctl -pを実行し、
IPv6をシステムで無効にしてください。

net.ipv6.conf.all.disable_ipv6 = 1

FessはGitHubのリリースからdebパッケージをダウンロードしてインストールします。

wget https://github.com/codelibs/fess/releases/download/fess-14.10.1/fess-14.10.1.deb
sudo apt install ./fess-14.10.1.deb

/usr/share/fess/bin/fess.in.sh内の次の2行をコメントインし、内容も修正します。

SEARCH_ENGINE_HTTP_URL=http://localhost:9200
FESS_DICTIONARY_PATH=/var/lib/opensearch/data/config/

OpenSearchとFessを自動起動させる

systemctlで下記のコマンドを投入し、
サービスを開始させ自動起動を有効にします。

sudo systemctl daemon-reload
sudo systemctl restart opensearch.service fess.service
sudo systemctl enable opensearch.service fess.service

Fessの設定を行う

http://localhost:8080/adminにアクセスし、管理画面に入ります。

初期ユーザはadmin:adminです。

スケジューラー設定

System -> SchedulerにJob Schedulerが存在しない場合があります。
初期で何もない場合は、System Info -> Back UpからGitHubで公開されてる初期設定をインポートしてください。

クロールの設定を行う

公式ドキュメントを参考にクロール設定を追加してください。

このNginx設定例ではrobots.txtでクロールを制限しているため、
Config Parametersに下記の設定を投入してください。

crawler.ignore.robots.txt=true
config.ignore.robots.tags=true
client.robotsTxtEnabled=false

また、必要に応じて、インデックス化する最大のファイルサイズを指定してください。
単位はバイトです。

client.maxContentLength=262144000

クロールの実行

System -> SchedulerからDefault Crawlerを開き、
Start nowをクリックすることでクロールが開始されます。

ジョブの進捗はSystem -> Job Logから、
クロール結果はSystem -> Crawling Infoから確認できます。

内部に蓄積されたインデックス済みファイルは、
System -> Searchで空文字を検索することで閲覧できます。

ログについて

Fessのログは/var/log/fess下に出力されます。

Crawlerを呼ぶ前のログはfess.logに、
Crawler自体のログはfess-crawler.logに保存されます。

Mailjetを使ったメール送信サーバをUbuntu22.04とPostfixで作る

目的

Zabbixなどのメールを配信するサーバをMailjetを使って構築します。
Mailjetを使うことで、OP25Bが行われているプロバイダでもメールを送信できるようにします。

Postfixのインストール

libsasl2-modulesがないと認証で失敗するため、同時にインストールします。

Postfixの設定はNo configで続行してください。

apt install libsasl2-modules postfix 

Postfixの設定

Postfixの設定例です。
実際の拠点で使っているものを記述しているので、
いくつか不要な表記があると思います。
各自で消してください。

relayhost = in-v3.mailjet.com:587
smtp_sasl_auth_enable = yes
smtp_use_tls = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix

myhostname = example.com
mydomain = example.com

local_recipient_maps =

mail_owner = postfix

myorigin = $mydomain
smtpd_banner = $myhostname ESMTP

inet_protocols = all
inet_interfaces = all
mynetworks_style = subnet
mynetworks = 127.0.0.0/8

smtpd_relay_before_recipient_restrictions = yes
smtpd_relay_restrictions =  permit_mynetworks, reject_unauth_destination
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

setgid_group = postdrop

message_size_limit = 10485760
mailbox_size_limit = 0
compatibility_level = 3.6

認証情報の設定

/etc/postfix/sasl_passwdは次の内容になります。
ホスト名指定がin-v3ではなくinのみになっていることに注意してください。

in.mailjet.com APIKey:SecretKey

適用

最後にpostmapを実行し、Postfixを再起動します。

sudo postmap hash:/etc/postfix/sasl_passwd
sudo systemctl restart postfix

Mattermostをdocker-composeとCloudflare TunnelでUbuntu Server 22.04上に構築する

はじめに

今回構築するMattermostは下記の構成になります。

  • Port 8065でHTTP Listen
  • Cloudflare Tunnelでリバースプロキシ
  • Callsは利用しない
  • Bleveは利用しない
  • S3は利用しない

このレッスンでは下記の環境を自身で用意してください

  • x64 CPUを搭載したPC (Dockerが動作すること)
  • 上記のPCでDVDもしくはUSBからブートさせる機材
  • DVD-RとDVDドライブもしくは4GB以上のUSBメモリ

このレッスンでは、コンピュータ内のデータが消去されます。
すべての操作は慎重に行ってください。

もしレッスンを行うにあたって不安な場合、
担当者の空き時間をあらかじめ確認し、その時間に合わせてレッスンを行ってください。

Ubuntu Server 22.04のインストール

Ubuntuは2年おきに長期サポート版がリリースされます。
2022年4月にリリースされた22.04が現在の最新リリースであり、
次の長期サポート版は2024年4月リリース予定の24.04です。

この資料では22.04を利用して環境を構築しますが、
基本最新の長期サポート版を利用してください。
長期サポート版はダウンロード時などにLTSと表記されます。
参考にしてください。

Ubuntu Serverのダウンロード

Ubuntu Serverは公式サイトのダウンロードページからダウンロードできます。
Alternative downloadsからTorrentなどでダウンロードすることもできます。
必要に応じて活用してください。

日本のミラーサイトからダウンロードすることもできます。
詳しくはUbuntu Japanese Teamのページを参照してください。

Ubuntu Serverのインストール

基本はUbuntu公式ドキュメント
Server Worldの記事
を参考にするといいでしょう。

サイトと違う点として、
インストールする際にはUbuntu server (minimized)を選択してください。

ネットワークの設定についてはかなり癖があります。
とりあえずDHCPのネットワークで設定を実施してください。
固定IPでの設定は別に記事にします。

OpenSSHサーバは必ずオンにしてください。
これ以降はSSHでの操作を行います。

Dockerを使うと記述していますが、
インストール最後のアプリケーションをインストールする画面では何も選択しないでください。

IPアドレスの確認

インストール時に設定したユーザ名とパスワードでまずPC本体でログインします。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 18:66:da:2f:e1:b4 brd ff:ff:ff:ff:ff:ff
    inet 17.0.0.2/24 brd 17.0.0.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 2620:149:af0::10/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591920sec preferred_lft 604720sec

ip aコマンドでIPアドレスを確認してください。

基本的にenpethから始まる物が有線LANで、inetの行にIPアドレスが記載されています。
この場合、17.0.0.2がIPアドレスで、/24がサブネットマスクです。

IPv6アドレスも同じようにinet6の行で確認できます。

このIPアドレスをメモしておいてください。

SSHでのアクセス

Windows 10からはSSHクライアントが標準でインストールされています。

SSHコマンドの基本文法は下記のとおりです。

usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command

基本的に使うのは-l, -p, -L, destinationでしょう。

-lはログインするユーザ名、
-pはポート番号、
-Lはポートフォワーディング(本ドキュメントでは利用しません)の設定です。

destinationでは宛先(サーバ)を設定します。

初期設定の場合下記のコマンドでログインできます。

ssh -l 初期設定で作ったユーザ名 サーバのIPアドレス

最初にアクセスする際には下記の表示が出ます。

The authenticity of host 'サーバのIPアドレス' can't be established.
ED25519 key fingerprint is SHA256:ABCDEF0123456789.....
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

yesと入力しEnterを押してください。

その後、パスワードを要求されます。
パスワードの入力時には文字が一切表示されませんが、正常な挙動です。

下記のような画面が出ればログインできています(もっと少ない場合もあります)

Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

Last login: Tue Aug  8 01:46:27 2023 from 17.0.3.129
ユーザ名@サーバ名:~$

試しにip aなどのコマンドをうち、
サーバ本体で打った時と同じ値になるか試してみましょう。

基本コマンドについて

基本的なファイル操作などについては、LearningDocsで解説しています。
実際に試してみてください。

下記では、Learning Docsで解説していないコマンドを解説します。

sudo

Linuxにはrootという特権ユーザが存在します。
rootではおおよそ大体の(破壊を含む)すべての行動ができます。
その危険性から、Ubuntuではrootユーザは初期状態で無効化
(パスワードが設定されておらずログインできないユーザ)
になっていますが、特権ユーザとして実行しないといけない処理
(アプリケーションのインストール等)
を行う際にはsudoコマンドを利用し、特権ユーザに成り上がります。

sudoコマンドは下記のように使います。

sudo 特権で実行したいコマンド

例えば、aptコマンドはアプリケーションのインストールやアップデートを行うコマンドですが、
特権ユーザでないと実行できません。

$ apt update # 通常ユーザで実行
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)

$ sudo apt update # sudoを使って実行
[sudo] password for ユーザ: # ここでパスワードを入力(一定期間sudoしてないと表示される)
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [868 kB]
Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [212 kB]
Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 c-n-f Metadata [15.6 kB]
Get:8 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [964 kB]
Get:9 http://archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [209 kB]
Fetched 2,613 kB in 4s (686 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
26 packages can be upgraded. Run 'apt list --upgradable' to see them.

sudoとても危険なコマンドです。
なんでもsudoに頼らず、本当にroot権限が必要か、
そもそも今行おうとしている作業が本当に正しいのかをよく確認してください。
大いなる力には大いなる責任が伴います。

apt

aptはDebian系のLinuxで利用されるパッケージ管理システムです。

基本的には下記の構文で主に利用されます。

$ sudo apt update # パッケージ情報の更新
$ sudo apt upgrade # パッケージの更新
$ sudo apt install パッケージ名 # パッケージのインストール
$ sudo apt remove パッケージ名 # パッケージのアンインストール
$ sudo apt purge パッケージ名 # パッケージの設定ごと削除
$ sudo apt autoremove # 不要なパッケージの削除
$ sudo apt autopurge # 不要なパッケージの設定ごと削除
$ apt search パッケージ名や検索ワード # パッケージの検索

基本的に、aptコマンドで何かしらの作業をする前に、
必ずapt updateを行ってください。

aptコマンドでは、パッケージの情報をローカルに一度保管するため、
ローカルのデータが古いと様々なコマンドが失敗します。

Dockerとdocker-composeのインストール

Dockerはコンテナ型の仮想化技術です。
Kernelレベルでの仮想化を行うため、
仮想化ソフトウェアを利用するよりも軽量で高速に動作します。

また、イメージという概念でアプリケーションの展開を行うため、
とてもめんどくさい環境構築も比較的楽になります。

Docker公式のマニュアルを読むのが一番良いでしょう。

インストールする際は最新のバージョン
(英語的にはLatest Version)をインストールしてください。

Docker Composeも同じように公式ドキュメントを参考にインストールしてください。

最後にインストールできているか確認しましょう

$ docker --version
Docker version 24.0.5, build ced0996

$ docker-compose --version
docker-compose version 1.29.2, build unknown

値が違っても構いません。
エラーが出ていないことを確認してください。

DockerとDocker Composeで遊ぶ

さて、Dockerで遊んでみましょう。

試しに

$ sudo docker run --rm -it ubuntu:latest bash

などと実行し、Ubuntuのイメージを実行してみましょう。

シェルにroot@ランダムな文字列:/#と表示されれば成功です。

この環境はあくまで仮想環境です。
rm -rf /*などを打っても多分大丈夫だと思います(責任は取りません)

exitで抜けましょう。

Docker Composeは少し便利になったDockerです。

通常Dockerでは、ネットワークなどで接続性を用意する場合、
それはもうめんどくさい手順が必要ですが、
Docker Composeでは同一のYamlファイル内のコンテナは
初期状態で同一のネットワークに接続され、Yaml内のキーの名前で名前解決できるため、
DBが必要なアプリケーションの構築などでとても便利です。

Dockerとdocker-composeについて説明しようとするとかなり長くなるので、
詳しくはググるか個別で質問して解決してください。

覚えておくべきこと

Dockerではコンテナとイメージがよく出てきます。
イメージからコンテナが作られ、コンテナ内で様々な事象が起こります。
コンテナは不要になれば破棄できます。

イメージが同じであれば、基本的には同じ内容コンテナが生成されます。

永続化

Volumeを使うと、コンテナの特定のディレクトリやファイルなどを、
現実のシステム上のディレクトリやファイルにマウント(若者的にはリンクとか言った方がいい?)できます。
これにより、コンテナ内のデータを永続化できます。

試してみましょう

あらかじめホストでls /tmpを実行し、中身をなんとなく覚えておいてください。

docker run --rm -it -v /tmp:/hosttmp:ro ubuntu:latest bash

このコマンドでコンテナを構築し、ls /hosttmpを実行すると大体同じ内容になっているはずです。
:roをつけているため、touchなどを実行しようとしても弾かれると思います。

ポート開放

Exposeという概念があります。
Dockerでは標準でネットワークに対しホストのIPでNAPT(e-Worldの解説)されるため、
Exposeを使い明示的にポートを指定してアクセスを許可する必要があります。

例えば、

docker run --rm -it -p 8080:80 nginx:latest

で8080ポートでnginxにアクセスできます。

試しにブラウザでhttp://サーバのIP:8080/にアクセスしてみてください。
Welcome to nginx!が表示されるはずです。

Ctrl + Cの同時押しで終了しましょう。

Mattermostの構築

推奨される手順は公式ドキュメントに記述されていますが、
今回は独自流で進めます。

Mattermost用にディレクトリを作り、その中に移動します。
今後はその中で主に作業を行います。

.envファイルを作り下記の内容にします。
ただし、コメントは削除してください(日本語が不具合を起こすかもしれないので)

# Mattermostを公開するドメインを設定してください。
# cloudflaredで公開できるドメインを設定してください。
DOMAIN=mattermost.example.com

# タイムゾーン設定です
# 日本ならAsia/Tokyoそれ以外は
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# を参照してください。
TZ=Asia/Tokyo

# PCが再起動した際にどのようにするかの設定です。
# always: 停止されていた場合でも再起動時に起動する
# unless-stopped: 停止されていなければ再起動時に起動する
# on-failure: エラーで停止した場合のみ再起動する
RESTART_POLICY=unless-stopped

# Postgresデータベースのバージョンです。
# https://hub.docker.com/_/postgres
# に書いてある最新のbetaやalphaとついていないバージョンを指定しるとよいでしょう。
POSTGRES_IMAGE_TAG=15-alpine
# Postgresの永続化先です
# このディレクトリを削除するとデータベースが消えます。
POSTGRES_DATA_PATH=./volumes/db/var/lib/postgresql/data

# Postgresのユーザ名、パスワード、データベース名です。
# この値をMattermost側で設定し、MattermostがDBを使えるようにします。
POSTGRES_USER=mmuser
POSTGRES_PASSWORD=mmuser_password
POSTGRES_DB=mattermost

# Mattermostの設定ファイル関連の永続化設定です
MATTERMOST_CONFIG_PATH=./volumes/app/mattermost/config
MATTERMOST_DATA_PATH=./volumes/app/mattermost/data
MATTERMOST_LOGS_PATH=./volumes/app/mattermost/logs
MATTERMOST_PLUGINS_PATH=./volumes/app/mattermost/plugins
MATTERMOST_CLIENT_PLUGINS_PATH=./volumes/app/mattermost/client/plugins
MATTERMOST_BLEVE_INDEXES_PATH=./volumes/app/mattermost/bleve-indexes

# Bleve index (全文検索)の設定です
# いじらないでください。
MM_BLEVESETTINGS_INDEXDIR=/mattermost/bleve-indexes

# 課金している場合は`mattermost-enterprise-edition`に変更してください。
# それ以外は`mattermost-team-edition`のままにしてください。
MATTERMOST_IMAGE=mattermost-team-edition
# バージョンは
# https://hub.docker.com/r/mattermost/mattermost-team-edition/tags
# https://docs.mattermost.com/install/self-managed-changelog.html
# の2つの両方にある物を選択してください。
# 現状の最新は8.0です。
MATTERMOST_IMAGE_TAG=8.0

# Mattermostの公開ポートです。
# そのまま使うわけではないので8065にしたままにすることを推奨します。
APP_PORT=8065

# データベースの設定です。
# 変更しないでください
MM_SQLSETTINGS_DRIVERNAME=postgres
MM_SQLSETTINGS_DATASOURCE=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable&connect_timeout=10

# Mattermostの公開URL設定です
# 特定ポートで公開したい場合などは編集する必要がありますが、
# 今回の設定では不要です
MM_SERVICESETTINGS_SITEURL=https://${DOMAIN}

docker-compose.ymlを作り下記の内容にします。

version: "2.4"

services:
  postgres:
    image: postgres:${POSTGRES_IMAGE_TAG}
    restart: ${RESTART_POLICY}
    security_opt:
      - no-new-privileges:true
    pids_limit: 100
    read_only: true
    tmpfs:
      - /tmp
      - /var/run/postgresql
    volumes:
      - ${POSTGRES_DATA_PATH}:/var/lib/postgresql/data
    environment:
      - TZ
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB

  mattermost:
    depends_on:
      - postgres
    image: mattermost/${MATTERMOST_IMAGE}:${MATTERMOST_IMAGE_TAG}
    restart: ${RESTART_POLICY}
    security_opt:
      - no-new-privileges:true
    pids_limit: 200
    tmpfs:
      - /tmp
    volumes:
      - ${MATTERMOST_CONFIG_PATH}:/mattermost/config:rw
      - ${MATTERMOST_DATA_PATH}:/mattermost/data:rw
      - ${MATTERMOST_LOGS_PATH}:/mattermost/logs:rw
      - ${MATTERMOST_PLUGINS_PATH}:/mattermost/plugins:rw
      - ${MATTERMOST_CLIENT_PLUGINS_PATH}:/mattermost/client/plugins:rw
      - ${MATTERMOST_BLEVE_INDEXES_PATH}:/mattermost/bleve-indexes:rw
    environment:
      - TZ
      - MM_SQLSETTINGS_DRIVERNAME
      - MM_SQLSETTINGS_DATASOURCE
      - MM_BLEVESETTINGS_INDEXDIR
      - MM_SERVICESETTINGS_SITEURL
    ports:
      - ${APP_PORT}:8065

docker-compose up -dで実行します。
docker-compose logs -fでログを確認できます。

ログが出力されなくなったらCtrl + Cで終了しましょう。

Cloudflaredのインストール

今回はCloudflare Tunnel
でサーバを公開します。

Cloudflare packagesを参考にaptでCloudflaredをインストールできるようにします。

インストールが終わったらcloudflared --versionでインストールが正常にできているか試してみましょう。

$ cloudflared --version
cloudflared version 2022.10.3 (built 2022-10-26-1030 UTC)

Cloudflaredの設定はCloudflareの公式ドキュメントを参照してください。
Cloudflareは明らかにいい方向に向かっていますが、UIの変更が多いため、ここで説明しても多分すぐ変わります。

Public Hostnameで設定するローカルアドレスはhttp://localhost:8065です。
Additional application settingsは不要です。

Connect a networkセクションはスキップしてください。

動作確認

最後に、Mattermostにドメイン越しでアクセスできるか試してください。

初期設定も必要に応じて行ってください
(本来は初期設定は公開前に行ってください。セキュリティ事故が起こります)

docomo新プランeximo・irumoと過去プランの比較

2023/06/20時点で公開されている情報をもとに作成

割引・特典なし

500MB 1GB 3GB 5GB 6GB 7GB 9GB 10GB 20GB 60GB 100GB 無制限
eximo 4,565 5,665 7,315
5G ギガホ プレミア 5,665 7,315
ギガホ プレミア 5,555 7,205
irumo 550 2,167 2,827 3,377
ギガライト 3,465 4,565 5,665 6,765
ahamo 2,970 4,950
OCN モバイル ONE 550 770 990 1,320 1,760

WindowsをSSLインスペクション環境で利用する

メモ記事です。
私が困難に直面し次第、追記をします。
IssueとかPR投げてもらえれば反映するかもしれません。

Python

pipを使いWindowsの証明書を利用できるようにするパッケージを入れる。
現状、requestsで動作確認済み。
venv先にもインストールする必要がある。

pip自体もSSLを利用するため、明示的にいくつかのホストをTrustedさせている。

pip install pip-system-certs --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org

PHP

php.ini[curl][openssl]セクションに記述します。

[curl]
curl.cainfo =c:\fortigate.pem

[openssl]
openssl.cafile=c:\fortigate.pem

動作確認はphp -a

curl_exec(curl_init("https://ifconfig.io"));

などでいいと思います。

pfSenseを透過ファイアウォールとして設定する

普段はFortinetに魂を売っている筆者ではあるが、
さすがに各VMホストに導入するためだけにFortiGate-VMを購入していては破産するため、
pfSenseでお手軽ファイアウォールをするために透過ファイアウォールの設定を行う。

pfSenseは簡単に透過ファイアウォールを設定することができないので、
将来の私向けのメモとして記録を残す。

環境

  • pfSense 2.6.0

手順

インストール・WAN/LAN設定

インストール後にWAN/LAN設定がある、
後々のACL記述でWAN/LANの概念が存在するのため、
VMの外をWAN、VM内をLANとした。

IPアドレス割り当て

WEB UIにアクセスするためにWAN/LANのどちらか好きな方にIPアドレスを割り当てる。

ここで設定した値は後程消すことになるので、ある程度適当でも構わない。

また、使わないインターフェースはアドレス設定を空白で入力し、
アドレス無しで設定すると幸せになれるかもしれない。

WebUIへのアクセス・初期設定

admin:pfsenseでアクセスできる。
初期設定は適当に済ませるとよい。

WAN側から設定画面にアクセスしたい場合はShellから、

pfctl -d

でファイアウォールを一時無効化できる。

設定値は基本的に今後も使うが、
IPアドレス設定はどうせ消すため、適当でよい。

Bridgeを作る

Web UIでInterfaces -> Assignments -> Bridges -> AddからBridgeを作り、
WANとLANを追加する。

System -> Advanced -> System Tunablesから設定を開き、
net.link.bridge.pfil_bridge1にする。

Interface -> Assignmentsから、
BRIDGE0をAddし、OPT1を作る。

NATをオフにする

NATは不要なので、
Firewall -> NAT -> Outboundで設定に入り、
Disable Outbound NAT rule generationを指定する。

IPアドレスを設定する

WANとLANのIPv4/6 Configuration TypeをそれぞれNoneに設定する。

OPT1にIPv4/IPv6アドレスを最適な値に指定する。

OPT1はおそらくWANとLANをWeb UIから削除した後にCLIで設定するとよいだろう。

ルールの書き方

ファイアウォールルールでは、LAN・WAN・OPT1をすべて利用できる。

そのため、最低限様々な通信を通したい場合、
すべてのセクションにおいてとりあえずAllow allをするとよいだろう。