EC2+Nginx+node.jsのWEBサーバーをLet’sEncryptでSSL化する

この手順で構築したWEBサーバーを使用する。

・ ディストリビューション: Amazon Linux 2023.1.20230825
・ インスタンスタイプ: t3a.nano
・ ボリュームサイズ: 20GB

python3の仮想環境を使用してcertbotをインストールする。
※この手順作成時はpython3.9だった

# dnf install pip
# mkdir /opt/certbot
# python3 -m venv /opt/certbot
# /opt/certbot/bin/pip install --upgrade pip
# /opt/certbot/bin/pip install certbot

ACMEチャレンジのための設定を追加する。

server {
    listen       80;
    listen       [::]:80;
    server_name  _;
    location = /.well-known/acme-challenge/ {
        root /usr/share/nginx/html/.well-known/acme-challenge/;
    }
}

証明書を取得する。
※何度も失敗すると制限がかかるので予め--dry-runオプションを指定してテストした方が良い

/opt/certbot/bin/certbot certonly --webroot -w /usr/share/nginx/html/ -d testapp.example.com

Nginxの設定ファイルを変更する。

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name testapp.example.com;
    ssl_certificate     /etc/letsencrypt/live/testapp.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/testapp.example.com/privkey.pem;
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_path http://localhost:3000/;
    }
}

Nginxの設定をリロードしてhttpsでの接続を確認する。

# systemctl reload nginx

cronに証明書を更新するジョブを追加する。

0 4 * * * /opt/certbot/bin/certbot renew --deploy-hook "systemctl reload nginx"

EC2をNginx+node.jsでWEBサーバーにする

・ ディストリビューション: Amazon Linux 2023.1.20230825
・ インスタンスタイプ: t3a.nano
・ ボリュームサイズ: 20GB

タイムゾーンを日本に変更する。
※使用できるタイムゾーンはlist-timezonesサブコマンドで確認できる

# timedatectl set-timezone Asia/Tokyo

メモリが512MBしかないのでスワップを追加する。
※事前にswapon –summaryで既存スワップを確認済み

# dd if=/dev/zero of=/swapfile bs=1M count=1024
# mkswap /swapfile
# swapon /swapfile

fstabの末尾にも設定を1行追加して永続化する。

/swapfile    none    swap    sw    0    0

nvmを使用してnode.jsをインストールする。
※使用できるnode.jsのバージョンはnvm ls-remoteで確認できる

# dnf install git
$ git clone https://github.com/creationix/nvm.git ~/temp-nvm
$ ~/temp-nvm/install.sh
$ rm -r ~/temp-nvm/
$ source ~/.bashrc
$ nvm install --lts

適当なWEBサーバーを作成する。

const http = require("http");
http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("Hello, World!\n");
}).listen(3000);

node.jsでWEBサーバーを起動しておく。

$ node ~/testapp.js

Nginxをインストールして起動+有効化する。

# dnf install nginx
# systemctl enable --now nginx

リバースプロキシを設定してnode.jsのWEBサーバーに中継する。
※「client_max_body_size 10m」で10MBまでの画像なども受け取れる
※「proxy_set_header Host $host」でクライアントが送信したリクエストのホスト名を渡す
※「proxy_set_header X-Real-IP $remote_addr」でクライアントのIPアドレスを渡す

server {
    listen 80;
    listen [::]:80;
    server_name testapp.example.com;
    client_max_body_size 10m;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_path http://localhost:3000/;
    }
}

Nginxの設定値を再読込する。

# systemctl reload nginx

Fcitx+Mozcでインライン入力できなくなったのを直す

下記のGUIからできる設定は有効化されているものとする。
-----------------------------
Fcitx入力メソッドの設定 → アドオン → Advanced
 → Fcitx XIM Frontend → XIMでOnTheSpotスタイルを使う

下記の設定ファイルを編集して「PreeditStringInClientWindow」がFalseになっていないか確認する。もしFalseになっていた場合は一度Fcitxを終了してからTrueに編集する。自分の環境ではPreeditStringInClientWindowをコメントブロックしただけで直ったのでデフォルトがTrueなのか。

…
# クライアントのウィンドウにプレエディットを表示
# 可能な値:
# True False
PreeditStringInClientWindow=True

Ubuntu22.04で画像を一括編集する

ファイルを検索した結果を一括トリミングする。
※画像は編集後に上書き保存される
※幅:1000px/高さ:700px/水平方向(X)開始位置:100px/垂直方向(Y)開始位置:50pxで切り抜く場合

$ find ./TestGallery/ -name "*.jpg" -print0 | xargs -0 mogrify -crop 1000x700+100+50

ファイルを検索した結果を一括リサイズする。
※画像は編集後に上書き保存される
※50%の大きさにリサイズする場合

$ find ./TestGallery/ -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%

Ubuntu22.04で肥大化したqcow2を小さくする

virt-sparsifyを使用するためパッケージをインストール。

# apt install libguestfs-tools

下記のコマンドで小さくできる。シンプロビジョニングには/tmp/を使用するので空き容量に注意。

# virt-sparsify /path/to/vm/image.qcow2 /path/to/vm/image2.qcow2

Ubuntu22.04でのOpenVPNサーバーの設定

前提条件

※tun(ルーティング)方式で設定する
※自宅用なのでセキュリティリスク(CAの秘密鍵へのアクセス)を承知した上でOpenVPNサーバーとCAを同じマシンにインストールする

・ Ubuntu: 22.04.1
・ openvpn: 2.5.5
・ easy-rsa: 3.0.8
・ openssl: 3.0.2

サーバー設定手順

openvpnとeasy-rsaをインストールする。

# apt install openvpn easy-rsa

ルート証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CA_EXPIRE=7300

公開鍵基盤(PKI)を初期化して認証局(CA)を設置する。CA作成時に秘密鍵のパスフレーズを聞いてくる。このパスフレーズは新しい証明書発行時に必要になる。

# cd /usr/share/easy-rsa/
# ./easyrsa init-pki
# ./easyrsa build-ca

認証局(CA)が発行する証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_EXPIRE=3650

VPNサーバー用の証明書を作成する。
※パスフレーズは不要なのでnopassを指定

# ./easyrsa build-server-full vpn.example.com nopass

Diffie-Hellmanパラメーターファイルを作成する。

# ./easyrsa gen-dh

TLS-AuthのHMACに使用する共通鍵を作成する。

# openvpn --genkey secret /etc/openvpn/server/ta.key

OpenVPNサーバーの設定ファイルをサンプルからコピーする。

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/

設定ファイルを下記のように変更する。
※重要そうな箇所のみ記載
※serverにはクライアントに割り当てられるipアドレスを定義
※push(route)にはクライアントにアクセスを許可するサーバーのプライベートネットワークを指定
※push(redirect-gateway)でクライアントのIPトラフィックがVPNを通過するよう設定
※push(dhcp-option DNS)でクライアントが使用するDNSサーバーを指定
※client-to-clientでクライアント同士の通信を許可
※duplicate-cnで同じ証明書を使用した複数のクライアント接続を許可(非推奨)

port 7716
proto udp
dev tun
ca /usr/share/easy-rsa/pki/ca.crt
cert /usr/share/easy-rsa/pki/issued/vpn.example.com.crt
key /usr/share/easy-rsa/pki/private/vpn.example.com.key
dh /usr/share/easy-rsa/pki/dh.pem
server 172.16.1.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.1.11"
push "dhcp-option DNS 8.8.8.8"
client-to-client
duplicate-cn
tls-auth server/ta.key 0

IPフォワードを有効にして、異なるネットワーク(NIC)間でパケットが転送されるように設定変更する。

# sed -i "s/#net.ipv4.ip_forward/net.ipv4.ip_forward/g" /etc/sysctl.conf
# sysctl -p

iptablesでIPマスカレードを有効に設定する。

# apt install iptables-persistent
# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o [デバイス] -j MASQUERADE
# netfilter-persistent save

サービスを有効化して起動する。

# systemctl enable --now openvpn@server

クライアント証明書の発行

クライアントに配る*.ovpnを作成するのが面倒なのでスクリプトを作成した。地味にハマったポイントはTLS-Authの「key-direction 1」サーバーの設定が0なら1にする必要がある。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa
sample_config_location=/usr/share/doc/openvpn/examples/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "作成するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
echo "クライアント接続設定ファイル「$id.ovpn」を作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa build-client-full $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にしてスクリプトを実行すれば対話型でクライアント用の*.ovpnを作成できる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x build-client-ovpn.sh
# ./build-client-ovpn.sh

クライアント証明書の更新

更新が可能になる期間を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_RENEW=365

これも面倒なので更新用のスクリプトを作成した。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa
sample_config_location=/usr/share/doc/openvpn/examples/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "更新するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
if [ ! -f "$easyrsa_location/pki/issued/$fullname.crt" ]; then
    echo "既存の証明書が見つかりませんでした。"
    exit 1
fi
echo "クライアント接続設定ファイル「$id.ovpn」を再作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa renew $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にすれば対話型で更新ができる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x renew-client-ovpn.sh
# ./renew-client-ovpn.sh

AlmaLinux9でのOpenVPNサーバーの設定

前提条件

※tun(ルーティング)方式で設定する
※自宅用なのでセキュリティリスク(CAの秘密鍵へのアクセス)を承知した上でOpenVPNサーバーとCAを同じマシンにインストールする

・ AlmaLinux: 9.1
・ openvpn: 2.5.8-1
・ easy-rsa: 3.0.8-3
・ openssl: 3.0.1-43

サーバー設定手順

openvpnとeasy-rsaをインストールする。

# dnf install epel-release
# dnf install openvpn easy-rsa

ルート証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CA_EXPIRE=7300

公開鍵基盤(PKI)を初期化して認証局(CA)を設置する。CA作成時に秘密鍵のパスフレーズを聞いてくる。このパスフレーズは新しい証明書発行時に必要になる。
※このときのopensslにはバグがあり2度パスフレーズを聞かれるが最初のは無視される

# cd /usr/share/easy-rsa/3.0.8/
# ./easyrsa init-pki
# ./easyrsa build-ca

認証局(CA)が発行する証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_EXPIRE=3650

VPNサーバー用の証明書を作成する。
※パスフレーズは不要なのでnopassを指定

# ./easyrsa build-server-full vpn.example.com nopass

Diffie-Hellmanパラメーターファイルを作成する。

# ./easyrsa gen-dh

TLS-AuthのHMACに使用する共通鍵を作成する。

# openvpn --genkey secret /etc/openvpn/server/ta.key

OpenVPNサーバーの設定ファイルをサンプルからコピーする。

# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/

設定ファイルを下記のように変更する。
※重要そうな箇所のみ記載
※serverにはクライアントに割り当てられるipアドレスを定義
※push(route)にはクライアントにアクセスを許可するサーバーのプライベートネットワークを指定
※push(redirect-gateway)でクライアントのIPトラフィックがVPNを通過するよう設定
※push(dhcp-option DNS)でクライアントが使用するDNSサーバーを指定
※client-to-clientでクライアント同士の通信を許可
※duplicate-cnで同じ証明書を使用した複数のクライアント接続を許可(非推奨)

port 7716
proto udp
dev tun
ca /usr/share/easy-rsa/3.0.8/pki/ca.crt
cert /usr/share/easy-rsa/3.0.8/pki/issued/vpn.example.com.crt
key /usr/share/easy-rsa/3.0.8/pki/private/vpn.example.com.key
dh /usr/share/easy-rsa/3.0.8/pki/dh.pem
server 172.16.1.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.1.11"
push "dhcp-option DNS 8.8.8.8"
client-to-client
duplicate-cn
tls-auth ta.key 0

IPフォワードを有効にして、異なるネットワーク(NIC)間でパケットが転送されるように設定変更する。

# echo -e "\n# Controls IP packet forwarding\nnet.ipv4.ip_forward = 1" >>/etc/sysctl.conf
# sysctl -p

ファイアウォールに使用するポートを例外登録し、IPマスカレードも有効に設定する。

# firewall-cmd --permanent --add-port=7716/udp
# firewall-cmd --permanent --add-masquerade
# firewall-cmd --reload

SELinuxのポリシー変更を行うためのユーティリティをインストールする。

# dnf install policycoreutils-python-utils

SELinuxがopenvpnに通信許可するポートを追加する。
※-lオプションで確認したタイプ名はopenvpn_port_t

# semanage port -t openvpn_port_t -a -p udp 7716

サービスを有効化して起動する。

# systemctl enable --now openvpn-server@server

クライアント証明書の発行

クライアントに配る*.ovpnを作成するのが面倒なのでスクリプトを作成した。地味にハマったポイントはTLS-Authの「key-direction 1」サーバーの設定が0なら1にする必要がある。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa/3.0.8
sample_config_location=/usr/share/doc/openvpn/sample/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "作成するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
echo "クライアント接続設定ファイル「$id.ovpn」を作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa build-client-full $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にしてスクリプトを実行すれば対話型でクライアント用の*.ovpnを作成できる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x build-client-ovpn.sh
# ./build-client-ovpn.sh

クライアント証明書の更新

更新が可能になる期間を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_RENEW=365

これも面倒なので更新用のスクリプトを作成した。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa/3.0.8
sample_config_location=/usr/share/doc/openvpn/sample/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "更新するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
if [ ! -f "$easyrsa_location/pki/issued/$fullname.crt" ]; then
    echo "既存の証明書が見つかりませんでした。"
    exit 1
fi
echo "クライアント接続設定ファイル「$id.ovpn」を再作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa renew $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にすれば対話型で更新ができる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x renew-client-ovpn.sh
# ./renew-client-ovpn.sh

Windows11のPowerShellスクリプトでVPNサーバーに接続する

・VPNサーバーに接続できるよう事前に設定
・接続名は「会社」とする

下記のように設定ファイルを編集して確認を表示せずに接続するよう変更。

…
PreviewUserPw=0
…

PowerShellスクリプトを適当な名前で作成する。

$connectionName = "会社"
$result = ipconfig | Select-String $connectionName
if ($result -like "*" + $connectionName + "*") {
    echo "ok"
} else {
    rasphone -d $connectionName
}

下記のような感じで実行する。

powershell -ExecutionPolicy RemoteSigned -File connect-vpn.ps1

ffmpegの基本的な使い方

動画をリサイズする。

$ ffmpeg -i source.mp4 -vf scale=1280:-1 destination.mp4

開始位置と秒数を指定して動画をトリミングする。

$ ffmpeg -i source.mp4 -ss 0:10 -t 30 destination.mp4

開始位置と終了位置を指定して動画をトリミングする。

$ ffmpeg -i source.mp4 -ss 0:10 -to 0:40 destination.mp4

元ファイルのコーデックを使用して動画を連結する。

$ echo -e "file 'source1.mp4'\nfile 'source2.mp4'\n" >ffmpeg_files.txt
$ ffmpeg -f concat -i ffmpeg_files.txt -c copy destination.mp4
$ rm ffmpeg_files.txt

フレームレートを指定して動画をgifに変換する。

$ ffmpeg -i source.mp4 -r 20 destination.gif