20200704のLinuxに関する記事は10件です。

bash で タブ補完するときに大文字小文字を区別しないようにする

echo 'set completion-ignore-case On' >> ~/.inputrc

あるいは

echo "bind 'set completion-ignore-case on'" >> ~/.bashrc

Raspberry Pi OS 10.4 で検証

参考: Can I make Tab auto-completion case-insensitive in Bash?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UNIX / Linuxについて「とりあえず」部分を理解する

この記事の目的

UNIX、Linuxについて「とりあえず」の部分を理解すること。

これについてまとめようと思ったきっかけは、環境構築作業中のエラー。
ターミナルの表示をカスタマイズしようと設定ファイルをいじっていた時に、異なるLinuxディストリビューションの書き方のコードを入れたことが原因だった。らしい。

...Linuxディストリビューションってなんだ?
そもそもLinuxも、OSだってことしか知らない...!

調べていると色んなワードが出てきて混乱しそうになったので、個人的に「ひとまずこれだけ分かれば良いかしら?」という部分をまとめました。

Linuxとは

  • 1991年に開発されたOS
  • オープンソースソフトウェアで、無料かつ自由に改変や配布が可能
  • UNIXを参考にリーナス・トーバルズ氏によって開発されたから、「Linux」
  • 他のOSと比較して、低い性能のコンピュータでも軽快に動く特徴がある
  • パソコンやスマートフォン、サーバーで多く利用されている
  • Amazon AWSのAmazon Linux、Rasberry PiのRaspbian、Androidは、LinuxベースのOS

...あれ?そういえば、Linuxって自分でインストールした覚えがないのに、「Linuxコマンド集」に載っているcdとかlsとか使っている。なぜ?

「LinuxはUNIXを参考に作られた」というところがミソのようです。
UNIXについても特徴を調べてみます。

UNIXって?

  • 1969年に開発されたOS
  • 企業が開発しており有償で、知的財産権が企業に属している
  • 安定性が高く、長時間にわたって動かす必要のある大型計算機やネットワークサーバーのOSとして利用されることが多い
  • macOSはBSD系UNIXベース

なるほど、macOSはUNIXをベースに作られているから、コマンドもほとんど同じということのようです。

ただし、オプションの書き方や意味が異なることが多いようなので、オプション付きコマンドを参考にするときは特に、UNIXコマンドなのかLinuxコマンドなのか確認した方が良さそうですね。

もしmacOSで「参考教材がLinuxコマンドを使っていて不便だな...」というときは、GNU coreutilsというパッケージを入れることで、UNIXベースOSのまま、基本的なLinuxコマンドを使えるようになるようです。(便利!)
導入方法はこちらの記事が参考になりそうです。
テキスト処理のための標準的なコマンド群の macOS への導入手順

また、「BSD系」とは、UNIXベースのOSのうち、特にBSD(Berkeley Software Distribution)をもとにして開発されているOSのこと、らしいです。

「Linux」という言葉は、2つの意味に分けられて使われる

  1. 狭義のLinux:Linuxカーネル
  2. 広義のLinux:Linuxディストリビューション

厳密にいうと、「Linuxカーネル」のことを指しているようです。

Linuxカーネルって?

OSの機能の根幹となる部分
CPU、キーボードといったハードウェアと、Finder、Safariといったアプリケーションを結びつける役割を担っている大事な部分。

Linuxディストリビューションって?

LPI-JAPANの記事では、こう説明されています。

Linuxディストリビューションとは、Linuxカーネルと、ユーザインターフェイスなどさまざまなプログラムをひとまとめにし、OSとしてユーザがすぐに使えるようにまとめたもののことを指します。

つまりLinuxディストリビューションは、Linuxカーネルとアプリケーションやツールがひとまとめになって配布されているパッケージということ。

Linuxディストリビューションの流派

Linuxはオープンソースですから、いろんな企業が改変していった結果、3つの流派に分かれるそうです。

  • RedHat系
    • RedHat社開発している、ディストリビューション
    • 有償のRHEL(RedHat Enterprise Linux)と、そのクローンの無償OSがある
  • Debian系
    • オープンソースのディストリビューション
    • ユーザーフレンドリー
  • Slackware系
    • 安全性、セキュリティ、速さが特徴のディストリビューション
    • 公式配布されている状態が一つの完成形となっており、ソフトウェアの追加などカスタマイズして使う場合はユーザーの判断と操作に依存するので比較的難易度が高いと言われる

具体的なLinuxディストリビューションの例

  • RedHat系
    • RedHatEnterpriseLinux
      • 有償だが、技術的なサポートや長期的で的確なセキュリティーフィックスなどが受けられる
    • CentOS
      • RedHatLinuxの、有償部分を取り除いたもの
      • 企業が使用するメジャーなOSの一つ
    • Fedora
      • 最新の技術をどんどん取り組む
  • Debian系
    • Debian
      • Ubuntuの元となった
      • 企業が使用するメジャーなOSの一つ
    • Ubuntu
      • インストールするとすぐに使える
      • 情報も豊富にあり、初心者向け
      • 企業が使用するメジャーなOSの一つ
    • Linux mint
      • Ubuntuから派生
      • 難しい設定が不要で、簡単に使える
      • MicrosoftOfficeに似た機能を持ったOfficeアプリケーションも付随している
    • elementaryOS
      • Ubuntuから派生
    • ZorinOS
      • Ubuntuから派生
  • Slackware系
    • Slackware
      • 老舗
      • 使いこなすには、Unix/Linuxの運用管理に必要な基礎知識が必要

寄り道:GNU/Linuxって?

調べていると、「GNU/Linux」という表記も度々目にしました。
これはなんでしょう? wikipediaから文章を引用します。

GNU/Linuxシステム(ないしGNU/Linuxオペレーティングシステム、略してGNU/Linux)は、一般に「Linux」と呼ばれているものが、GNUプロジェクトによるソフトウェアを数多く利用しており、glibcやbashのような重要なライブラリやソフトウェアはGNUが開発しているとして、その呼称としてGNUプロジェクト側が主張している呼称である。

wikipediaには「GNU/Linux名称論争」なんてページもありますが、GNUプロジェクトが開発したソフトウェアを多く含んだLinuxディストリビューションは、GNU/Linuxと呼ばれることもあると思っていればいいのかなと思いました。

まとめ:UNIXはLinuxの先輩OS

スクリーンショット 2020-07-04 20.19.29.png

  • LinuxはUNIXを元に作られた
  • UNIXとLinuxの大きな違いは、「有償で知的財産権が開発企業に属しているか、オープンソースで無償で改変や配布ができるか」
  • UNIXとLinuxでコマンドは同一のものが多いが、オプションの意味が異なる場合がある
  • GNU coreutilsというパッケージを導入すると、UNIX系OSでもLinuxコマンドが使えるようになる
  • Linuxは、OSの根幹となる「Linuxカーネル」と、アプリケーションとひとまとめにした「Linuxディストリビューション」の2つの意味を持つ

実務で役立ちそうな関連記事

参考サイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UNIX / Linuxについて「とりあえず」理解する

この記事の目的

UNIX、Linuxについて「とりあえず」の部分を理解すること。

これについてまとめようと思ったきっかけは、環境構築作業中のエラー。
ターミナルの表示をカスタマイズしようと設定ファイルをいじっていた時に、異なるLinuxディストリビューションの書き方のコードを入れたことが原因だった。らしい。

...Linuxディストリビューションってなんだ?
そもそもLinuxも、OSだってことしか知らない...!

調べていると色んなワードが出てきて混乱しそうになったので、個人的に「ひとまずこれだけ分かれば良いかしら?」という部分をまとめました。

Linuxとは

  • 1991年に開発されたOS
  • オープンソースソフトウェアで、無料かつ自由に改変や配布が可能
  • UNIXを参考にリーナス・トーバルズ氏によって開発されたから、「Linux」
  • 他のOSと比較して、低い性能のコンピュータでも軽快に動く特徴がある
  • パソコンやスマートフォン、サーバーで多く利用されている
  • Amazon AWSのAmazon Linux、Rasberry PiのRaspbian、Androidは、LinuxベースのOS

...あれ?そういえば、Linuxって自分でインストールした覚えがないのに、「Linuxコマンド集」に載っているcdとかlsとか使っている。なぜ?

「LinuxはUNIXを参考に作られた」というところがミソのようです。
UNIXについても特徴を調べてみます。

UNIXって?

  • 1969年に開発されたOS
  • 企業が開発しており有償で、知的財産権が企業に属している
  • 安定性が高く、長時間にわたって動かす必要のある大型計算機やネットワークサーバーのOSとして利用されることが多い
  • macOSはBSD系UNIXベース

なるほど、macOSはUNIXをベースに作られているから、コマンドもほとんど同じということのようです。

ただし、オプションの書き方や意味が異なることが多いようなので、オプション付きコマンドを参考にするときは特に、UNIXコマンドなのかLinuxコマンドなのか確認した方が良さそうですね。

もしmacOSで「参考教材がLinuxコマンドを使っていて不便だな...」というときは、GNU coreutilsというパッケージを入れることで、UNIXベースOSのまま、基本的なLinuxコマンドを使えるようになるようです。(便利!)
導入方法はこちらの記事が参考になりそうです。
テキスト処理のための標準的なコマンド群の macOS への導入手順

また、「BSD系」とは、UNIXベースのOSのうち、特にBSD(Berkeley Software Distribution)をもとにして開発されているOSのこと、らしいです。

「Linux」という言葉は、2つの意味に分けられて使われる

  1. 狭義のLinux:Linuxカーネル
  2. 広義のLinux:Linuxディストリビューション

厳密にいうと、「Linuxカーネル」のことを指しているようです。

Linuxカーネルって?

OSの機能の根幹となる部分
CPU、キーボードといったハードウェアと、Finder、Safariといったアプリケーションを結びつける役割を担っている大事な部分。

Linuxディストリビューションって?

LPI-JAPANの記事では、こう説明されています。

Linuxディストリビューションとは、Linuxカーネルと、ユーザインターフェイスなどさまざまなプログラムをひとまとめにし、OSとしてユーザがすぐに使えるようにまとめたもののことを指します。

つまりLinuxディストリビューションは、Linuxカーネルとアプリケーションやツールがひとまとめになって配布されているパッケージということ。

Linuxディストリビューションの流派

Linuxはオープンソースですから、いろんな企業が改変していった結果、3つの流派に分かれるそうです。

  • RedHat系
    • RedHat社開発している、ディストリビューション
    • 有償のRHEL(RedHat Enterprise Linux)と、そのクローンの無償OSがある
  • Debian系
    • オープンソースのディストリビューション
    • ユーザーフレンドリー
  • Slackware系
    • 安全性、セキュリティ、速さが特徴のディストリビューション
    • 公式配布されている状態が一つの完成形となっており、ソフトウェアの追加などカスタマイズして使う場合はユーザーの判断と操作に依存するので比較的難易度が高いと言われる

具体的なLinuxディストリビューションの例

  • RedHat系
    • RedHatEnterpriseLinux
      • 有償だが、技術的なサポートや長期的で的確なセキュリティーフィックスなどが受けられる
    • CentOS
      • RedHatLinuxの、有償部分を取り除いたもの
      • 企業が使用するメジャーなOSの一つ
    • Fedora
      • 最新の技術をどんどん取り組む
  • Debian系
    • Debian
      • Ubuntuの元となった
      • 企業が使用するメジャーなOSの一つ
    • Ubuntu
      • インストールするとすぐに使える
      • 情報も豊富にあり、初心者向け
      • 企業が使用するメジャーなOSの一つ
    • Linux mint
      • Ubuntuから派生
      • 難しい設定が不要で、簡単に使える
      • MicrosoftOfficeに似た機能を持ったOfficeアプリケーションも付随している
    • elementaryOS
      • Ubuntuから派生
    • ZorinOS
      • Ubuntuから派生
  • Slackware系
    • Slackware
      • 老舗
      • 使いこなすには、Unix/Linuxの運用管理に必要な基礎知識が必要

寄り道:GNU/Linuxって?

調べていると、「GNU/Linux」という表記も度々目にしました。
これはなんでしょう? wikipediaから文章を引用します。

GNU/Linuxシステム(ないしGNU/Linuxオペレーティングシステム、略してGNU/Linux)は、一般に「Linux」と呼ばれているものが、GNUプロジェクトによるソフトウェアを数多く利用しており、glibcやbashのような重要なライブラリやソフトウェアはGNUが開発しているとして、その呼称としてGNUプロジェクト側が主張している呼称である。

wikipediaには「GNU/Linux名称論争」なんてページもありますが、GNUプロジェクトが開発したソフトウェアを多く含んだLinuxディストリビューションは、GNU/Linuxと呼ばれることもあると思っていればいいのかなと思いました。

まとめ:UNIXはLinuxの先輩OS

スクリーンショット 2020-07-04 20.19.29.png

  • LinuxはUNIXを元に作られた
  • UNIXとLinuxの大きな違いは、「有償で知的財産権が開発企業に属しているか、オープンソースで無償で改変や配布ができるか」
  • UNIXとLinuxでコマンドは同一のものが多いが、オプションの意味が異なる場合がある
  • GNU coreutilsというパッケージを導入すると、UNIX系OSでもLinuxコマンドが使えるようになる
  • Linuxは、OSの根幹となる「Linuxカーネル」と、アプリケーションとひとまとめにした「Linuxディストリビューション」の2つの意味を持つ

実務で役立ちそうな関連記事

参考サイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

curlを使ってjavascriptを有効にした場合のhtmlソースを取得する

domcurlというツールがあります。webscrapingに非常に便利なツールです。phantomjsなどで要件を満たせない場合におすすめです。

domcurlはPuppeteerを使う小さなNodeJSアプリケーションで、 npm i domcurlコマンドを発行することでインストールできます。 curlコマンドのように、簡単なdomcurl [url]を発行してリソースを取得し、JSをページ上で実行することができます。

https://paul.kinlan.me/domcurl/

$ npm i domcurl
$ ./node_modules/domcurl/index.js  --url https://example.com
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

man nftables 日本語訳

man nftables で表示されるマニュアルの日本語訳。

名前

nft - パケットのフィルタリングと分類を目的とする nftables フレームワークの管理ツール

概要

nft [ -nNscae ] [ -I directory ] [ -f filename | -i | cmd ...]
nft -h
nft -v

説明

nft は nftables フレームワークの Linux カーネルでパケットフィルタリングおよび分類ルールを設定、管理、検査するために使用されるコマンドラインツールです。
Linux カーネルサブシステムは nf_tables として知られており、 nfNetfilter を表します。

オプション

オプションの完全な要約を見るには、 nft --help を実行してください。

  • -h, -help ヘルプメッセージとすべてのオプションを表示します。
  • -v, -version バージョンを表示します。
  • -n, -numeric データを数値で表示します。 1 回指定すると(デフォルトの動作)、アドレスからシンボル名への変換をスキップします。 インターネットサービス(ポート番号)を数値で表示するには、 2 回指定します。 3 回指定して、プロトコルと UID / GID を数値で表示します。
  • -N, -reversedns IP アドレスを名前に変換します。通常、 DNS ルックアップにはネットワークトラフィックが必要です。
  • -s, -stateless ルールとステートフルオブジェクトの状態情報を省略します。
  • -c, -check 実際に変更を適用せずにコマンドの有効性を確認します。
  • -a, -handle 出力にオブジェクトハンドルを表示します。
  • -e, -echo add, insert, replace コマンドを使用してルールセットにアイテムを挿入する際に、 nft モニターと同様に通知を表示します。
  • -I, -includepath directory 引数 directory に指定したディレクトリを、インクルードファイルを検索するディレクトリのリストに追加します。 このオプションは複数回指定できます。
  • -f、-file filename ファイル名から入力を読み取ります。 ファイル名が - の場合、標準入力から読み取ります。 nft スクリプトは #!/usr/sbin/nft -f から開始する必要があります。
  • -i, -interactive 対話型の readline CLI から入力を読み取ります。 quit を使用して終了するか、 EOF マーカーを使用できます。 通常、 EOF マーカーは CTRL-D です。

入力ファイル形式

語彙規約

入力は行ごとに解析されます。
行の最後の文字(改行文字の直前)が引用符で囲まれていないバックスラッシュ( \ )の場合、次の行は継続として扱われます。
同じ行にある複数のコマンドは、セミコロン( ; )を使用して区切ることができます。

ハッシュ記号( #)はコメントを開始します。
同じ行の後続の文字はすべて無視されます。

識別子は英字(a-z, A-Z)で始まり、 0 個以上の英数字(a-z, A-Z, 0-9)と、スラッシュ( / )、バックスラッシュ( \ )、アンダースコア( _ )、ドット( . )の文字が続きます。
異なる文字を使用したり、キーワードと競合する識別子は、二重引用符( " )で囲む必要があります。

ファイルの読込

include ステートメントを使用して、他のファイルを読込むことができます。
インクルードファイルを検索するディレクトリは、 -I/--includepath オプションを使用して指定できます。
この動作を上書きするには、パスの先頭に ./ を追加して、現在の作業ディレクトリにあるファイル(つまり相対パス)を強制的に含めるか、 / 絶対パスで表されるファイルの場所を指定します。

-I/--includepath が指定されていない場合、 nft はコンパイル時に指定されたデフォルトのディレクトリを使用します。
このデフォルトのディレクトリは -h/--help オプションで取得できます。

include ステートメントは、通常のシェルワイルドカード記号( * , ? , [] )をサポートします。
include ステートメントでワイルドカード記号が使用されている場合、 include ステートメントに一致するものが存在しない場合でもエラーになりません。
これにより、 include /etc/firewall/rules/* のような空かもしれない include ディレクトリを指定することができます。
ワイルドカードの一致はアルファベット順に読み込まれます。
ドット( . )で始まるファイルは、 include ステートメントでは一致しません。

変数記号

変数式の定義

$variable

変数記号は、 define ステートメントを使用して定義できます。
変数参照は式であり、他の変数を初期化するために使用できます。
定義のスコープは、現在のブロックとその中に含まれるすべてのブロックです。

変数の使用例
define int_if1 = eth0
define int_if2 = eth1
define int_ifs = { $int_if1, $int_if2 }

filter input iif $int_ifs accept

アドレスファミリ

アドレスファミリは、処理されるパケットの種類を決定します。
各アドレスファミリに対して、カーネルには、パケット処理過程の特定の段階を表すフックが含まれています。
これらのフックは、フックのルールが存在する場合に nftables を呼び出します。

  • ip: IPv4アドレスファミリ。
  • ip6: IPv6アドレスファミリ。
  • inet: インターネット(IPv4 / IPv6)アドレスファミリ。
  • arp: ARPアドレスファミリ。 IPv4 ARP パケットを処理する。
  • bridge: ブリッジアドレスファミリ。ブリッジデバイスを通過するパケットを処理します。
  • netdev: Netdev アドレスファミリ。入力からのパケットを処理します。

すべての nftables オブジェクトはアドレスファミリ固有の名前空間に存在するため、すべての識別子にはアドレスファミリが含まれます。
アドレスファミリなしで識別子を指定すると、デフォルトで ip ファミリが使用されます。

IPV4 / IPV6 / INET アドレスファミリ

IPv4 / IPv6 / Inet アドレスファミリは、 IPv4, IPv6 または両方のタイプのパケットを処理します。
これらには、ネットワークスタックの異なるパケット処理段階で 5 つのフックが含まれています。

IPv4 / IPv6 / Inet アドレスファミリーフック

フック 説明
prerouting システムに入るすべてのパケットは、 prerouting フックによって処理されます。これはルーティングプロセスの前に呼び出され、ルーティングに影響するパケット属性の早期フィルタリングまたは変更に使用されます。
input ローカルシステムに配信されたパケットは、 input フックによって処理されます。
forward 別のホストに転送されたパケットは、 forward フックによって処理されます。
output ローカルプロセスによって送信されたパケットは、 output フックによって処理されます。
postrouting システムを出るすべてのパケットは、 postrouting フックによって処理されます。

ARPアドレスファミリ

ARP アドレスファミリは、システムが送受信する ARP パケットを処理します。
これは通常、クラスタリングのために ARP パケットをマングルするために使用されます。

ARP アドレスファミリーフック

フック 説明
input ローカルシステムに配信されたパケットは、 input フックによって処理されます。
output ローカルシステムによって送信されたパケットは、 output フックによって処理されます。

ブリッジアドレスファミリ

ブリッジアドレスファミリは、ブリッジデバイスを通過するイーサネットパケットを処理します。

サポートされるフックのリストは、上記の IPv4 / IPv6 / Inet アドレスファミリーと同じです。

NETDEV アドレスファミリ

Netdev アドレスファミリは、入力からのパケットを処理します。

Netdev アドレスファミリーフック

フック 説明
ingress システムに入るすべてのパケットは、このフックによって処理されます。レイヤ 3 プロトコルハンドラの前に呼び出され、早期のフィルタリングとポリシングに使用できます。

ルールセット

{list | flush} ruleset [family]
export [ruleset] format

ruleset キーワードは、現在カーネルに配置されているテーブル、チェーンなどのセット全体を識別するために使用されます。
次のルールセットコマンドが存在します。

  • list: 人間が読める形式でルールセットを表示します。
  • flush: ルールセット全体をクリアします。 iptables とは異なり、これはすべてのテーブルとそれらに含まれるすべてのものを削除し、実質的に空のルールセットになることに注意してください。 パケットフィルタリングはもはや発生しないため、カーネルは受信する有効なパケットを全て受け入れます。
  • export: 機械可読形式でルールセットを表示します。 必須のフォーマットパラメータは、 xml または json のいずれかです。

リストを制限し、特定のアドレスファミリのみフラッシュすることが可能です。
有効なファミリ名のリストについては、上記の アドレスファミリ を参照してください。

想定とは逆に、 export によって生成された出力は nft -f では解析できないことに注意してください。
代わりに list コマンドの出力がその目的に役立ちます。

テーブル

{add | create} table [family] table [ { flags flags } ]
{delete | list | flush} table [family] table
delete table [family] handle handle

テーブルは、チェーン、セット、およびステートフルオブジェクトのコンテナです。
それらは、アドレスファミリと名前によって識別されます。
アドレスファミリは、 ip, ip6, inet, arp, bridge, netdev のいずれかである必要があります。
inet アドレスファミリは、ハイブリッド IPv4 / IPv6 テーブルを作成するために使用されるダミーファミリです。
メタ表現 nfproto キーワードを使用して、パケットが処理されているファミリー(IPv4 または IPv6)コンテキストをテストできます。
アドレスファミリーが指定されていない場合、デフォルトで ip が使用されます。
add と create の唯一の違いは、 create がエラーを返す一方で、指定されたテーブルがすでに存在する場合、 add はエラーを返さないことです。

テーブルフラグ

フラグ 説明
dormant テーブルは評価されません(ベースチェーンは登録されていません)
テーブルを追加、変更、削除する例
# 対話モードで nft を起動
nft --interactive

# 新しいテーブルを作成します。
create table inet mytable

# 新しいベースチェーンを追加: 入力パケットを取得
add chain inet mytable myin { type filter hook input priority 0; }

# チェーンに単一のカウンターを追加
add rule inet mytable myin counter

# テーブルを一時的に無効にする(ルールは評価されない)
add table inet mytable { flags dormant; }

# テーブルを再びアクティブにします:
add table inet mytable
  • add: 指定された名前の指定されたファミリの新しいテーブルを追加します。
  • delete: 指定したテーブルを削除します。
  • list: 指定したテーブルのすべてのチェーンとルールを一覧表示します。
  • flush: 指定したテーブルのすべてのチェーンとルールをフラッシュします。

チェーン

{add | create} chain [family] table chain [ { type type hook hook [device device] priority priority ; [policy policy ;] } ]
{delete | list | flush} chain [family] table chain
delete chain [family] table handle handle
rename chain [family] table chain newname

チェーンはルールのコンテナです。
チェーンは 2 種類、ベースチェーンとレギュラーチェーンで存在します。
ベースチェーンはネットワーキングスタックからのパケットのエントリポイントです。
レギュラーチェーンはジャンプターゲットとして使用でき、より良いルール編成に使用されます。

  • add: 指定したテーブルに新しいチェーンを追加します。 フックと優先度の値が指定されると、チェーンはベースチェーンとして作成され、ネットワークスタックにフックされます。
  • create: add コマンドに似ていますが、チェーンがすでに存在する場合はエラーを返します。
  • delete: 指定したチェーンを削除します。 チェーンにはルールを含めたり、ジャンプターゲットとして使用しないでください。
  • rename: 指定したチェーンの名前を変更します。
  • list: 指定したチェーンのすべてのルールを一覧表示します。
  • flush: 指定したチェーンのすべてのルールをフラッシュします。

ベースチェーンの場合、タイプ、フック、優先度のパラメーターは必須です。

サポートされるチェーンタイプ

タイプ ファミリー フック 説明
filter all all 迷わず使えるスタンダードチェーンタイプ。
nat ip, ip6 prerouting, input, output, postrouting このタイプのチェーンは、 conntrack エントリに基づいてネットワークアドレス変換を実行します。接続の最初のパケットだけが実際にこのチェーンを通過します。そのルールは通常、作成された conntrack エントリ(たとえば、 NAT ステートメント)の詳細を定義します。
route ip, ip6 output パケットがこのタイプのチェーンを通過し、受け入れようとしている場合、 IP ヘッダーの関連部分が変更されていれば、新しいルート検索が実行されます。これにより、たとえば nftables にポリシールーティングセレクターを実装します。

上記の特殊なケース(たとえば、 nat タイプが forward フックをサポートしていない、または route タイプが output フックのみをサポートしている)とは別に、注目に値するさらに 2 つの癖があります。

  • netdev ファミリは、単一の組み合わせ、つまり filter タイプと input フックのみをサポートします。
    このファミリのベースチェーンは、受信インターフェイスごとに存在するため、デバイスパラメータが存在することも必要です。

  • arp ファミリーは、 filter タイプのチェーンで、 input フックと output フックのみをサポートします。

priority パラメータは、同じフック値を持つチェーンがトラバースされる順序を指定する符号付き整数値を受け入れます。
順序は昇順です。つまり低い優先度の値が高い値よりも優先されます。

ベースチェーンでは、チェーンのポリシーを設定することもできます。
ポリシーは、定義済みルールで明示的に受け入れられたり拒否されたりしていないパケットに何が起こるかを設定します。
サポートされるポリシー値は、accept (デフォルト)または drop です。

ルール

[add | insert] rule [family] table chain [ {handle | position} handle | index index] statement...
replace rule [family] table chain handle handle statement...
delete rule [family] table chain handle handle

指定されたテーブルのチェーンにルールが追加されます。
ファミリーが指定されていない場合は、 ip ファミリーが使用されます。
ルールは一連の文法規則に従って、 2 種類のコンポーネントから構成されます。
式とステートメントです。

add および insert コマンドは、任意の位置指定子をサポートします。
これは、既存のルールのハンドルまたはインデックス(ゼロから開始)のいずれかです。
内部的には、ルールの場所は常にハンドルによって識別され、インデックスからの変換はユーザー空間で行われます。
変換後に同時ルールセット変更が発生した場合、これには 2 つの潜在的な影響があります。
参照されたルールの前にルールが挿入または削除された場合、有効なルールインデックスが変更される可能性があります。
参照されたルールが削除された場合、無効なハンドルが指定された場合と同様に、コマンドはカーネルによって拒否されます。

  • add: ステートメントのリストで記述された新しいルールを追加します。 ハンドルが指定されていない限り、ルールは指定されたチェーンに追加されます。 ハンドルが指定されている場合、ルールはハンドルによって指定されたルールに追加されます。 代替名の位置は非推奨です。今後は使用しないでください。
  • insert: add コマンドと同様ですが、ルールはチェーンの最初または指定されたハンドルを持つルールの前に追加されます。
  • replace: add コマンドに似ていますが、指定されたルールを置き換えます。
  • delete: 指定したルールを削除します。
ipテーブルのinputチェーンにルールを追加する例
# 'ip filter' が想定されます
nft add rule filter output ip daddr 192.168.0.0/24 accept
# 同じコマンド、もう少し詳細
nft add rule ip filter output ip daddr 192.168.0.0/24 accept
inetテーブルからルールを削除する例
nft -a list ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy accept;
    ct state established,related accept # handle 4
    ip saddr 10.1.1.1 tcp dport ssh accept # handle 5
    ...

# handle 5 のルールを削除する。
nft delete rule inet filter input handle 5

セット

nftables は 2 種類のセットの概念を提供します。
匿名セットは、特定の名前を持たないセットです。
セットのメンバーは中括弧で囲まれ、セットを使用するルールの作成時に要素をコンマで区切ります。
そのルールが削除されると、セットも削除されます。
それらを更新することはできません。
つまり匿名セットが宣言されると、匿名セットを使用するルールを削除または変更しない限り、更新できなくなります。

匿名セットを使用して特定のサブネットとポートを受け入れる例
nft add rule filter input ip saddr { 10.0.0.0/8, 192.168.0.0/16 } tcp dport { 22, 443 } accept

名前付きセットは、ルールで参照する前に最初に定義する必要があるセットです。
匿名セットとは異なり、要素は名前付きセットにいつでも追加または削除できます。
セットはセット名の前に @ を付けてルールから参照されます。

名前付きセットを使用してアドレスとポートを受け入れる例
nft add rule filter input ip saddr @allowed_hosts tcp dport @allowed_ports accept

セット allowed_hosts および allowed_ports を最初に作成する必要があります。

次のセクションでは nft の set 構文について詳しく説明します。

add set [family] table set { type type ; [flags flags ;] [timeout timeout ;] [gc-interval gc-interval ;] [elements = { element[,...] } ;] [size size ;] [policy policy ;] [auto-merge auto-merge ;] }
{delete | list | flush} set [family] table set
delete set [family] table handle handle
{add | delete} element [family] table set { element[,...] }

セットはユーザー定義のデータ型の要素コンテナであり、ユーザー定義の名前によって一意に識別され、テーブルにアタッチされます。

  • add: 指定したテーブルに新しいセットを追加します。
  • delete: 指定したセットを削除します。
  • list: 指定されたセットの要素を表示します。
  • flush: 指定したセットからすべての要素を削除します。
  • add element 指定したセットに追加する要素のカンマ区切りのリスト。
  • delete element 指定したセットから削除する要素のカンマ区切りのリスト。

セット仕様

キーワード 説明 タイプ
type セット要素のデータ型 文字列: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark
flags フラグを設定する 文字列: constant, interval, timeout
timeout 要素がセット内に留まる時間。セットがパケットパス(ルールセット)から追加される場合は必須。 文字列: 10進数の後に単位(d, h, m, s)を付加する。
gc-interval ガベージコレクションの間隔。タイムアウトまたはフラグタイムアウトがアクティブな場合にのみ使用可能 文字列: 10進数の後に単位(d, h, m, s)を付加する。
elements セットに含まれる要素 データ型を設定する。
size セット内の要素の最大数。セットがパケットパス(ルールセット)から追加される場合は必須。 符号なし整数(64ビット)
policy ポリシーを設定する。 文字列: performance [default], memory
auto-merge 隣接 / 重複するセット要素の自動マージ(interval セットのみ)

マップ

add map [family] table map { type type [flags flags ;] [elements = { element[,...] };] [size size ;] [policy policy ;] }
{delete | list | flush} map [family] table map
{add | delete} element [family] table map { elements = { element[,...] } ; }

マップは入力として使用される特定のキーに基づいてデータを格納し、ユーザー定義の名前によって一意に識別され、テーブルに添付されます。

  • add: 指定したテーブルに新しいマップを追加します。
  • delete: 指定したマップを削除します。
  • list: 指定されたマップの要素を表示します。
  • flush: 指定されたマップからすべての要素を削除します。
  • add element 指定したマップに追加する要素のカンマ区切りのリスト。
  • delete element 指定したマップから削除する要素キーのカンマ区切りのリスト。

マップの仕様

キーワード 説明 タイプ
type マップ要素のデータ型 key_name:value の形式で指定する。 値として使用可能な型: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark, counter, quota。 couterquota はキー名として使用できません。
flags マップフラグ 文字列: constant, interval
elements マップに含まれる要素 マップデータ型
size マップ内の要素の最大数 符号なし整数(64ビット)
policy マップポリシー 文字列: performance [default], memory

フローテーブル

{add | create} flowtable [family] table flowtable { hook hook priority priority ; devices = { device[,...] } ; }
{delete | list} flowtable [family] table flowtable

フローテーブルを使用すると、ソフトウェアでのパケット転送を高速化できます。
フローテーブルエントリは、入力インターフェイス、送信元と宛先のアドレス、送信元と宛先のポート; レイヤー3 / 4 プロトコルで構成されるタプルで表されます。
各エントリは、宛先インターフェイスとゲートウェイアドレスをキャッシュし、宛先リンク層アドレスを更新して、パケットを転送します。
ttl および hoplimit フィールドも減少します。
したがってフローテーブルは、パケットが従来の転送パスをバイパスできるようにする代替パスを提供します。
フローテーブルは prerouting フックの前にある ingress フックにあります。
forward チェーンからのフローオフロード式を使用して、オフロードするフローを選択できます。
フローテーブルは、アドレスファミリと名前で識別されます。
アドレスファミリは ip, ip6, inet のいずれかである必要があります。
inet アドレスファミリは、ハイブリッド IPv4 / IPv6 テーブルを作成するために使用されるダミーファミリです。
アドレスファミリが指定されていない場合、デフォルトで ip が使用されます。

  • add: 指定された名前の指定されたファミリの新しいフローテーブルを追加します。
  • delete: 指定したフローテーブルを削除します。
  • list: すべてのフローテーブルを一覧表示します。

ステートフルオブジェクト

{add | delete | list | reset} type [family] table object
delete type [family] table handle handle

ステートフルオブジェクトはテーブルにアタッチされ、一意の名前で識別されます。
それらはルールからステートフルな情報をグループ化し、ルールでそれらを参照するためにキーワード type name が使用されます。
例: counter name

  • add: 指定されたテーブルに新しいステートフルオブジェクトを追加します。
  • delete: 指定したオブジェクトを削除します。
  • list: オブジェクトが保持するステートフル情報を表示します。
  • reset: ステートフルオブジェクトの一覧表示とリセットを実行します。

CT

ct helper helper { type type protocol protocol ; [l3proto family ;] }

ct helper は、 ct helper set ステートメントと組み合わせて使用​​できる接続追跡ヘルパーを定義するために使用されます。
type と protocol は必須です。
l3proto はデフォルトでテーブルファミリーから派生します。
つまりカーネルがサポートしている場合、カーネルは inet テーブルで IPv4 と IPv6 の両方のヘルパーバックエンドをロードしようとします。

conntrack ヘルパーの仕様

キーワード 説明 タイプ
type ヘルパータイプの名前 引用符付きの文字列(例: "ftp")
protocol ヘルパーのレイヤー 4 プロトコル 文字列(例: tcp)
l3proto ヘルパーのレイヤー 3 プロトコル アドレスファミリ(例: ip)

FTP ヘルパーの定義と割り当て

iptables とは異なり、ヘルパーの割り当ては、 conntrack 検索が完了した後に、たとえばデフォルトの 0 フック優先度で実行する必要があります。

table inet myhelpers {
  ct helper ftp-standard {
    type "ftp" protocol tcp
  }
  chain prerouting {
    type filter hook prerouting priority 0;
    tcp dport 21 ct helper set "ftp-standard"
  }
}

カウンター

counter [packets bytes]

カウンター仕様

キーワード 説明 タイプ
packets パケットの初期数 符号なし整数(64ビット)
bytes バイトの初期数 符号なし整数(64ビット)

クォータ

quota [over | until] [used]

クォータ仕様

キーワード 説明 タイプ
quota クォータ制限。クォータ名として使用されます。 符号なし整数(64ビット)と文字列(bytes, kbytes, mbytes)の 2 つの引数を指定する。 overuntil はこれらの引数の前にあります
used 使用済みクォータの初期値 符号なし整数(64ビット)と文字列(bytes, kbytes, mbytes)の 2 つの引数を指定する。

式は、ネットワークアドレス、ポート番号などの定数、またはルールセットの評価中にパケットから収集されたデータのいずれかの値を表します。
バイナリ式、論理式、リレーショナル式、およびその他のタイプの式を使用して式を組み合わせて、複雑な式またはリレーショナル(一致)式を形成できます。
これらは NAT、パケットマーキングなど、特定のタイプの操作の引数としても使用されます。

各式にはデータ型があり、これにより、シンボリック値のサイズ、解析、表現、および他の式との型の互換性が決まります。

DESCRIBE コマンド

describe expression

describe コマンドは、式のタイプとそのデータ型に関する情報を表示します。

$ nft describe tcp flags
payload expression, datatype tcp_flag (TCP flag) (basetype bitmask, integer), 8 bits

predefined symbolic constants:
fin                           0x01
syn                           0x02
rst                           0x04
psh                           0x08
ack                           0x10
urg                           0x20
ecn                           0x40
cwr                           0x80

データ型

データ型は、シンボリック値のサイズ、解析、表現、および式の型の互換性を決定します。
いくつかのグローバルデータタイプが存在し、さらにいくつかの式タイプは、その式タイプに固有の追加のデータ型を定義します。
ほとんどのデータ型は固定サイズですが、一部は動的サイズです。
(例: 文字列型)

型は、低次の型から派生できます。
IPv4 アドレスタイプは整数タイプから派生しています。
つまり IPv4 アドレスを整数値として指定することもできます。

特定のコンテキスト(セットおよびマップ定義)では、データ型を明示的に指定する必要があります。
各型には、このために使用される名前があります。

整数型

名前 キーワード サイズ ベースタイプ
Integer integer 可変 -

整数型は数値に使用されます。
10 進数、 16 進数、または 8 進数で指定できます。
整数型は固定サイズではなく、そのサイズは使用される式によって決定されます。

ビットマスク型

名前 キーワード サイズ ベースタイプ
Bitmask bitmask 可変 integer

ビットマスクにはビットマスクタイプ(bitmask)が使用されます。

文字列型

名前 キーワード サイズ ベースタイプ
String string 可変 -

文字列タイプは文字列に使用されます。
文字列は英字(a-zA-Z)で始まり、その後に 0 個以上の英数字または文字と記号( / , - , _ , . )が続きます。
さらに、二重引用符( " )で囲まれたものはすべて文字列として認識されます。

文字列型の指定

# インターフェース名
filter input iifname eth0

# 変わったインターフェース名
filter input iifname "(eth0)"

リンク層アドレス型

名前 キーワード サイズ ベースタイプ
Link layer address lladdr 可変 integer

リンク層アドレスタイプは、リンク層アドレスに使用されます。
リンク層アドレスは、コロン(:)を使用して区切られた 2 桁の 16 進数の可変数のグループとして指定されます。

リンク層アドレス指定
# イーサネット宛先 MAC アドレス
filter input ether daddr 20:c9:d0:43:12:d9

IPV4 アドレス型

名前 キーワード サイズ ベースタイプ
IPv4 address ipv4_addr 32ビット integer

IPv4 アドレスには IPv4 アドレスタイプが使用されます。
アドレスはドット付き 10 進数、ドット付き 16 進数、ドット付き 8 進数、 10 進数、 16 進数、 8 進数のいずれか、またはホスト名として指定されます。
ホスト名は、標準のシステムリゾルバーを使用して解決されます。

IPv4アドレス指定
# ドット 10 進表記
filter output ip daddr 127.0.0.1

# ホスト名
filter output ip daddr localhost

IPV6 アドレス型

名前 キーワード サイズ ベースタイプ
IPv6 address ipv6_addr 128ビット integer

IPv6 アドレスには IPv6 アドレスタイプが使用されます。
アドレスはホスト名として、またはコロンで区切られた 16 進数のハーフワードとして指定されます。
アドレスはポート番号と区別するために角括弧( [] )で囲まれる場合があります。

IPv6アドレスの指定
# 省略されたループバックアドレス
filter output ip6 daddr ::1

# 角括弧表記を使用した IPv6 アドレスの指定
# [] なしのポート番号(22)は、 ipv6 アドレスの一部として解析されます。
ip6 nat prerouting tcp dport 2222 dnat to [1ce::d0]:22

ブール型

名前 キーワード サイズ ベースタイプ
Boolean boolean 1 ビット integer

ブール型はユーザー空間における構文ヘルパー型です。
これは(通常は暗黙的な)関係式の右辺で、左辺の式をブール値チェック(通常は exists )に変更するために使用されます。

次のキーワードは、指定された値を持つブール型に自動的に解決されます。

キーワード
exists 1
missing 0

ブール仕様

次の式はブール比較をサポートしています。

動作
fib ルートの存在を確認する。
exthdr IPv6 拡張ヘッダーの存在を確認する。
tcp option TCP オプションヘッダーの存在を確認する。
# ルートが存在する場合に一致
filter input fib daddr . iif oif exists

# IPv6 トラフィックの断片化されていないパケットのみに一致
filter input exthdr frag missing

# TCP タイムスタンプオプションが存在する場合に一致
filter input tcp option timestamp exists

ICMP タイプ型

名前 キーワード サイズ ベースタイプ
ICMP Type icmp_type 8 ビット integer

ICMP タイプ型は ICMP ヘッダーのタイプフィールドを簡単に指定するために使用されます。

ICMP タイプを指定する場合、次のキーワードを使用できます。

キーワード
echo-reply 0
destination-unreachable 3
source-quench 4
redirect 5
echo-request 8
router-advertisement 9
router-solicitation 10
time-exceeded 11
parameter-problem 12
timestamp-request 13
timestamp-reply 14
info-request 15
info-reply 16
address-mask-request 17
address-mask-reply 18
ICMPタイプの指定
# pingパケットに一致
filter output icmp type { echo-request, echo-reply }

ICMP コード型

名前 キーワード サイズ ベースタイプ
ICMP Code icmp_code 8 ビット integer

ICMP コードタイプは ICMP ヘッダーのコードフィールドを簡単に指定するために使用されます。

ICMP コードを指定するときは、次のキーワードを使用できます。

キーワード
net-unreachable 0
host-unreachable 1
prot-unreachable 2
port-unreachable 3
net-prohibited 9
host-prohibited 10
admin-prohibited 13

ICMPV6 タイプ型

名前 キーワード サイズ ベースタイプ
ICMPv6 Type icmpv6_type 8 ビット integer

ICMPv6 タイプ型は ICMPv6 ヘッダーのタイプフィールドを簡単に指定するために使用されます。

ICMPv6 タイプを指定する場合、次のキーワードを使用できます。

キーワード
destination-unreachable 1
packet-too-big 2
time-exceeded 3
parameter-problem 4
echo-request 128
echo-reply 129
mld-listener-query 130
mld-listener-report 131
mld-listener-done 132
mld-listener-reduction 132
nd-router-solicit 133
nd-router-advert 134
nd-neighbor-solicit 135
nd-neighbor-advert 136
nd-redirect 137
router-renumbering 138
ind-neighbor-solicit 141
ind-neighbor-advert 142
mld2-listener-report 143
ICMPv6タイプの指定
# ICMPv6 ping パケットに一致
filter output icmpv6 type { echo-request, echo-reply }

ICMPV6 コード型

名前 キーワード サイズ ベースタイプ
ICMPv6 Code icmpv6_code 8 ビット integer

ICMPv6 コードタイプは、 ICMPv6 ヘッダーのコードフィールドを簡単に指定するために使用されます。

ICMPv6 コードを指定する場合、次のキーワードを使用できます。

キーワード
no-route 0
admin-prohibited 1
addr-unreachable 3
port-unreachable 4
policy-fail 5
reject-route 6

ICMPVX コード型

名前 キーワード サイズ ベースタイプ
ICMPvX Code icmpx_code 8 ビット integer

ICMPvX コード型の抽象化は、 inet ファミリから使用される ICMP と ICMPv6 コード型の間で重複する値のセットです。

ICMPvX コードを指定する場合、次のキーワードを使用できます。

キーワード
no-route 0
port-unreachable 1
host-unreachable 2
admin-prohibited 3

Conntrack 型

これは ct 式およびステートメントで使用される型の概要です。

名前 キーワード サイズ ベースタイプ
conntrack state ct_state 4 バイト bitmask
conntrack direction ct_dir 8 ビット integer
conntrack status ct_status 4 バイト bitmask
conntrack event bits ct_event 4 バイト bitmask
conntrack label ct_label 128 ビット bitmask

上記のタイプごとに、便宜上キーワードを使用できます。

conntrack state(ct_state)

キーワード
invalid 1
established 2
related 4
new 8
untracked 64

conntrack direction(ct_dir)

キーワード
original 0
reply 1

conntrack status(ct_status)

キーワード
expected 1
seen-reply 2
assured 4
confirmed 8
snat 16
dnat 32
dying 512

conntrack event bits(ct_event)

キーワード
new 1
related 2
destroy 4
reply 8
assured 16
protoinfo 32
helper 64
mark 128
seqadj 256
secmark 512
label 1024

conntrack label type(ct_label) の指定可能なキーワードは、実行時に /etc/connlabel.conf から読み込まれます。

一次式

最下位の式は、パケットのペイロード、メタデータ、またはステートフルモジュールからの定数または単一のデータを表す一次式です。

メタ式

meta {length | nfproto | l4proto | protocol | priority}
[meta] {mark | iif | iifname | iiftype | oif | oifname | oiftype | skuid | skgid | nftrace | rtclassid | ibrname | obrname | pkttype | cpu | iifgroup | oifgroup | cgroup | random | secpath}

メタ式とは、パケットに関連付けられたメタデータを指します。

メタ式には、非修飾メタ式と修飾メタ式の 2 種類があります。
修飾されたメタ式では、メタキーの前に meta キーワードが必要です。
修飾されていないメタ式は、メタキーを直接または修飾されたメタ式として指定できます。
meta l4proto は、 IPv4 または IPv6 パケットの一部である特定のトランスポートプロトコルを照合するのに役立ちます。
また IPv6 パケットに存在する IPv6 拡張ヘッダーもスキップします。

メタ式タイプ

キーワード 説明 タイプ
length パケットの長さ(バイト) integer(32 ビット)
nfproto 実際のフックプロトコルファミリ。 inet テーブルでのみ有用 integer(32 ビット)
l4proto レイヤー 4 プロトコル。 ipv6 拡張ヘッダーをスキップ integer(8 ビット)
protocol EtherType プロトコル値 ether_type
priority TC パケットの優先度 tc_handle
mark パケットマーク mark
iif 入力インターフェースインデックス iface_index
iifname 入力インターフェース名 ifname
iiftype 入力インターフェースタイプ iface_type
oif 出力インターフェイスインデックス iface_index
oifname 出力インターフェース名 ifname
oiftype 出力インターフェイスハードウェアタイプ iface_type
skuid 元のソケットに関連付けられた UID uid
skgid 元のソケットに関連付けられた GID gid
rtclassid ルーティングレルム realm
ibrname 入力ブリッジインターフェース名 ifname
obrname 出力ブリッジインターフェイス名 ifname
pkttype パケットタイプ pkt_type
cpu パケットを処理する CPU 番号 integer(32 ビット)
iifgroup 受信デバイスグループ devgroup
oifgroup 送信デバイスグループ devgroup
cgroup コントロールグループ ID integer(32 ビット)
random 疑似乱数 integer(32ビット)
secpath ブール値 boolean(1ビット)

メタ式固有の型

タイプ 説明
iface_index インターフェイスインデックス(32 ビット番号)。数値または既存のインターフェースの名前として指定できます。
ifname インターフェース名(16 バイト文字列)。必須ではありません。
iface_type インターフェイスの種類(16 ビット番号)。
uid ユーザー ID(32 ビット番号)。数値またはユーザー名として指定できます。
gid グループ ID(32 ビット番号)。数値またはグループ名として指定できます。
realm ルーティングレルム(32 ビット番号)。数値、または /etc/iproute2/rt_realms で定義されたシンボル名として指定できます。
devgroup_type デバイスグループ(32 ビット番号)。数値または /etc/iproute2/group で定義されている記号名として指定できます。
pkt_type パケットタイプ: ユニキャスト(ローカルホスト宛て)、ブロードキャスト(全員宛て)、マルチキャスト(グループ宛て)。
メタ式の使用例
# 修飾されたメタ式
filter output meta oif eth0

# 修飾されていないメタ式
filter output oif eth0

# ipsec 処理の対象だったパック
raw prerouting meta secpath exists accept

FIB(Forwarding Information Base) 式

fib {saddr | daddr | {mark | iif | oif}} {oif | oifname | type}

fib 式は、 fib(転送情報ベース)に照会して、特定のアドレスが使用する出力インターフェイスインデックスなどの情報を取得します。
入力は、 fib 検索関数への入力として使用される要素のタプルです。

fib 式固有の型

キーワード 説明 タイプ
oif 出力インターフェイスインデックス integer(32ビット)
oifname 出力インターフェース名 string
type アドレスの種類 fib_addrtype
FIB式の使用例
# リバースパスなしでパケットをドロップ
filter prerouting fib saddr . iif oif missing drop

# インターフェースに設定されていないアドレスへのパケットをドロップ
filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop

# 特定の 'blackhole' テーブルで検索を実行( 0xdead, 適切な ip ルールが必要)
filter prerouting meta mark set 0xdead fib daddr . mark type vmap { blackhole : drop, prohibit : jump prohibited, unreachable : drop }

ルーティング式

rt {classid | nexthop}

ルーティング式は、パケットに関連付けられたルーティングデータを指します。

ルーティング式の型

キーワード 説明 タイプ
classid ルーティングレルム realm
nexthop ルーティングネクストホップ ipv4_addr / ipv6_addr
mtu ルートの TCP 最大セグメントサイズ integer(16 ビット)

ルーティング式固有の型

タイプ 説明
realm ルーティングレルム(32 ビット番号)。数値で、または /etc/iproute2/rt_realms で定義されたシンボル名として指定できます。
ルーティング式の使用例
# IPファミリに依存しない rt 式
filter output rt classid 10

# IPファミリ依存の rt 式
ip filter output rt nexthop 192.168.0.1
ip6 filter output rt nexthop fd00::1
inet filter output rt ip nexthop 192.168.0.1
inet filter output rt ip6 nexthop fd00::1

ペイロード式

ペイロード式は、パケットのペイロードからのデータを参照します。

イーサネットヘッダー式

ether [Ethernet header field]

イーサネットヘッダー式の型

キーワード 説明 タイプ
daddr 宛先 MAC アドレス ether_addr
saddr 送信元 MAC アドレス ether_addr
type EtherType ether_type

VLAN ヘッダー式

vlan [VLAN header field]
キーワード 説明 タイプ
id VLAN ID(VID) integer(12 ビット)
cfi Canonical Format Indicator integer(1 ビット)
pcp Priority code point integer(3 ビット)
type EtherType ether_type

ARPヘッダー式

arp [ARP header field]
キーワード 説明 タイプ
htype ARP ハードウェアタイプ integer(16 ビット)
ptype EtherType ether_type
hlen ハードウェアアドレス長 integer(8 ビット)
plen プロトコルアドレス長 integer(8 ビット)
operation オペレーション arp_op

IPV4 ヘッダー式

ip [IPv4 header field]
キーワード 説明 タイプ
version IP ヘッダーバージョン(4) integer(4 ビット)
hdrlength オプションを含む IP ヘッダーの長さ integer(4 ビット) FIXME スケーリング
dscp Differentiated Services Code Point dscp
ecn 明示的な輻輳通知(Explicit Congestion Notification) ecn
length 総パケット長 integer(16 ビット)
id IP ID integer(16 ビット)
frag-off フラグメントのオフセット integer(16 ビット)
ttl 生存時間(Time to live) integer(8 ビット)
protocol 上位層プロトコル inet_proto
checksum IP ヘッダーチェックサム integer(16 ビット)
saddr 送信元アドレス ipv4_addr
daddr 宛先アドレス ipv4_addr

ICMP ヘッダー式

icmp [ICMP header field]
キーワード 説明 タイプ
type ICMP タイプフィールド icmp_type
code ICMP コードフィールド integer(8 ビット)
checksum ICMP チェックサムフィールド integer(16 ビット)
id エコー要求 / 応答の ID integer(16 ビット)
sequence エコー要求 / 応答のシーケンス番号 integer(16 ビット)
gateway リダイレクトのゲートウェイ integer(32 ビット)
mtu MTU 経路探査の MTU integer(16 ビット)

IPV6 ヘッダー式

ip6 [IPv6 header field]

この式は ipv6 ヘッダーフィールドを参照します。
ip6 nexthdr を使用する場合の注意ですが、値は next ヘッダーのみを参照します。
つまり ip6 nexthdr tcp は ipv6 パケットに拡張ヘッダーが含まれていない場合にのみ一致します。
フラグメント化されたパケット、またはルーティング拡張ヘッダーが含まれている場合は照合されません。
実際のトランスポートヘッダーと一致させ、代わりに追加の拡張ヘッダーを無視する場合は meta l4proto を使用してください。

キーワード 説明 タイプ
version IP ヘッダーバージョン(6) integer(4 ビット)
dscp Differentiated Services Code Point dscp
ecn 明示的な輻輳通知(Explicit Congestion Notification) ecn
flowlabel フローラベル integer(20 ビット)
length ペイロードの長さ integer(16 ビット)
nexthdr nexthdr プロトコル inet_proto
hoplimit ホップ制限 integer(8 ビット)
saddr 送信元アドレス ipv6_addr
daddr 宛先アドレス ipv6_addr

最初の拡張ヘッダーがフラグメントを示している場合に一致

ip6 nexthdr ipv6-frag counter

ICMPV6 ヘッダー式

icmpv6 [ICMPv6 header field]
キーワード 説明 タイプ
type ICMPv6 タイプフィールド icmpv6_type
code ICMPv6 コードフィールド integer(8 ビット)
checksum ICMPv6 チェックサムフィールド integer(16 ビット)
parameter-problem 問題へのポインタ integer(32 ビット)
packet-too-big サイズ超過 MTU integer(32 ビット)
id エコー要求 / 応答の ID 整数(16 ビット)
sequence エコー要求 / 応答のシーケンス番号 integer(16 ビット)
max-delay MLD クエリの最大応答遅延 integer(16 ビット)

TCP ヘッダー式

tcp [TCP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
sequence シーケンス番号 integer(32 ビット)
ackseq 確認番号 integer(32 ビット)
doff データのオフセット integer(4 ビット) FIXME スケーリング
reserved 予約エリア integer(4 ビット)
flags TCP フラグ tcp_flag
window ウィンドウ integer(16 ビット)
checksum チェックサム integer(16 ビット)
urgptr 緊急ポインタ integer(16 ビット)

UDP ヘッダー式

udp [UDP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
length 総パケット長 integer(16 ビット)
checksum チェックサム integer(16 ビット)

簡易 UDP ヘッダー式

udplite [UDP-Lite header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
checksum チェックサム integer(16 ビット)

SCTP ヘッダー式

sctp [SCTP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
vtag 検証タグ integer(32 ビット)
checksum チェックサム integer(32 ビット)

DCCP ヘッダー式

dccp [DCCP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service

認証ヘッダー式

ah [AH header field]
キーワード 説明 タイプ
nexthdr 次のヘッダープロトコル inet_proto
hdrlength AH ヘッダーの長さ integer(8 ビット)
reserved 予約エリア integer(16 ビット)
spi セキュリティパラメータインデックス integer(32 ビット)
sequence シーケンス番号 integer(32 ビット)

暗号化されたセキュリティペイロードのヘッダー式

esp [ESP header field]
キーワード 説明 タイプ
spi セキュリティパラメータインデックス integer(32 ビット)
sequence シーケンス番号 integer(32 ビット)

IPCOMP ヘッダー式

comp [IPComp header field]
キーワード 説明 タイプ
nexthdr 次のヘッダープロトコル inet_proto
flags フラグ bitmask
cpi 圧縮パラメータインデックス integer(16 ビット)

RAW ペイロード式

@ [base,offset,length]

Raw ペイロード式は、offsetbits から始まる lengthbits をロードするように指示します。
ビット 0 は最初のビットを指します。
C プログラミング言語では、これは最上位ビット、つまりオクテットの場合は 0x80 に対応します。
これらは人間が読めるテンプレート式がまだないヘッダーを照合するのに役立ちます。
nft は Raw ペイロード式の依存関係を追加しないことに注意してください。
例えばトランスポートヘッダーのプロトコルフィールドをプロトコル番号 5 に一致させるには、異なるトランスポートヘッダーを持つパケットを手動で除外する必要があります。
たとえば Raw 式の前に meta l4proto 5 を使用します。

サポートされているペイロードプロトコルベース

ベース 説明
ll イーサネットヘッダーなどのリンク層
nh ネットワークヘッダー、たとえば IPv4 または IPv6
th トランスポートヘッダー、たとえば TCP
# UDP と TCP の両方に一致する宛先ポート
inet filter input meta l4proto {tcp, udp} @th,16,16 { dns, http }

# ターゲットプロトコルアドレスが指定されたアドレスと一致する場合に
# arp パケットのターゲットハードウェアアドレスを書き換える。
input meta iifname enp2s0 arp ptype 0x0800 arp htype 1 arp hlen 6 arp plen 4 @nh,192,32 0xc0a88f10 @nh,144,48 set 0x112233445566 accept

拡張ヘッダー式

拡張ヘッダー式は、IPv6 拡張ヘッダーや TCP オプションなど、可変サイズのプロトコルヘッダーからのデータを参照します。

nftables は現在、特定の ipv6 拡張ヘッダーまたは TCP オプションのマッチング(検索)をサポートしています。

hbh {nexthdr | hdrlength}
frag {nexthdr | frag-off | more-fragments | id}
rt {nexthdr | hdrlength | type | seg-left}
dst {nexthdr | hdrlength}
mh {nexthdr | hdrlength | checksum | type}
srh {flags | tag | sid | seg-left}
tcp option {eol | noop | maxseg | window | sack-permitted | sack | sack0 | sack1 | sack2 | sack3 | timestamp} tcp_option_field

次の構文は、右辺にブール型があり、ヘッダーの存在を確認するだけの関係式でのみ有効です。

exthdr {hbh | frag | rt | dst | mh}
tcp option {eol | noop | maxseg | window | sack-permitted | sack | sack0 | sack1 | sack2 | sack3 | timestamp}

IPv6 拡張ヘッダー

キーワード 説明
hbh ホップバイホップ
rt ルーティングヘッダー
フラグメント フラグメンテーションヘッダー
dst dst オプション
mh モビリティヘッダー
srh セグメントルーティングヘッダー

TCP オプション

キーワード 説明 TCP オプションフィールド
eol オプションリストの終わり kind
noop 1 バイトの TCP No-op オプション kind
maxseg TCP 最大セグメントサイズ kind, length, size
window TCP ウィンドウスケーリング kind, length, count
sack-permitted 許可された TCP SACK kind, length
sack TCP 選択的確認応答(TCP Selective Acknowledgement)(block 0 のエイリアス) kind, length, left, right
sack0 TCP 選択的確認応答(block 0) kind, length, left, right
sack1 TCP 選択的確認応答(block 1) kind, length, left, right
sack2 TCP 選択的確認応答(block 2) kind, length, left, right
sack3 TCP 選択的確認応答(block 3) kind, length, left, right
timestamp TCP タイムスタンプ kind, length, tsval, tsecr
# TCP オプションの検索
filter input tcp option sack-permitted kind 1 counter

# IPv6 exthdr の検索
ip6 filter input frag more-fragments 1 counter

CONNTRACK 式

conntrack 式は、パケットに関連付けられた接続追跡エントリのメタデータを参照します。

conntrack 式には 3 つのタイプがあります。
一部の conntrack 式では conntrack キーの前にフローの方向が必要ですが、他の式は方向に依存しないため、直接使用する必要があります。
packets , bytes , avgpkt キーワードは、方向の有無にかかわらず使用できます。
方向を省略すると、元の方向と返信方向の合計が返されます。
同じことがゾーンにも当てはまります。
方向が指定されている場合、ゾーン ID が指定された方向に関連付けられている場合にのみゾーンが一致します。

ct {state | direction | status | mark | expiration | helper | label | l3proto | protocol | bytes | packets | avgpkt | zone}
ct {original | reply} {l3proto | protocol | proto-src | proto-dst | bytes | packets | avgpkt | zone}
ct {original | reply} {ip | ip6} {saddr | daddr}
キーワード 説明 タイプ
state 接続の状態 ct_state
direction 接続に対するパケットの方向 ct_dir
status 接続のステータス ct_status
mark 接続マーク mark
expiration 接続の有効期限 time
helper 接続に関連付けられたヘルパー string
label nftables インクルードパスの connlabel.conf で定義された接続追跡ラベルビットまたはシンボリック名 ct_label
l3proto 接続のレイヤー 3 プロトコル nf_proto
saddr 指定された方向の接続の送信元アドレス ipv4_addr / ipv6_addr
daddr 指定された方向の接続の宛先アドレス ipv4_addr / ipv6_addr
protocol 指定された方向の接続のレイヤー 4 プロトコル inet_proto
proto-src 指定された方向のレイヤ 4 送信元プロトコル integer(16 ビット)
proto-dst 指定された方向のレイヤー 4 宛先プロトコル integer(16 ビット)
packets 指定された方向に検知されるパケット数、またはオリジナルと返信の合計 integer(64 ビット)
bytes 検知バイト数、 packets キーワードの説明を参照 integer(64 ビット)
avgpkt パケットあたりの平均バイト、 packets キーワードの説明を参照 integer(64 ビット)
zone conntrack ゾーン integer(16 ビット)

上記の conntrack 固有の型の説明は、上記の CONNTRACK TYPES のサブセクションにあります。

ステートメント

ステートメントは実行されるアクションを表します。
制御フローを変更したり(return, 別のチェーンへの jump, パケットの accept または drop)、ロギングやパケットの拒否などのアクションを実行できます。

ステートメントは 2 種類あります。
終了ステートメントは現在のルールの評価を無条件に終了します。
非終了ステートメントは条件付きでのみ終了、または現在のルールの評価を決して終了しません。
つまりそれらはルールセット評価の観点から受動的です。
ルールには任意の数の非終了ステートメントを含めることができますが、最終ステートメントとして単一の終了ステートメントのみを使用できます。

判定ステートメント

判定ステートメントはルールセットの制御フローを変更し、パケットのポリシー決定を発行します。

{accept | drop | queue | continue | return}
{jump | goto} chain
  • accept: ルールセット評価を終了し、パケットを受け入れます。
  • drop: ルールセットの評価を終了し、パケットを破棄します。
  • queue: ルールセットの評価を終了し、パケットをユーザースペースにキューイングします。
  • continue: 次のルールでルールセットの評価を続行します。FIXME。
  • return: 現在のチェーンから戻り、最後のチェーンの次のルールで評価を続行します。ベースチェーンで発行された場合、それは accept と同等です。
  • jump chain: チェーンの最初のルールで評価を続行します。ルールセットの現在の位置はコールスタックにプッシュされ、新しいチェーンが完全に評価されて return 判定が発行されると、評価はそこで続行されます。
  • goto chain: jump に似ていますが、現在の位置はコールスタックにプッシュされません。つまり新しいチェーンの評価後は goto ステートメントを含むチェーンではなく、最後のチェーンで続行されます。
# eth0 と内部ネットワークからのパケットを from_lan で処理する。
filter input iif eth0 ip saddr 192.168.0.0/24 jump from_lan

# チェーン、異なる送信元アドレスを持つ eth0 からのすべてのパケットを破棄します。
filter input iif eth0 drop

ペイロードステートメント

ペイロードステートメントはパケットの内容を変更します。
たとえば、ip DSCP(differv) ヘッダーフィールドまたは ipv6 フローラベルを設定するために使用できます。

ブリッジする代わりに一部のパケットをルーティングする。

# tcp:http を 192.160.0.0/16 からローカルマシンにリダイレクトして、ブリッジングではなくルーティングする
# 00:11:22:33:44:55 がローカル MAC アドレスである想定です。
bridge input meta iif eth0 ip saddr 192.168.0.0/16 tcp dport 80 meta pkttype set unicast ether daddr set 00:11:22:33:44:55

# IPv4 DSCP ヘッダーフィールドの設定
ip forward ip dscp set 42

拡張ヘッダーステートメント

拡張ヘッダーステートメントは可変サイズのヘッダーのパケットコンテンツを変更します。
これは現在 TCPMSS と同様に、パケットの TCP 最大セグメントサイズを変更するために使用できます。

# tcp mss を変更する
tcp flags syn tcp option maxseg size set 1360

# ルート情報に基づいてサイズを設定する
tcp flags syn tcp option maxseg size set rt mtu

ログステートメント

log [prefix quoted_string] [level syslog-level] [flags log-flags]
log group nflog_group [prefix quoted_string] [queue-threshold value] [snaplen size]

log ステートメントは、一致するパケットのロギングを有効にします。
このステートメントをルールから使用すると、 Linux カーネルはヘッダーフィールドなど、一致するすべてのパケットに関する情報をカーネルログを介して出力します(dmesg(1) で読み取るか、 syslog で読み取ることができます)。
グループ番号が指定されている場合、 Linux カーネルはパケットを nfnetlink_log に渡し、 netlink ソケットを介してパケットを指定されたマルチキャストグループにマルチキャストします。
1 つ以上のユーザースペースプロセスがグループに登録されていてパケットを受信する場合があります。
詳細については、 libnetfilter_queue のドキュメントをご覧ください。
これは非終了ステートメントであるため、パケットがログに記録された後もルール評価は続行されます。

ログステートメントオプション

キーワード 説明 タイプ
prefix ログメッセージの接頭辞 引用符で囲まれた文字列
level ロギングの Syslog レベル string: emerg, alert, crit, err, warn [default], notice, info, debug
group メッセージを送信する NFLOG グループ 符号なし整数(16 ビット)
snaplen netlink メッセージに含めるパケットペイロードの長さ 符号なし整数(32 ビット)
que-threshold ユーザー空間に送信する前にカーネル内でキューに入れるパケットの数 符号なし整数(32 ビット)

ログフラグ

フラグ 説明
tcp sequence TCP シーケンス番号をログに記録します。
tcp options TCP パケットヘッダーのログオプション。
ip options IP / IPv6 パケットヘッダーのログオプション。
skuid パケットを生成したプロセスのユーザー ID をログに記録します。
ether MAC アドレスとプロトコルをデコードします。
all 上記のすべてのログフラグを有効にします。
ログステートメントの使用例
# パケットと IP オプションを生成した UID をログに記録する
ip filter output log flags skuid flags ip options

# TCP パケットからの TCP シーケンス番号と TCP オプションをログに記録する
ip filter output log flags tcp sequence,options

# サポートされているすべてのログフラグを有効にする
ip6 filter output log flags all

拒否ステートメント

reject [ with {icmp | icmpv6 | icmpx} type {icmp_code | icmpv6_code | icmpx_code} ]
reject [ with tcp reset ]

reject ステートメントは、一致したパケットに応答してエラーパケットを送り返すために使用されます。
それ以外の場合は drop と同じであるため、ルールトラバーサルを終了する終了ステートメントです。
このステートメントは、 input チェーン、 forward チェーン、 output チェーン、およびこれらのチェーンからのみ呼び出されるユーザー定義チェーンでのみ有効です。

さまざまな ICMP 拒否変数は、さまざまなテーブルファミリで使用するためのものです。

変数 ファミリー タイプ
icmp ip icmp_code
icmpv6 ip6 icmpv6_code
icmpx inet icmpx_code

タイプの説明とサポートされるキーワードのリストについては、上記の データ型 セクションを参照してください。一般的にデフォルトの拒否値は port-unreachable です。

bridge ファミリでは、 reject ステートメントは input または prerouting にフックするベースチェーンでのみ許可されていることに注意してください。

カウンターステートメント

counter ステートメントは、バイト数と共にパケットのヒット数を設定します。

counter [ packets number bytes number ]

CONNTRACK ステートメント

conntrack ステートメントを使用して、 conntrack マークと conntrack ラベルを設定できます。

ct {mark | event | label | zone} set value

ct ステートメントは、接続に関連付けられたメタデータを設定します。
ゾーン ID は、 conntrack 検索が実行される前に割り当てる必要があります。
つまり、これは prerouting および output(ローカルで生成されたパケットを個別のゾーンに配置する必要がある場合)で実行する必要があり、フック優先度は -300 です。

Conntrackステートメントタイプ

キーワード 説明
event conntrack イベントビット bitmask, integer(32 ビット)
helper 接続に割り当てる ct ヘルパーオブジェクトの名前 引用符で囲った文字列
mark 接続追跡マーク mark
label 接続追跡ラベル label
zone conntrack ゾーン integer(16 ビット)
# パケット nfmark を conntrack に保存する
ct mark set meta mark

# インターフェースを介してマップされたゾーンを設定
table inet raw {
  chain prerouting {
    type filter hook prerouting priority -300;
    ct zone set iif map { "eth1" : 1, "veth1" : 2 }
  }
  chain output {
    type filter hook output priority -300;
    ct zone set oif map { "eth1" : 1, "veth1" : 2 }
  }
}

# ctnetlink によって報告されるイベントを制限する
ct event set new,related,destroy

メタステートメント

meta ステートメントはメタ式の値を設定します。
既存のメタフィールドは、 priority , mark , pkttype , nftrace です。

meta {mark | priority | pkttype | nftrace} set value

メタステートメントは、パケットに関連付けられたメタデータを設定します。

メタステートメントのタイプ

キーワード 説明
priority TC パケットの優先度 tc_handle
mark パケットマーク mark
pkttype パケットタイプ pkt_type
nftrace ルールセットパケットトレースのオン / オフ。トレースを監視するには monitor trace コマンドを使用します。 0, 1

制限ステートメント

limit rate [over] packet_number / {second | minute | hour | day} [burst packet_number packets]
limit rate [over] byte_number {bytes | kbytes | mbytes} / {second | minute | hour | day | week} [burst byte_number bytes]

limit ステートメントは、トークンバケットフィルターを使用して制限されたレートで一致します。
このステートメントを使用するルールは、この制限に達するまで一致します。
これをログステートメントと組み合わせて使用​​すると、ロギングを制限できます。
オプションの over キーワードは、指定されたレートを超えて一致させます。

説明 タイプ
packet_number パケット数 符号なし整数(32 ビット)
byte_number バイト数 符号なし整数(32 ビット)

NAT ステートメント

snat to address [:port] [persistent, random, fully-random]
snat to address - address [:port - port] [persistent, random, fully-random]
dnat to address [:port] [persistent, random, fully-random]
dnat to address [:port - port] [persistent, random, fully-random]
masquerade to [:port] [persistent, random, fully-random]
masquerade to [:port - port] [persistent, random, fully-random]
redirect to [:port] [persistent, random, fully-random]
redirect to [:port - port] [persistent, random, fully-random]

nat ステートメントは nat チェーンタイプからのみ有効です。

snat および masquerade ステートメントは、パケットの送信元アドレスを変更する必要があることを指示します。
snatは postrouting と input チェーンでのみ有効ですが、 masquerade は postrouting でのみ意味があります。
dnat および redirect ステートメントは、 prerouting および output チェーンでのみ有効であり、パケットの宛先アドレスを変更する必要があることを指示します。
nat チェーンタイプのベースチェーンから呼び出される非ベースチェーンも使用できます。
この接続における将来のすべてのパケットは破棄され、ルールの評価は中止されます。

masquerade ステートメントは snat の特殊な形式であり、常に変換先の送信インターフェイスの IP アドレスを使用します。
これは動的(パブリック) IP アドレスを持つゲートウェイで特に役立ちます。

redirect ステートメントは dnat の特別な形式で、常に宛先アドレスをローカルホストのアドレスに変換します。
異なるインターフェイスの受信トラフィックの宛先ポートのみを変更したい場合に便利です。

すべての nat ステートメントには、 prerouting と postrouting の両方のベースチェーンが存在する必要があることに注意してください。
さもないと return 経路のパケットが netfilter で認識されず、逆変換が行われません。

NAT ステートメントの値

説明 タイプ
address パケットの送信元 / 宛先アドレスを変更する必要があることを指示します。マッピングを指定して、任意の式キーで構成されるタプルのリストをアドレス値と関連付けることができます。 ipv4_addr, ipv6_addr, たとえば abcd::1234 、またはマッピングを使用できます。meta mark map { 10:192.168.1.2, 20:192.168.1.3 }
port パケットの送信元 / 宛先アドレスを変更する必要があることを指示します。 ポート番号(16 ビット)

NAT ステートメントフラグ

フラグ 説明
persistent 各接続に同じ送信元 / 宛先アドレスをクライアントに与えます。
random 使用した場合、ポートマッピングは、送信元アドレスと宛先アドレス、および宛先ポートを使用してランダムにシードされた MD5 ハッシュミックスを使用してランダム化されます。
fully-random 使用すると、ポートマッピングは 32 ビットの疑似ランダムアルゴリズムに基づいて生成されます。

NAT ステートメントの使用

# その他すべての例に適したテーブル / チェーン設定を作成する
add table nat
add chain nat prerouting { type nat hook prerouting priority 0; }
add chain nat postrouting { type nat hook postrouting priority 100; }

# eth0 経由で送信されるすべてのパケットの送信元アドレスをアドレス 1.2.3.4 に変換します
add rule nat postrouting oif eth0 snat to 1.2.3.4

# eth0 経由で入るすべてのトラフィックを宛先アドレス 192.168.1.120 にリダイレクトします
add rule nat prerouting iif eth0 dnat to 192.168.1.120

# eth0 経由で送信されるすべてのパケットの送信元アドレスを何にでも変換
# ローカルで生成されたパケットは、同じ宛先に到達するためのソースとして使用されます
add rule nat postrouting oif eth0 masquerade

# ポート 22 の受信 TCP トラフィックをポート 2222 にリダイレクトする
add rule nat prerouting tcp dport 22 redirect to :2222

フローオフロードステートメント

フローオフロードステートメントでは、レイヤー 3 ネットワークスタックバイパスを介して転送を高速化するフローを選択できます。
このフローをオフロードするフローテーブル名を指定する必要があります。

flow offload @flowtable

キューステートメント

このステートメントは nfnetlink_queue ハンドラーを使用してパケットをユーザースペースに渡します。
パケットは 16 ビットのキュー番号で識別されるキューに入れられます。
ユーザースペースは必要に応じてパケットを検査および変更できます。
その後ユーザースペースはパケットをカーネルから破棄または再注入する必要があります。
詳細については libnetfilter_queue のドキュメントを参照してください。

queue [num queue_number] [bypass]
queue [num queue_number_from - queue_number_to] [bypass,fanout]

キューステートメント値

説明 タイプ
queue_number キュー番号を設定します。デフォルトは 0 です。 符号なし整数(16 ビット)
queue_number_from fanout が使用されている場合、範囲内に初期キューを設定します。 符号なし整数(16 ビット)
queue_number_to fanout が使用されている場合、範囲内に終了キューを設定します。 符号なし整数(16 ビット)

キューステートメントフラグ

フラグ 説明
bypass ユーザースペースアプリケーションがバックオフできない場合はパケットを通過させます。このフラグを使用する前に、 libnetfilter_queue のドキュメントを読んで、パフォーマンスチューニングの推奨事項を確認してください。
fanout 複数のキュー間でパケットを分配します。

DUP ステートメント

dup ステートメントはパケットを複製し、そのコピーを別の宛先に送信するために使用されます。

dup to device
dup to address device device

Dup ステートメントの値

説明 タイプ
address パケットのコピーを新しいゲートウェイに送信する必要があることを指示します。 ipv4_addr, ipv6_addr。たとえば abcd::1234 。またはマッピングを使用できます。 ip saddr map {192.168.1.2:10.1.1.1}
device コピーをデバイス経由で送信する必要があることを指示します。 string
dupステートメントの使用例
# eth0 で IP アドレス 10.2.3.4 のマシンに送信
ip filter forward dup to 10.2.3.4 device "eth0"

# raw フレームを別のインターフェースにコピー
netdetv ingress dup to "eth0"
dup to "eth0"

# ゲートウェイへのマップ dst addr と組み合わせる
dup to ip daddr map { 192.168.7.1 : "eth0", 192.168.7.2 : "eth1" }

FWD ステートメント

fwd ステートメントは、 raw パケットを別のインターフェースにリダイレクトするために使用されます。
これは netdev ファミリーの ingress フックでのみ使用できます。
コピーが作成されないことを除いて dup ステートメントに似ています。

fwd to device

set ステートメント

set ステートメントは、パケットパスからセット内の要素を動的に追加または更新するために使用されます。
set setname は、指定されたテーブルにすでに存在している必要があります。
さらに nftables ルールセットから動的に更新されるセットは、最大セットサイズ(メモリ不足を防ぐため)とタイムアウト(セット内のエントリ数が無制限に増加しないようにするため)の両方を指定する必要があります。
set ステートメントは、たとえば動的ブラックリストを作成します。

{add | update} @setname {expression [timeout timeout] [comment string]}
単純なブラックリストの例
# ファミリー "ip" のテーブル "filter" にバインドされたセットを宣言します。パケットパスから要素を追加するため、タイムアウトとサイズは必須です。
nft add set ip filter blackhole "{type ipv4_addr; flags timeout; size 65536;}"

# 内部インターフェースをホワイトリストに登録します。
nft add rule ip filter input meta iifname "internal" accept

# ブラックリストに登録された IP アドレスからのパケットを破棄します。
nft add rule ip filter input ip saddr @blackhole counter drop

# 1 秒あたり 10 を超える TCP 接続要求が発生した場合は、送信元 IP アドレスをブラックリストに追加します。
# エントリは 1 分後にタイムアウトします。その後、制限状態が続く場合、エントリは再度追加される可能性があります。
nft add rule ip filter input tcp flags syn tcp dport ssh meter flood size 128000 {ip saddr timeout 10s limit rate over 10 / second} add @blackhole {ip saddr timeout 1m} drop

# レート制限メーターの状態を検査します。
nft list meter ip filter flood

# ブラックホールの内容を検査:
nft list set ip filter blackhole

# 手動で 2 つのアドレスをセットに追加します:
nft add element filter blackhole { 10.2.3.4, 10.23.1.42 }

追加のコマンド

これらは nft に含まれる追加コマンドの一部です。

モニター

monitor コマンドを使用すると、オブジェクトの作成と削除に関連して nf_tables サブシステムによって生成された Netlink イベントを待ち受けできます。
イベントが発生すると nft は監視対象イベントを XML, JSON またはネイティブ nft 形式のいずれかで標準出力に出力します。

具象オブジェクトに関連するイベントをフィルタリングするには、キーワード tables , chains , sets , rules , elements , ruleset のいずれかを使用します。

具体的なアクションに関連するイベントをフィルタリングするには、キーワード new または destroy を使用します。

^ C を押して、監視操作を終了します。

# すべてのイベントを待ち受けし、ネイティブ nft 形式でレポート出力します
% nft monitor

# 追加されたテーブルを待ち受けして XML 形式でレポート出力する
% nft monitor new tables xml

# 削除されたルールを待ち受けして JSON 形式でレポート出力します
% nft monitor destroy rules json

# 新しいチェーンと破棄されたチェーンの両方をネイティブの nft 形式で待ち受ける
% nft monitor chains

# テーブル、チェーン、ルール、セット、カウンター、クォータなどのルールセットイベントをネイティブ nft 形式で待ち受けします
% nft monitor ruleset

エラー報告

エラーが検出されると nft はエラーを含む行を示し、入力ストリーム内のエラーのある部分の位置を示し、キャレット( ^ )を使用してエラーのある部分をマークアップします。
エラーが 2 つの式またはステートメントの組み合わせに起因する場合、違反している制約を課している部分は、チルダ( ~ )を使用してマークされます。

カーネルによって返されるエラーの場合 nft は入力のどの部分がエラーの原因であるかを検出できず、コマンド全体がマークされます。

1つの正しくない式が原因のエラー
<cmdline>:1:19-22: Error: Interface does not exist
filter output oif eth0
                  ^^^^
2つの式の無効な組み合わせが原因のエラー
<cmdline>:1:28-36: Error: Right hand side of relational expression (==) must be constant
filter output tcp dport == tcp dport
                        ~~ ^^^^^^^^^
カーネルから返されたエラー
<cmdline>:0:0-23: Error: Could not process rule: Operation not permitted
filter output oif wlan0
^^^^^^^^^^^^^^^^^^^^^^^

終了ステータス

成功した場合 nft はステータス 0 で終了します。
不特定のエラーが発生した場合、ステータス 1 で終了し、ステータス 2 がメモリ割り当てエラーで、Netlink ソケットを開くことができない場合はステータス 3 です。

関連項目

  • iptables(8)
  • ip6tables(8)
  • arptables(8)
  • ebtables(8)
  • ip(8)
  • tc(8)

https://wiki.nftables.org に公式の wiki があります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxディストリビューションの種類についてまとめ

Yuheiです。

8月からインフラのスクールに通う予定ですが、現在、Linuxの勉強を進めています。

7月に入り、「新しいLinuxの教科書」を進めていますが、その中でLinuxディストリビューションについてよくわからないところがあったので、調べた内容をまとめました。

Linuxディストリビューションとは?

Linuxカーネルとその他ソフトウェア群を1つにまとめ、利用者が、簡単にインストールや利用できるようにしたものを指します。

Linuxは本来カーネルのことを指しますが、カーネルだけではOSを使うことはできません。

そこで、
Linuxを利用しやすいようにアプリケーション等をパッケージにし、いつでも使える状態にしたものを

「Linuxディストリビューション」
と言います。

Linuxディストリビューションの一例

例えば、自動車を動かすときは、
①エンジン
②タイヤ
③ハンドル
④ブレーキ
などがあり、初めて車を動かすことができますが、

Linuxディストリビューションは、上記と同じように、様々なアプリケーションを使って、初めてLinuxをOSないで動かすことができます。

Linuxディストリビューションの種類

Linuxディストリビューションには、

①Red Hat系
②Debian系

上記の2種類があります。

それぞれの特徴ですが、
①は、主に商用向けのLinuxディストリビューションで、大規模システムの開発や運用で使われます。(こちらは主に有料版が使われていることが多い)

ネットユーザーからは、RedHatの名前から、「赤帽」と呼ばれているおり、

安定性があるLinuxディストリビューションです。

②はフリーで使えるLinuxディストリビューションです。
様々なCPUのサポートと、膨大なアプリケーションが特徴で、多くの企業のシステムに導入されています。

それぞれのソフトウェア

Red hat系
①CentOS
②Red Hat Enterprice Linux
③Fedora

Debian系
①Debian GNU/Linux
②Ubuntu
③Linux Mint
④Edubuntu

上記がそれぞれで使われているソフトウェアですが、どのような特徴があって、どんな使われ方をしているのかは、また調べてからまとめたいと思います。

以上です。

参考文献

新しいLinuxの教科書

参照URL

Linuxディストリビューションとは?
【目的別】初心者におすすめのLinuxディストリビューション7選
今更聞けない!CentOSとRed Hatの違いとは?
Linuxとは

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

過去1週間の日付を出力するシェルスクリプト (Linux, macOS)

Linux 動作版

1week.sh
#!/bin/sh

# 7から1までのループ
for N in `seq 7 -1 1`
do
  # 7 days ago から 1 days ago まで
  DATE=`date +%Y-%m-%d --date "${N} days ago"`
  echo $DATE
done

動作確認環境: Ubuntu 20.04 LTS (Focal Fossa) + dash 0.5.10.2 + GNU coreutils 8.30 (date, seq)

$ ./1week.sh 
2020-06-27
2020-06-28
2020-06-29
2020-06-30
2020-07-01
2020-07-02
2020-07-03

macOS 動作版

1week.sh
#!/bin/sh

# 7から1までのループ
for N in `seq 7 -1 1`
do
  # -v-7d から -v-1d まで
  DATE=`date -v-${N}d +%Y-%m-%d`
  echo $DATE
done

動作確認環境: macOS Catalina 10.15 + GNU bash 3.2.57 + BSD date + BSD seq

$ ./1week.sh 
2020-06-27
2020-06-28
2020-06-29
2020-06-30
2020-07-01
2020-07-02
2020-07-03
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuxでApache2.4(httpd 2.4.43)+PHP7.4でWebサーバー構築 - 4.セキュリティ(chownとfirewalld)編

前提と準備

Linuxサーバー構築の記事

前回まではApache2.4にPHP7.4+MySQL8.0でWebアプリ環境を構築しましたが、セキュリティについても触れないといけませんね;;

Linux標準のfirewalldであれば、iptablesのような難しいコマンドルールだったり、SELinuxといったファイルごとの複雑な制御を行うことなく、誰がどのポートを使うかのみを指定するだけで、ファイアウォールで基本的なセキュリティを設定することができます(もちろん制御が複雑なセキュリティを使ったほうが内部侵入されたときも比較的安心ですが…)

他にもファイルの暗号化も併用したいところだが、話が難しくなるので、今回はfirewalldによるファイアウォール、chownでアクセス権を設定するにとどめておきます

また今回の検証では、別のネットワークセグメントからもアクセスの可否を調べたいので、Webサーバーはまたネットワークアダプタを増設して、もう一つのネットワークセグメントを増設します(192.168.1.0/24を使っていますが、Webサーバーにもう一つネットワークアダプタ(仮想ブリッジですが)増設して、192.168.5.0/24を構築しています)

環境

  • Webサーバープログラム:Apache 2.4.43 + PHP 7.4.6 + MySQL 8.0
  • クライアント(メイン):Windows10 Pro
  • クライアント(増築側):GUIのOSであれば、フリー(ここではInsider Preview使用中のWindows10イタリア語をHyper-V(第1世代)で使用しました)
  • サーバーのアーキテクチャ:x64(動作はHyper-Vの第2世代で確認)
  • Linuxディストリビューション:CentOS 8.1 / openSUSE 15.1 Leap / Ubuntu 20.04(すべて64bit)

前提

  • ユーザーはrootでインストール(私の検証ではadminという管理者アカウントにて、そこからsudoで処理しています)
  • どのディストリビューションでも、ファイアウォールはfirewalldを使う(ディストリビューション独自のファイアウォールコマンドは使用しない)
  • 前回の記事のApache+PHP+MySQLの一式のWebアプリサーバー構築そのものを完了していること

サーバー条件

IPアドレス

  • クライアント(メイン):192.168.1.11
  • クライアント(増築側):192.168.5.2
  • Webサーバー(2ポート):(メイン側IP)192.168.1.18、(増築側IP)192.168.5.1 (どのディストリビューションでも同じIPアドレスで検証)
  • データベースサーバー:(Webサーバーと一体)
  • 所属ネットワークセグメント:(メイン)192.168.1.0/24、(増築)192.168.5.0/24 web-from-2-port.png

パッケージを個別ダウンロードしてインストールする機能とバージョン(2020年6月時点)

  • zlib-1.2.11.tar.gz
  • apr-1.7.0.tar.gz
  • apr-util-1.6.1.tar.gz
  • mysql80-community-release-el8-1.noarch.rpm (CentOS 8.1)
  • mysql80-community-release-sl15-3.noarch.rpm (openSUSE 15.1)
  • mysql-apt-config_0.8.15-1_all.deb (Ubuntu 20.04)
  • oniguruma-devel-6.8.2-1.el8.x86_64.rpm (CentOS 8.1)
  • httpd-2.4.43.tar.gz
  • php-7.4.6.tar.gz

それ以外の必要なパッケージは、ディストリビューションの標準パッケージコマンド(dnfやaptなど)でインストールし、個別ダウンロードは不要です。

ダウンロードについては、公式サイトにアクセスして、そこからダウンロードしてFTPで転送するか、ダウンロードファイルのURLさえわかれば、wgetで入手することもできますが、入手方法は省略しています。

firewalldによるネットワークごとのアクセス制御

現時点でのfirewalldの状態

前回の構築そのものを行った時点では、firewalldには以下のルールが存在しているかと思います。

  • 192.168.1.0/24からのポート80(HTTP):許可
  • 192.168.1.0/24からのポート443(HTTPS):許可
  • それ以外に、SSHやSambaなど別途ポートを許可しているものもあるが、ここではWebサーバーと関係ないので省略

この時点では「サーバー条件」の「IPアドレス」の図のように192.168.5.0/24のネットワークを新しく増設しても、ファイアウォールを開けていないので、アクセスできないはずです。

ここではクライアント(192.168.5.2)からWebサーバーへアクセスするには、Webサーバーの増設側のポートのIPアドレス、https(ポートは443)://192.168.5.1/ を入力すればわかります。もちろん192.168.5.0/24側のクライアントからはメイン側(192.168.1.18)へはアクセスできないことは、ネットワークの構造から明白です。

192-168-5-0_443-refuse.png

ほらね(* ॑꒳ ॑* )⋆*

firewalldでネットワークセグメントごとのアクセスを許可・拒否

別のネットワークセグメントのアクセスを許可

では192.168.5.0/24でも許可できるよう、Webサーバーのfirewalldに「192.168.5.0/24からのポート443(HTTPS):許可」というルールを追加してみます

ネットワークセグメントを特定して、特定のポートを受信ルールを入力するには、firewalldのrich ruleを使います。--add-rich-ruleを用いて、'~'で囲ったルールを入れます。

# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.5.0/24" port port="443" protocol="tcp" accept'

これは、IPファミリーがIPv4、送信元が192.168.5.0/24で、ポート443、プロトコルがTCPで、受信を許可する、という意味です。

both.png

  • 192.168.1.0/24からのポート80(HTTP):許可
  • 192.168.1.0/24からのポート443(HTTPS):許可
  • 192.168.5.0/24からのポート443(HTTPS):許可

上の画面は、このfirewalldの状態でアクセスしてみた画面です。確かにアクセスできるようになりました!!ちなみに永続的にアクセスできるようにするには「firewall-cmd」の後ろに「--permanent」というオプションを付ければ、再起動してもルールが適用されたままになります

ちなみにネットワーク192.168.5.0/24からのポート443(HTTPS)の許可をやめたい場合は、--remove-rich-ruleを使って、'~'で囲った中に、削除したいルールを入れます。例えば、IPv4で、192.168.5.0/24からの、ポート443(TCP)の許可しているルールを削除するには、

# firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.5.0/24" port port="443" protocol="tcp" accept'

を入力すると、192.168.5.0/24からポート443(HTTPS)にアクセスできなくなります。

192-168-5-0_443-refuse.png

ネットワークアクセスを拒否するには

次にこんな実験をしてみた。メインのネットワークセグメント192.168.1.0/24で、ポート80(HTTP)を拒否し、ポート443(HTTPS)のみを許可した状態にしたままにする場合には、IPv4、192.168.1.0/24からのポート80(TCP)の許可というルールを、削除します

# firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept'

基本的にfirewalldはルールに存在しないものはデフォルトで遮断しているので、ルールにリストアップされていない場合は受信拒否する(ホワイトリスト方式)ので、上記みたいに、192.168.1.0/24のポート80がルールにない場合は、アクセス不可能になります。

port80refuse.png

Apacheの所有者とパーミッションの管理

Apacheの起動ユーザーを変更する

Apacheではデフォルトでは(ソースをコンパイルしてインストールした場合)、ユーザーは「daemon」で起動しています。ps -auxで、全部のプロセスとユーザー一覧を表示し、うち「httpd」を起動しているものに絞るので、grep httpdで絞り込みます

# ps -aux | grep httpd
root     14249  0.0  0.4 121504 17124 ?        Ss   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14250  0.0  0.5 1332460 22448 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14251  0.0  0.4 1330220 19460 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
daemon   14252  0.0  0.6 1332460 25428 ?       Sl   17:15   0:00 /usr/local/apache2/bin/httpd -k start
admin    17782  0.0  0.0   8176   924 pts/0    S+   18:45   0:00 grep --color=auto httpd

上記のように「/usr/local/apache2/bin/httpd」というhttpd本体を動かしているユーザーは「daemon」というデフォルトのユーザーになります。

では、明示的にApacheを動かすユーザーが決まっている場合、どのようにして編集すればいいのかどうかは、httpd.confを編集して対応しました。例えば、Apacheをユーザー名「apache」、グループ名「users」で実行したい場合(openSUSEで実験したので、グループ名はusersになっています)は、

# vi /usr/local/apache2/conf/httpd.conf
httpd.conf
User daemon   ← apacheに置き換える
Group daemon   ← usersに置き換える

それで、Apacheを再起動して、再度ps -auxで、httpdを動かしているユーザーを確認すると、

# ps -aux | grep httpd
root     17985  0.0  0.4 121504 16944 ?        Ss   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17986  0.0  0.3 1327980 16060 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17987  0.0  0.2 1327980 11980 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
apache   17988  0.0  0.2 1327980 11980 ?       Sl   18:48   0:00 /usr/local/apache2/bin/httpd -k start
admin    18071  0.0  0.0   8176   836 pts/0    S+   18:48   0:00 grep --color=auto httpd

ちゃんとapacheがhttpdを実行していることがわかります。

Apache上のファイルを他人に見せたい場合と見せたくない場合

Apacheの実行ユーザーを変更できたので、今度は他人に見せるものと見せたくないものを管理したいと思います。

他人のユーザーで、読み込みを許可しない場合

例えば、ApacheのhtdocsフォルダがWebで公開されているものとして、そこには以下のファイルが存在しているものとしましょう。

# cd /usr/local/apache2/htdocs
# ls -l
合計 24
-rw-r--r-- 1 admin users  304  6月 25 17:43 connect.php
-rw-r--r-- 1 root  root    45  6月 12  2007 index.html
-rw-r--r-- 1 root  root    20  6月 25 17:14 phpi.php
-rw-r--r-- 1 root  root   172  6月 25 18:52 some.html
-rw-r--r-- 1 admin users  346  6月 25 17:45 test_form.html
-rw-r--r-- 1 admin users 1271  6月 25 17:45 test_form.php

そこで「some.html」にアクセスするとしましょう。所有者はroot、パーミッションは644なので、この設定は、誰でも「some.html」はアクセスできるという意味で、ちなみにApacheでのアクセスは読み込みだけを行い、書き込みも実行も行わないので、読み込むだけにします。

200ok.png

Apacheの実行ユーザーはapacheにしました。その際はちゃんと読み込めました

そこで所有者はrootのままで「some.html」のパーミッションを600(他のユーザーは読み込み不可能にし、ユーザー自身だけが使用できる状態にする)に変更してみたんです

# chmod 600 some.html
# ls -l
合計 24
-rw-r--r-- 1 admin users  304  6月 25 17:43 connect.php
-rw-r--r-- 1 root  root    45  6月 12  2007 index.html
-rw-r--r-- 1 root  root    20  6月 25 17:14 phpi.php
-rw------- 1 root  root   172  6月 25 18:52 some.html
-rw-r--r-- 1 admin users  346  6月 25 17:45 test_form.html
-rw-r--r-- 1 admin users 1271  6月 25 17:45 test_form.php

403.png

今度はForbiddenになって読み込めなくなった。Apacheの実行ユーザーapacheがrootのものを読み込むことを禁止されているから明らかだね。

Apache実行ユーザーと同じ所有者で、他人のユーザーを許可しないファイル

今度は、さきほどの「some.html」を、Apache実行ユーザーの所有にし、他のユーザーが読み込めない状態のままに変更して、再度アクセスできるか調べます。

# chown apache:users some.html
# ls -l
合計 24
-rw-r--r-- 1 admin  users  304  6月 25 17:43 connect.php
-rw-r--r-- 1 root   root    45  6月 12  2007 index.html
-rw-r--r-- 1 root   root    20  6月 25 17:14 phpi.php
-rw------- 1 apache users  172  6月 25 18:52 some.html
-rw-r--r-- 1 admin  users  346  6月 25 17:45 test_form.html
-rw-r--r-- 1 admin  users 1271  6月 25 17:45 test_form.php

200ok.png

今度はアクセスできた( ´ •̥ ̫ •̥ ` )
自分自身のファイルだから読み込めるんだね

Apache実行ユーザーと同じ所有者で、どのユーザーを許可しないファイル

最後に、誰も読み込みを許可しないhtmlで検証してみます
「some.html」パーミッションは000か200に設定し、誰も読み込みを許可しない設定にします

# chmod 200 some.html
# ls -l
合計 24
-rw-r--r-- 1 admin  users  304  6月 25 17:43 connect.php
-rw-r--r-- 1 root   root    45  6月 12  2007 index.html
-rw-r--r-- 1 root   root    20  6月 25 17:14 phpi.php
--w------- 1 apache users  172  6月 25 18:52 some.html
-rw-r--r-- 1 admin  users  346  6月 25 17:45 test_form.html
-rw-r--r-- 1 admin  users 1271  6月 25 17:45 test_form.php

403.png

そうだよね( ˙꒳​˙ᐢ )
自分自身も読み込みを許可していないと、確かにこうなるしね…

まとめ

ミドルウェアを構築しました、その次に来るのは、誰が何を許可・拒否するかの取り決めを行うことが重要視されるので、Qiitaにはぜひとも基本としてfirewalldと所有者でアクセス権を設定する方法もここに載せておきたかったです

高度なセキュリティ分野だと暗号化も入るらしいが、ファイルシステムの暗号化に踏み切ると、パスワードの入力や鍵のタイミングについても複雑な課題が入ってしまうので、初心者にはあまりお勧めできないかな…と思ったので、必要最低限の暗号化についてはHTTPSの構築方法にとどめておいた( ´ •̥ ̫ •̥ ` )

まぁ大事なのは、漏れては問題となるようなものを置かない、不要なポートを開放しない、それが絶対的な前提だしね…

参照サイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ps aとps -aの違い

man psで調べてみた

       a      Lift the BSD-style "only yourself" restriction, which is imposed upon the set
              of all processes when some BSD-style (without "-") options are used or when
              the ps personality setting is BSD-like.  The set of processes selected in
              this manner is in addition to the set of processes selected by other means.
              An alternate description is that this option causes ps to list all processes
              with a terminal (tty), or to list all processes when used together with the x
              option.

       -A     Select all processes.  Identical to -e.

       -a     Select all processes except both session leaders (see getsid(2)) and
              processes not associated with a terminal.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuxルーターでTTL確認

Linuxをルーターに仕立て、IPパケットのTTLが機能していることを確認

IPパケットのTTL(Time to Live)は無限転送を防ぐためのもの。サブネット(ルーター)を通過するとデクリメント(値が1減)される。ここでは、Linuxにルーター設定を行い、TTLの動作を確認する。

ネットワーク構成

構成.png

例によってVirtualBoxを使ってこのような構成を作る。VirtualBoxの設定例は、こちらを参照。

Linuxルーターの設定

上記構成だとStatic Routeの設定は不要。単にForwarding(net.ipv4.ip_forward)を有効化するのみ。

~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
~# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

実験

その1

端末2(192.168.102.2)から端末1(192.168.101.2)へpingする。このときTTLを10(-tオプション)に設定。

~# ping -t 10 192.168.101.2
PING 192.168.101.2 (192.168.101.2) 56(84) bytes of data.
64 bytes from 192.168.101.2: icmp_seq=1 ttl=63 time=0.691 ms

通常ttlのデフォルトは64になっている様子。リプライパケットの”ttl=63”でも、TTLのデクリメントが確認できるが、ここでは、送信時の”TTL=10”の様子をパケットキャプチャデータで確認する。送信側(端末2)のキャプチャデータはこちら。
TTL=10.png
受信側(端末1)のキャプチャデータはこちら。
TTL=9.png
期待どおり、”TTL=9”とデクリメントされている。

その2

”TTL=1”に設定する。

~# ping -t 1 192.168.101.2
PING 192.168.101.2 (192.168.101.2) 56(84) bytes of data.
From 192.168.102.1 icmp_seq=1 Time to live exceeded

ルーターでTTLがデクリメントされて、’0’となりパケット到達不能となった。

終わりに

Linuxでもルーターになることを確認した。当たりまえか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む