- 投稿日:2020-07-04T23:31:06+09:00
bash で タブ補完するときに大文字小文字を区別しないようにする
echo 'set completion-ignore-case On' >> ~/.inputrcあるいは
echo "bind 'set completion-ignore-case on'" >> ~/.bashrcRaspberry Pi OS 10.4 で検証
参考: Can I make Tab auto-completion case-insensitive in Bash?
- 投稿日:2020-07-04T22:59:40+09:00
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つの意味に分けられて使われる
- 狭義のLinux:Linuxカーネル
- 広義の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
- LinuxはUNIXを元に作られた
- UNIXとLinuxの大きな違いは、「有償で知的財産権が開発企業に属しているか、オープンソースで無償で改変や配布ができるか」
- UNIXとLinuxでコマンドは同一のものが多いが、オプションの意味が異なる場合がある
- GNU coreutilsというパッケージを導入すると、UNIX系OSでもLinuxコマンドが使えるようになる
- Linuxは、OSの根幹となる「Linuxカーネル」と、アプリケーションとひとまとめにした「Linuxディストリビューション」の2つの意味を持つ
実務で役立ちそうな関連記事
参考サイト
- 投稿日:2020-07-04T22:59:40+09:00
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つの意味に分けられて使われる
- 狭義のLinux:Linuxカーネル
- 広義の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
- LinuxはUNIXを元に作られた
- UNIXとLinuxの大きな違いは、「有償で知的財産権が開発企業に属しているか、オープンソースで無償で改変や配布ができるか」
- UNIXとLinuxでコマンドは同一のものが多いが、オプションの意味が異なる場合がある
- GNU coreutilsというパッケージを導入すると、UNIX系OSでもLinuxコマンドが使えるようになる
- Linuxは、OSの根幹となる「Linuxカーネル」と、アプリケーションとひとまとめにした「Linuxディストリビューション」の2つの意味を持つ
実務で役立ちそうな関連記事
参考サイト
- 投稿日:2020-07-04T22:34:56+09:00
curlを使ってjavascriptを有効にした場合のhtmlソースを取得する
domcurlというツールがあります。webscrapingに非常に便利なツールです。
phantomjs
などで要件を満たせない場合におすすめです。domcurlはPuppeteerを使う小さなNodeJSアプリケーションで、 npm i domcurlコマンドを発行することでインストールできます。 curlコマンドのように、簡単なdomcurl [url]を発行してリソースを取得し、JSをページ上で実行することができます。
$ npm i domcurl $ ./node_modules/domcurl/index.js --url https://example.com
- 投稿日:2020-07-04T22:09:29+09:00
man nftables 日本語訳
man nftables
で表示されるマニュアルの日本語訳。名前
nft - パケットのフィルタリングと分類を目的とする nftables フレームワークの管理ツール
概要
nft [ -nNscae ] [ -I directory ] [ -f filename | -i | cmd ...] nft -h nft -v説明
nft は nftables フレームワークの Linux カーネルでパケットフィルタリングおよび分類ルールを設定、管理、検査するために使用されるコマンドラインツールです。
Linux カーネルサブシステムは nf_tables として知られており、nf
はNetfilter
を表します。オプション
オプションの完全な要約を見るには、
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 acceptinetテーブルからルールを削除する例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。couter
とquota
はキー名として使用できません。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 つの引数を指定する。 over
とuntil
はこれらの引数の前にあります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 localhostIPV6 アドレス型
名前 キーワード サイズ ベースタイプ 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 existsICMP タイプ型
名前 キーワード サイズ ベースタイプ 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 acceptFIB(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 counterICMPV6 ヘッダー式
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 counterCONNTRACK 式
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 deviceDup ステートメントの値
式 説明 タイプ 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 deviceset ステートメント
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 があります。
- 投稿日:2020-07-04T21:13:11+09:00
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
③FedoraDebian系
①Debian GNU/Linux
②Ubuntu
③Linux Mint
④Edubuntu上記がそれぞれで使われているソフトウェアですが、どのような特徴があって、どんな使われ方をしているのかは、また調べてからまとめたいと思います。
以上です。
参考文献
参照URL
Linuxディストリビューションとは?
【目的別】初心者におすすめのLinuxディストリビューション7選
今更聞けない!CentOSとRed Hatの違いとは?
Linuxとは
- 投稿日:2020-07-04T17:55:56+09:00
過去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-03macOS 動作版
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
- 投稿日:2020-07-04T15:58:53+09:00
LinuxでApache2.4(httpd 2.4.43)+PHP7.4でWebサーバー構築 - 4.セキュリティ(chownとfirewalld)編
前提と準備
Linuxサーバー構築の記事
- Sambaでファイルサーバー構築(CentOS 8.1・openSUSE 15.1・Ubuntu 20.04)
- LinuxでApache2.4+PHP7.4をソースコンパイル - 1.Apache導入
- LinuxでApache2.4+PHP7.4をソースコンパイル - 2.PHP導入
- LinuxでApache2.4+PHP7.4をソースコンパイル - 3.MySQL導入
- LinuxでApache2.4+PHP7.4 - 4.セキュリティ(chownとfirewalld)【この記事】
前回までは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
パッケージを個別ダウンロードしてインストールする機能とバージョン(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)へはアクセスできないことは、ネットワークの構造から明白です。
ほらね(* ॑꒳ ॑* )⋆*
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で、受信を許可する、という意味です。
- 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.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がルールにない場合は、アクセス不可能になります。
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.confhttpd.confUser 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でのアクセスは読み込みだけを行い、書き込みも実行も行わないので、読み込むだけにします。
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今度は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今度はアクセスできた( ´ •̥ ̫ •̥ ` )
自分自身のファイルだから読み込めるんだね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そうだよね( ˙꒳˙ᐢ )
自分自身も読み込みを許可していないと、確かにこうなるしね…まとめ
ミドルウェアを構築しました、その次に来るのは、誰が何を許可・拒否するかの取り決めを行うことが重要視されるので、Qiitaにはぜひとも基本としてfirewalldと所有者でアクセス権を設定する方法もここに載せておきたかったです
高度なセキュリティ分野だと暗号化も入るらしいが、ファイルシステムの暗号化に踏み切ると、パスワードの入力や鍵のタイミングについても複雑な課題が入ってしまうので、初心者にはあまりお勧めできないかな…と思ったので、必要最低限の暗号化についてはHTTPSの構築方法にとどめておいた( ´ •̥ ̫ •̥ ` )
まぁ大事なのは、漏れては問題となるようなものを置かない、不要なポートを開放しない、それが絶対的な前提だしね…
参照サイト
- 投稿日:2020-07-04T14:18:16+09:00
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.
- 投稿日:2020-07-04T11:16:20+09:00
LinuxルーターでTTL確認
Linuxをルーターに仕立て、IPパケットのTTLが機能していることを確認
IPパケットのTTL(Time to Live)は無限転送を防ぐためのもの。サブネット(ルーター)を通過するとデクリメント(値が1減)される。ここでは、Linuxにルーター設定を行い、TTLの動作を確認する。
ネットワーク構成
例によって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)のキャプチャデータはこちら。
受信側(端末1)のキャプチャデータはこちら。
期待どおり、”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でもルーターになることを確認した。当たりまえか。