9.ネットワークセキュリティ

【LPIC303範囲】Radiusサーバ、Snort、iptablesによるファイヤーウォール設定、OpenVPN/WireGuardなどに関して。

9.1. ネットワークセキュリティの強化

9.1.1. Radius

Radius(Remote Authentication Dial-In User Service)は接続するユーザーとネットワーク サービスに一元的な認証、認可、アカウンティング(通称AAA)を提供するプロトコルのこと。

  • 認証(Authentication) … クライアント (ユーザー、デバイス、またはプロセス) がシステムの本物のユーザーであるかどうかを判断するプロセス
  • 認可(Authorization) … クライアントがネットワーク上で何を行うことが許可されているかを決定するプロセス
  • アカウンティング … ネットワーク上のクライアントのアクティビティを監視し、サービスのコストを計算するために必要な情報を提供するプロセス

3つの AAA プロトコルすべてを使用する必要はなく、必要なプロトコルのみを使用する。

9.1.2. FreeRADIUS

FreeRADIUSはOSSのRadius実装で最も広く使用されている RADIUS サーバのこと。 FreeRADIUSは認証サービスを提供するradiusdデーモンを提供する。

インストール

dnf install  freeradius freeradius-utils freeradius-mysql freeradius-perl

サービスの開始

systemctl enable radiusd --now

/etc/raddb/*

/etc/raddb/*以下にFreeRADIUSの設定ファイルが格納される。 代表的な設定ファイルは以下の通り。

  • radiusd.conf … FreeRADIUSのプライマリ設定ファイル。サーバーのログ記録とパフォーマンスの設定ができる
  • client.conf … クライアント構成ディレクティブ
  • proxy.conf … プロキシ半径およびrealm設定ディレクティブ
  • policy.d

Radmin

radminは実行中のサーバーの制御ソケットに接続し、それにCLIを提供するFreeRADIUSサーバー管理ツールのこと。

radmin <オプション>
オプション説明
-dデフォルトは/etc/raddb。 radmin はここでサーバー構成ファイルを検索し、制御ソケットのファイル名を定義する「listen」セクションを見つけます。
-D 辞書ディレクトリメイン辞書ディレクトリを設定する。 デフォルトは/usr/share/freeradiusとなる
-e コマンドコマンドを実行して終了する
-E実行中のコマンドをEchoする
-f ソケットファイルソケットファイル名を直接指定する
-hヘルプ情報の表示
-i 入力ファイル指定されたファイルから入力を読み取る。指定しない場合はstdin が使用される
-n 名前/raddb/radiusd.confの代わりに/raddb/name.confを読み取る

基本構成

デフォルトの構成を使用することがサーバの設定を最も破壊せずに使用できる方法といえる。 この場合、ユーザとパスワードの設定のみでよくなる。 手順は以下の通り。

  1. /etc/raddb/clients.confを編集してエントリ追加する
  2. ipaddrにクライアントIP、secretには通信の暗号化と復号化に使用される共有秘密を指定
  3. /etc/raddb/usersを編集しユーザアカウントを作成する
  4. testing Cleartext-Password := "password"のように設定
  5. サーバーをデバッグモードで起動する(radiusd -X)

なお、クライアントの設定方式は以下のようになる。

client test {
    ipaddr = 192.168.0.0/24
    secret = test_abcz
}

radtestコマンド

FreeRADIUS サーバーが動作可能になった際に、アカウントをテストできるコマンド。

radtest {username} {password} Pradius-server} {nas-port-number} {radius_secret}

使用例は以下の通り。

radtest testing mypass localhost 0 s3cre3t

radclientコマンド

radclientは任意のRADIUSパケットをRADIUSサーバに送信し応答を表示するコマンド。れは、RADIUS サーバーの設定に加えた変更をテストするために使用したり、RADIUS サーバーが稼働しているかどうかを監視したりするために使用できる。

radclient <オプション>

radlastコマンド

radlastコマンドはlastコマンドのFreeRADIUS サーバーにおけるフロントエンド。

radlast <オプション>

radwhoコマンド

radwhoコマンドは現在ログオンしているユーザーを表示するコマンド。

radwho <オプション>

9.1.3. ネットワークユーティリティ

tcpdumpコマンド

tcpdumpはシステムを通過する TCP/IP パケットなどのネットワーク トラフィックをキャプチャ、フィルタリング、分析するために使用できるコマンド。 システム管理者が Linux での接続の問題をトラブルシューティングするためのコマンドともいえる。

なおtcpdumpを用いて.pcapファイルにパケット情報を保存することもできる。

tcpdump <オプション> [条件式]
オプション説明
-i <インターフェイス>指定したインターフェイスの監視
-nホスト名ではなくIPアドレスの表示
-r <ファイル>ファイルからパケット情報を取得
-w <ファイル>パケット情報をファイルへ出力する
-s <バイト数>パケットを取り出すバイト数を指定する
-xパケット内容を16進数で表示する
-Xパケット内容を16進数とASCII文字列で表示する
-pプロミスキャスモードにしない
-mMIBモジュールを読み込む
条件式修飾子説明
host <ホスト>送信先/送信元がホストならば真
port <ポート番号>送信元/送信先がポート番号ならば真
src <送信元>
dst <送信元>
送信元/送信先の条件指定
and , or複合条件の設定

WireShark

Wireshark はパケットを分析するためのGUIツール。 Wireshark は GUI ツールだが、tshark として知られる CLI に相当するツールがある。

Wiresharkでは、条件を指定することで表示するパケットをフィルタリングすることができる。

フィルタ条件説明
host <ホスト>送信先/送信元がホストのパケットをキャプチャ
net <ネットワーク>対象のネットワークを流れるパケットをキャプチャ
[tcp/udp] port <ポート>対象プロトコルのポートが流れるパケットをキャプチャ
src/dst <送信元>送信先/送信元が送信元/送信先のパケットのみをキャプチャ
portrange A-Bポート番号A-Bの範囲のパケットをキャプチャ

条件式は以下の通り。

  • A eq B … A=B
  • A gt B … A>B
  • A ge B … A>=B
  • A lt B … A<B
  • A le B … A<=B
  • A and B … AかつB
  • A or B … AまたはB
  • not <条件式> … 条件満たさないとき
  • A[パターン] == B … パターンがBに合致でおk

Tshark

TSharkはWireSharkのCUIユーティリティ。 使用できるコマンドは以下の通り。

tshark [オプション]
オプション説明
-D有効なネットワークインターフェイス一覧表示
-i <インターフェイス>ネットワークインターフェイスを指定
-f <フィルタ条件>キャプチャするパケットフィルタ
-w <ファイル>キャプチャしたパケットをファイルへ保存
-r <ファイル>ファイルからパケット情報を読みこむ
-z <項目>項目に対する統計情報を出力
-V詳細表示

ndpmon

ndpmonはNDP(Neighbor Discovery Protocol)を監視するツール。NDPに関する状況をlogに記載したり、アラートメールを送信することも可能。

NDPはIPv6においてデータリンク層のアドレス解決を行うプロトコル。 NDPで利用されるメッセージの一つに、IPv6ルータからの応答であるルータ広告(RA:Router Advertisement)がある。RAはICMPv6を用いたグローバルIPアドレスのプレフィックスなどの情報で、悪意ある攻撃者がルータに成りすますとRAが書き換えられ不正なRAが発信される可能性がある。

ndpmonは、NDPをモニタリングすることにより、不正なRAを検出することができる。

Kismet

Kismetはワイヤレス ネットワークとデバイスの検出器、スニファー、ワードライビング ツール、および WIDS (ワイヤレス侵入検出) フレームワークのこと。

kismet_clientkismet_dronekismet_serverコマンド/ユーティリティで構成される。

aircrack_ng

aircrack_ngはWiFi ネットワークのセキュリティを評価するためのツール。 可能なことは以下の通り。

  • モニタリング … パケットのキャプチャとデータのテキスト ファイルへのエクスポートにより、サードパーティ ツールによるさらなる処理が可能
  • 攻撃 … パケットインジェクションによるリプレイ攻撃、認証解除、偽のアクセスポイントなど
  • テスト … WiFi カードとドライバーの機能を確認する (キャプチャとインジェクション)
  • クラッキング … WEP および WPA PSK (WPA 1 および 2)

Bettercap

BettercapはIEEE.802.11、BLE、IPv4、IPv6 ネットワークの偵察と MITM 攻撃用のツール。

9.1.4. ネットワークスレッド

不正ルーターによるアドバタイズメント

不正ルータによるルータ通知(アドバタイズメント)を防ぐにはカーネルを調整することで軽減できる。設定すべきファイルは以下の通り。

  • /proc/sys/net/ipv6/conf/<interface>/forwarding
  • /proc/sys/net/ipv6/conf/<interface>/accept_ra

Rouge DHCP メッセージ

DHCP スヌーピングを使用して対処できる。

9.2. ネットワーク侵入の検知

9.2.1. ネットワーク帯域監視

帯域監視は、トラフィック監視などとも呼ばれ、ネットワーク上を流れるデータ通信量を監視することを指す。

Linuxで帯域監視を行えるソフトウェアにntopCacti)がある。

Ntop(ntopng)

ntopはネットワークトラフィック(L2,L3)監視ソフトウェアで、ネットワークのステータス、UDP、TCP、DNS、HTTP、その他のプロトコルのトラフィックのプロトコルごとの分布をWebブラウザ上で確認できる。

設定ファイルは/etc/ntopng.confとなる。

ntop コマンド説明
/usr/sbin/ntop -Antop 管理者ユーザーのパスワードを設定する
ntop –set-admin-password=NewP@$$新しい管理者パスワードを設定する
ntop -P /etc/ntop -w4242 -d/etc/ntop 設定ファイルをポート番号 4242 で使用して、ntop をデーモンとして実行する。
-Wオプションは、Web ブラウザを通じて ntop にアクセスするポートを有効にする。このオプションを指定しない場合、デフォルトのポートは3000。
-dオプションを指定すると、ntop がデーモン モードで有効になる。

Cacti

Cactiは、RRDtoolと呼ばれるデータロギングとグラフィカルな描画を行う業界標準のツールを使った、WebUIを持つネットワーク監視ソフトのこと。

サーバ等の機器の動作状況をSNMP(Simple Network Management Protocol)を用いて監視できる。

RRDtool: RRDへデータを保持し、グラフを作成するOSS

9.2.2. Snort

Snortはネットワーク型IDSとして代表的なソフトウェア。 検知するパケットのルール(シグネチャ)を定義したルールファイルを参照して不正なパケットを検知する。

Snortには以下の用途で使用できる。

  • tcpdumpのようにパケットスニファとしての使用
  • パケット ロガーとしての使用
  • 本格的なIDSとしての運用

Snortのインストール

ソースからのダウンロードや、RedHatユーザはコチラからダウンロードできる。

Snortの構成

Snortの設定は/etc/snort/snort.confファイルで行う。 Debianの場合はSnort のデフォルト構成ファイル内の一部のネットワーク設定を上書きする必要がある。手順は/etc/snort/snort.debian.confを確認して行う。詳しくは公式ドキュメントより。

/etc/snort/*

ファイル説明
/etc/snort/snort.confネットワーク構成/監視するポートの定義が可能

Snortルール

Snortルールはシグネチャとは異なる検出手法でルールを作成するには、脆弱性が実際にどのように機能するかを正確に理解してルールを作成する必要がある。そのためデフォルトのルールセットを通常は用いると良い。

なおSnortルールは、/etc/snort/snort.confファイル内の行をコメント化またはコメント解除することによって有効または無効になる。 ルールは/etc/snort/rulesに保存される。

Snortルールの構文

Snortルールは、ルールヘッダルールオプションという 2 つの主要なコンポーネントで構成される。

なおルールセット(ルールファイル)に記述したシグネチャ(ルール)を変更した後は、snortプロセスを再起動することで変更が反映される。

alert ip any any -> any any (msg: "IP packet Detected";)

構成は以下の通り。

ルールアクション プロトコル IPアドレス ポート番号 <方向演算子> IPアドレス ポート番号 (ルールオプション)
  • ルールアクション
    • alert … ルールマッチしたパケットのログを記録し警告を出力する
    • log … ルールにマッチしたパケットをログに記録
    • pass … ルールにマッチしたパケットを無視
    • activate … ルールにマッチしたパケットについて警告出力し、対応するdynamicアクションの実行を行う
    • dynamic … activateアクションから呼び出され、該当パケットをログに記録
  • プロトコル
    • 検知対象(tcp, udp, icmp, ip)を記録
  • IPアドレス
    • x.x.x.xか範囲([x.x.x.x,y.y.y.y])または任意(any)で指定
  • ポート番号
    • ポート番号(x)または範囲((x,y))または任意(any)で指定
  • 方向演算子
    • ->:右側が送信先、左側が送信元となる
    • <>:左右に記載されるIP/ポートが送信先/送信元どちらでもよい
  • ルールオプション
    • 検知するパケットルールの指定
    • 未指定の場合はルールヘッダに垣外数るすべてのパケットがマッチする

snortのルールセット

Snortの主なルールセットは以下の通り。

ルールファイル説明
dos.rulesDoS攻撃を検出するためのルール
ftp.rulesFTPサービスへの攻撃を通知するためのルール
local.rulesユーザ独自のルール
scan.rulesスキャンを検知するためのルール
smtp.rulessmtpサービスへの攻撃を検知するためのルール
telnet.rulestelnetサービスへの攻撃を検知するためのルール
web-cgi.rulesWEBサーバのCGIに対する攻撃を検知するためのルール

snortコマンド

snort [オプション] <フィルタオプション>
オプション説明
-bログをtcpdump形式で記録
-c 設定ファイル設定ファイルの指定
-dアプリケーション層のデータも記録
-Dバックグラウンドで実行
-g <グループ>記録するグループの指定
-u <ユーザ>起動するユーザの指定
-i <インターフェイス>ネットワークインターフェイスの指定
-l <ディレクトリ>ログディレクトリの指定

9.2.3. OpenVASとNASL

OpenVAS(Open Vulnerability Assessment System)は、OSSの脆弱性スキャナソフトウェア。Network Vulnerability Tests(NVTs)と呼ばれる脆弱性テストを常に更新でき、最新の脆弱性情報にすばやく対応できることが強みで、CLIでもGUIでも操作できるインタフェースを持つ。

NASLはNessusやOpenVASなどの脆弱性スキャナーで使用されるセキュリティ対策用に特化したスクリプト言語のこと。NASLを使用すると、既知の脆弱性に基づいて特定の攻撃を自動化できる。

なおOpenVasの設定は/etc/openvas/以下に配置され、/etc/openvas/openvassd.confが全体における主要な動作の設定ファイルとなる。

openVASのユーティリティ

OpenVASを操作するユーティリティには以下のようなものがある。

ユーティリティ機能
openvasmdOpenVasManager: 各種操作が行える
openvasmd –rebuildデータベースの再構築を行う
openvassdスキャン処理を行う
openvas-nvt-syncNVTsを更新する
openvas-mkcertクライアントと暗号化通信を行うための証明書を発行する

ユーザの追加と削除

OpenVASではユーザごとにスキャン内容を設定することができる。 ユーザ追加/削除は以下コマンドで可能。

# 追加
openvasmd --create-user
# 削除
openvasmd --delete-user

NTSsのアップデート

openvas-nvt-syncコマンドで最新の状態にアップデートすることができる。

openvas-nvt-sync

クライアントとの通信の暗号化

OpenVASスキャナとこれを使うクライアント間の通信はSSL化される。 この際に必要な証明書はopenvas-mkcertコマンドで作成できる。

openvas-mkcert

9.3. パケットフィルタリング

9.3.1. ファイヤーウォールの基礎

ファイヤーウォールのアーキテクチャ

ファイヤーウォールのアーキテクチャにはパケットフィルタリング型ゲートウェイ型がある。

  • パケットフィルタリング型
    • 通信を細分化したパケットを監視するファイアウォール
    • 通信をパケット単位で解析し、決められたルールに基づいて通過の許否を判断する
    • アプリケーション層レベルの判断はできない
  • ゲートウェイ型
    • 内部コンピュータの代わりに通信を行うファイアウォール
    • アプリケーション型、プロキシサーバ型とも呼ばれる
    • データの細切れであるパケットの中身まで把握できる
    • アプリケーション層(FTP, HTTPなど)でのフィルタリングを行うことができる

パケットフィルタリング型ファイヤーウォール

パケットフィルタリング型には以下の2種類がある。

  • ステートレス … 個々のパケットについて、スタティックなIPアドレスおよびポート番号のみのフィルタリングを行う
  • ステートフル … 往きのパケットに基づき、戻りのパケットに対してもフィルタリングルールを適用する

9.3.2. ファイヤーウォール

Netfilter

Netfilterはカーネルモジュールであり、カーネルがインターフェイスに転送するネットワークトラフィックはすべて netfilter を通過するようになっている。 netfilterモジュールへの主要なインターフェイスはiptablesであり、Linux ファイアウォールで高度な構成を行うことができる。

iptablesは複雑であるため、ufw 、 firewalld などの他の解決策が考案された。 これらは iptables と連携して動作し、ファイアウォールの設定を簡単に行えるようにする。

Iptables

iptablesはテーブルとして動作し以下の3種類の機能を提供する。

  • Filter … パケットフィルタリングとして使用される
  • NAT … アドレス変換に使用される
  • MANGLE … パケットを特別な処理をしたい場合に使用される

各テーブルにはチェインがあり、どの種類のパケットをフィルタリングするか定義するために使用される。 以下の種類がある。

  • PREROUTING - (NAT, MANGLE) * パケットがルーティングテーブルに渡される前に処理する * 通常はパケットを別のアドレスまたはポートにリダイレクトするために使用する(DNAT)
  • INPUT - (NAT, Filter, MANGLE) * パケットがホストに到着するときに処理する * ネットワークからの着信接続や、ローカルプロセスからのローカルホストへの通信が含まれる
  • OUTPUT - (NAT, Filter, MANGLE) * ホストから発信されるパケットを処理する * ローカルホストから外部のネットワークへの接続や、ローカルプロセスからの通信が含まれる
  • FORWARD - (Filter, MANGLE) * ホストを経由して他のホストに送信されるパケットを処理する * ルーターがパケットを他のネットワークセグメントにルーティングする際に使用する
  • POSTROUTING - (NAT, MANGLE) * パケットがルーティングテーブルを通過した後に処理する * パケットが送信元または宛先の IP アドレスを変更するために使用する

チェインはルールを作成できるフィルタリングポイントであり、ルールはトラフを通過するパケットに適用される。 ルールは、パケットに対して正確に何が起こるべきかを定義するもので以下のようにターゲットを指定できる。

  • ACCEPT … パケットの許可
  • DROP … パケットをドロップする
  • REJECT … パケットを拒否し、送信者にはICMP警告メッセージを送信する
  • LOG … ログを取る
  • MASQUARATE … NATに使用される

iptablesコマンド

iptablesコマンドは、Linuxシステムでファイアウォールを構成および管理するためのコマンド。 iptablesは、パケットのフィルタリング、NAT (Network Address Translation)、パケットの転送などの機能を提供している。

iptables -A chain [-i/-o interface] [-s/-d address] -p udp --sport/--dport 80  -j TARGET

| オプション | 説明 | | -L <チェーン名> -t <テーブル名> | 指定されたチェーンおよびテーブル内のすべてのルールをリストする。チェーンまたはテーブルが指定されていない場合は、すべてを表示する。 | | -D | 特定のチェーン内のルールを番号によって削除する | | -バツ | チェーンを削除する | | -F (または –flush) | ルールのすべて (または指定されたチェーン) をフラッシュする | | -P | チェーンのデフォルトポリシーを変更する(DROPまたはACCEPTに設定可能) | | -v | 通常は、追加の出力を提供するために -F(または –flush) とともに使用される | | -n | IPアドレスとポートを数値形式で表示する |

# 現在のルールをリストする
iptables -nvL

# ポリシの作成
iptables -P INPUT DROP

# ルールの追加
iptables [-t table] {-A|-C|-D} chain rule-specification
# -A : 選択したチェーンの末尾に 1 つ以上のルールを追加
# -C : 仕様に一致するルールが選択したチェーンに存在するかどうかを確認
# -D : 選択したチェーンから 1 つ以上のルールを削除

# ルールの挿入
iptables [-t table] -I chain [ルール番号] rule-specification

# ルールの削除
iptables [-t table] -D chain ルール番号

# パケットカウンタとバイトカウンタをゼロに設定
iptables [-t table] -Z

/etc/sysconfig/iptables

/etc/sysconfig/iptablesブート時またはサービスの開始時にカーネルがパケット フィルタリング サービスを設定するために使用する情報が保存されるファイル。

  • iptables-save … iptablesルールを永続保存するためのコマンド * iptables-save > /etc/sysconfig/iptables.$(date +%d-%m-%y) * -c:パケットカウンタ及びバイトカウンタの現在値を表示 * -t テーブル:テーブルを指定
  • iptables-restore … バックアップの設定からiptablesの設定を復元するコマンド * iptables-restore < /etc/sysconfig/iptables.20-09-22 * -c:パケットカウンタ及びバイトカウンタの値を復元 * -n:復元する際に現在のテーブル内容を削除しない

iptablesによるIP毎の接続制限

connlimitジュールを使用すると、クライアントIP アドレス (またはアドレス ブロック) ごとにサーバーへの並列 TCP 接続の数を制限できる。 これは、サーバ または VPS をフラッディング、スパム、Webスクレイピングから保護するのに役立つといえる。

iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset

例は以下の通り。

# クライアントホストごとに3つのSSH接続のみを許可する
iptables  -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

# IP/ホストごとに20個のHTTP接続までに制限する
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

iptablesによる1秒あたりの接続数制限

staterecentモジュールを使用すると、1秒あたりの接続数制限ができる。

ip6tables

Ip6tables は IPv6 パケット フィルタ ルールのテーブルの設定、維持、および検査に使用される。

9.3.3. 高度なファイアウォール

IPset

IPsetはIPアドレス、ネットワーク範囲、MACアドレス、ポート番号、およびネットワークインターフェイス名の保存されたコレクションであり、 iptablesツールは、IPセットを利用して、より効率的なルール照合を行うことができる。netfilterと連携して使用できる。

利用例としては悪意のある通信元が分かっているアドレスがあるときに、IPセットを作成しiptablesで参照することでルール セットが動的になり、構成が容易になる。

ipsetコマンド

ipsetコマンドはIP セットを作成および変更できるコマンド。

ipset <オプション>

range_setは名称、hashは保存方法、netはデータ型を定義する。

ipset create <range_set> <hash:net>

オプションは以下の通り。

オプション説明
create新しいIPセットを作成
addIPセットにエントリを追加
delIPセットからエントリを削除
destroyIPセットを破棄
listIPセットの内容をリスト
flushIPセット内のすべてのエントリを削除
test指定したIPがIPセットに含まれているかどうかを確認
swap2つのIPセットの内容を交換
renameIPセットの名前を変更

ipsetの永続化

作成した ipset はメモリに保存され、再起動すると消去される。 ipset を永続的にするには以下コマンドで可能。

ipset save > /etc/ipset.conf

復元には以下コマンド。

ipset restore < /etc/ipset.conf

DMZネットワーク

DMZは組織の内部ローカル エリア ネットワークを信頼できないトラフィックから保護し、セキュリティ層を追加する境界ネットワークのこと。 通常DMZはパブリックインターネットとプライベートネットワークの間にあるサブネットワークを指す

DMZを設置する目的は以下の通り。

  • プライベートネットワークや LAN の安全性を確保しながら、インターネットなどの信頼できないネットワークにアクセスできるようにする
  • 外部向けのサービスとリソースに加え、DNS、ファイル転送プロトコル (FTP)、メール、プロキシ、VoIP、および Web サーバーのサーバーを DMZ に設置する

DMZを置くことでハッカーがインターネット経由で組織のデータや内部サーバーに直接アクセスすることがより困難になる

Connection Tracking

ConntrackはLinux カーネルのネットワークスタックの中核機能の1つでカーネルはすべての論理ネットワーク接続またはフローを追跡でき、各フローを構成するすべてのパケットを識別して、それらを一貫して一緒に処理できる機能のこと。

Conntrackは通常、フロー内の最初のパケットのみが完全なネットワークスタック処理を通過して処理を決定する必要があるため、パフォーマンスを向上させる (CPU の削減とパケット遅延の削減)。 設定ファイルは/proc/sys/net/nf_conntrack_maxとなる。

またconntrack-toolsパッケージには 2 つのプログラムが含まれている。

  • conntrack * 接続追跡システムと対話するためのフル機能のコマンド ライン ユーティリティを提供する * 既存のフロー エントリを一覧表示、更新、削除できる
  • conntackd * ユーザー空間の接続追跡デーモン * ユーザスペースで動作する

NAT

NATは送信元と宛先の IP アドレスとポートを変更すること。 アドレス変換により、IPv4 パブリック アドレスの必要性が減り、プライベート ネットワーク アドレス範囲が隠蔽される。 このプロセスは通常、ルーターまたはファイアウォールによって実行される。

  • SNAT * ソースのプライベート IP アドレスをパブリック IP アドレスに変換するプロセスのこと
  • DNAT * パケットの IP ヘッダー内の宛先アドレスを変更すること * インターネット ホストからプライベート ホストにトラフィックをリダイレクトするために使用される

NATにおけるアドレス変換には以下の種類がある。

  • 静的NAT … 1 つのプライベート IP アドレスをパブリック IP アドレスに変換する
  • ダイナミックNAT … プライベート IP アドレスはパブリック IP アドレスのプールにマッピングする
  • NPAT(PAT) … 1 つのパブリック IP アドレスがすべての内部デバイスに使用されますが、各プライベート IP アドレスには異なるポートが割り当てられる

ebtables

ebtablesはイーサネットフレームを検査するルールのテーブル (Linux カーネル内) を設定および維持するために使用されるプログラムのこと。 ebtablesでは、iptablesと同様に「テーブル」「チェイン」「ターゲット」を用いてルールを構築する。

ebtables -Ln # ルール セットを印刷するときに行番号をリスト
ebtables -Lc # 各ルールのパケットおよびバイトカウンターをリスト

またebtablesのテーブルには以下の3種類がある。

  • filter … Ethernetテーブルのフィルタリング
  • nat … MACアドレスの変更
  • broute … ブリッジ+ルータの機能を実行

Nftables

nftables(ntf)は iptables の代替ツール。 テーブルやチェインなどが予め用意されていたiptablesに対して、nftではユーザが自分で作成する。

ルール作成の手順は以下の通り

  1. テーブル作成 … nft add table
  2. チェインの作成 … nft add chain
  3. ルールの作成 … nft add rule

ルールセットの確認はnft list rulesetで可能。

9.4. VPN

9.4.1. OpenVPN

OpenVPNは安全なポイントツーポイント接続またはサイト間接続を作成する仮想プライベート ネットワーク (VPN) 技術を実装するOSSソフトウェア。

OpenVPN は、事前共有秘密キー、証明書、ユーザー名/パスワードなどのさまざまな方法を使用して、クライアントがサーバーに対して認証できるようにする。

なおデフォルトではOpenVPNは1194のUDPポートで動作する。

OpenVPNのインストール

ダウンロードする前にIP転送を有効にする必要がある。

sysctl -w net.ipv4.ip_forward=1

RedHat系では以下のようにインストールする。

dnf install epel-release -y
dnf install openvpn -y

Easy-RSAの構成

OpenVPNのインストール後、SSL証明書を追加して構築する必要がある。

cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 easy-rsa
cd /etc/openvpn/easy-rsa
vi vars

easy-rsaのvarsを作成したら以下ステップを実行する

  1. ./easyrsa init-pkiでpkiディレクトリの開始
  2. sudo ./easyrsa build-caでCA証明書の作成
  3. sudo ./easyrsa gen-req myov-server nopassでキーペアと証明書のリクエストを作成
  4. sudo ./easyrsa sign-req server myov-serverでサーバキーに署名する
  5. sudo ./easyrsa gen-dhでキー交換のためのDH鍵を作成する
  6. 上記で作成したファイルを/etc/openvpn/server/にコピーする(ca.crt,dh.pem, .key, .crt)
  7. sudo ./easyrsa gen-req client nopassでクライアント キーを取得する
  8. sudo ./easyrsa sign-req client clientで生成された CA 証明書を使用してクライアント キーに署名する
  9. 上記で生成したファイルを/etc/openvpn/client/にコピーする(ca.crt,client.crt,client.key)

OpenVPNサーバの構築

/etc/openvpn/server/server.confにEasy-RSAの構成で構成したファイルをもとに設定ファイルを以下のように記述する。

なお設定は0から作成する必要はなく、/usr/share/doc/openvpn-/sample/sample-config-files/server.confに設定ファイルの散歩ウルがあるためそれを利用すると良い。

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/myov-server.crt
key /etc/openvpn/server/myov-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
log-append /var/log/openvpn.log
verb 3

OpenVPNサービスの有効化

以下コマンドを使用してサーバーを起動し、有効にする。

systemctl start openvpn-server@server

なおこのコマンドにより、正常にVPNサーバが起動すると新しいネットワーク インターフェイスtun0が作成される。

クライアント構成ファイルの生成

OpenVPNクライアント構成ファイルを生成するには以下.ovpnファイルを作成することで可能。ファイル内容は以下のように記述する。

サンプルファイルは/usr/share/doc/openvpn-/sample/sample-config-files/client.confに存在するためこのファイルの改造で可能となる。

client
dev tun
proto udp
remote vpn-server-ip 1194
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

ルーティングの構成

以下コマンドでOpenVPNサービスの通信がファイヤーウォールを通過できるようにできる。

firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --add-masquerade
firewall-cmd --permanent --add-masquerade

VPN からの受信トラフィックをローカル ネットワークに転送するようにルーティングを設定するには以下の通り。

routecnf=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $routecnf -j MASQUERADE

変更の有効化/再読み込みはfirewall-cmd --reloadで可能。

クライアントマシンにOpenVPNをインストールする

インストールする

dnf install epel-release -y
dnf install openvpn -y

サーバからクライアント構成をコピー

sudo scp -r root@vpn-server-ip:/etc/openvpn/client .

OpenVPNサーバに接続する。

cd client/
openvpn --config client.ovpn

OpenVPNコマンド

openVPNを操作するユーティリティ

openvpn <オプション>

9.4.2. IPSecサーバとクライアント操作

IPsec

IPsecは保護されたネットワークと保護されていないネットワークの間に境界を作成する。境界を通過するトラフィックは、IPSec 構成を担当するユーザーまたは管理者によって指定されたアクセス制御の対象になる。

IKE: RFC 7296 で定義されている IKE は、2 つのシステムまたはデバイスが信頼されていないネットワーク上で安全な通信チャネルを確立できるようにするプロトコル。 このプロトコルは、一連のキー交換を使用して、クライアントとサーバーの間に暗号化されたトラフィックを送信できる安全なトンネルを作成する

IPsecのポリシー

IPSecりよるサービスは2つのデータベースによって定義される。 1つが**SPD(Security Policy Database)SAD(Security Association Database)**のこと。このポリシは送信元から宛先に送信される各 IP パケットに適用される。

セキュリティアソシエーション

セキュリティアソシエーションは両方のノードが認証および暗号化メカニズムに関する情報を交換するための概念で、送信者と受信者の間で伝送されるトラフィックにセキュリティ サービスを提供する。

IPsec

IPsecのアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。

  1. SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
  2. IP宛先アドレス、IPSecのエンドポイントアドレス
  3. セキュリティプロトコル識別子

SAD(Security Association Database)

SPD(Security Policy Database)

IPSecプロトコル

IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。

  • プロトコル認証ヘッダ (AH) * IP ヘッダーとデータ ペイロードがハッシュされるために使用 * ハッシュから新しい AH ヘッダーが構築され、パケットに追加される * 認証機能と未改竄の保証
  • セキュリティペイロードのカプセル化 (ESP) * データ パケットの暗号化と整合性を提供するセキュリティ プロトコル * 標準 IP ヘッダーの後に追加される * AHの機能+暗号化

IPSec暗号化の技術

IPSecのセキュリティアソシエーションではトンネルモードトランスポートモードの2つのモードの操作を設定できる。

  • トンネルモード * ペイロードとヘッダーの両方が暗号化される * ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的 * パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
  • トランスポートモード * 各パケットのデータ部分のみが暗号化される * エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる

IPsec画像

IPSecのトラフィック処理

Racoon

RacoonはIPsec IKE プロトコルのキー交換デーモンのこと。 設定ファイルは/etc/racoon/racoon.confとなる。

setkey

setkeyはIPsecにおける二つのデータベース(SAD、SPD)を操作するためのユーティリティ

ipsec-tools

ipsec-toolsはIPsec接続を確立するために必要なユーティリティ。 なお現在はRedHat系OSではIPsec-toolsは使用されておらず、LibreSwanといったツールでVPNが構成されている。

設定ファイルは/etc/ipsec-tools.confとなる。

9.4.3. StrongSwan

StrongSwan はIPsec ベースのOSSのVPN。 StrongSwan は元々 Linux 用に設計されたが、その後 Android、FreeBSD、Mac OS X、Windows およびその他のプラットフォームに移植された。特徴は以下の通り。

  1. 構成がシンプル
  2. 強力な暗号化と認証方法の提供
  3. 大規模で複雑なVPNネットワークをサポートする
  4. 拡張性に優れたモジュラー設計

StrongSwanのインストール

dnf install -y epel-release
dnf install -y strongswan.x86_64

strongsan.conf

strongswanの設定ファイル。

# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files

charon {
        load_modular = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
}

include strongswan.d/*.conf 

swanctl

swanctlはインターフェイス プラグインを介して StrongSwan IKE デーモン ( charon )を設定、制御、監視するためのコマンドライン。

swanctl <オプション>

swanctl.conf

9.4.4. WireGuard

WireGuardは非常にシンプルで高速な最新の VPN 。 OpenVPN よりも大幅にパフォーマンスが向上している。

Wireguardのインストール

sudo dnf install elrepo-release epel-release -y
sudo dnf install kmod-wireguard wireguard-tools -y

Wireguard サーバの構成

適切な権限を持つ Wireguard 設定用の空の構成ファイルをサーバー上に作成する。

mkdir /etc/wireguard

ディレクトリを作成した後、wgおよび``tee`コマンドライン ツールを使用して公開キーと秘密キーを作成する。

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

次に、VPN トラフィックをルーティングするためにトンネル デバイスを設定する必要があり、/etc/wireguard以下にwg0.conf等を作成する必要がある。

[Interface]

## IP Address of VPN server ##
Address = 192.168.108.101/24

## Save the configuration when a new client will add ##
SaveConfig = true

## port number of VPN server ##
ListenPort = 51820

## Private Key of VPN Server ##
PrivateKey = SERVER_PRIVATE_KEY

## Command to be executed before starting the interface ##
PostUp     = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade

## Command to be executed before turning off the interface ##
PostDown   = firewall-cmd --remove-port 51820/udp --zone=public && firewall-cmd --remove-masquerade --zone=public

インターフェイスはsudo wg-quick up wg0コマンドで起動する。 またsudo systemctl enable wg-quick@wg0で有効化できる。

wgコマンド

wgはWireGuard トンネル インターフェイスの構成を取得および設定するための構成ユーティリティ。 インターフェイス自体は を使用して追加および削除でき、その IP アドレスとルーティング テーブルはと をip-link(8)使用して設定できる。

wg <サブコマンド>
サブコマンド説明
show現在の構成とデバイス情報を表示する
showconf指定された WireGuard インターフェイスの現在の設定を表示する
set現在の構成の変更、ピアの追加、ピアの削除、またはピアの変更

IPv4転送の有効化

NATのIPv4転送の有効化には/etc/sysctl.d99-custom.confを作成する。

## for enabling IPv4 forwarding ##
net.ipv4.ip_forward = 1

## for enabling IPv6 forwarding ##
#net.ipv6.conf.all.forwarding = 1
sysctl -p /etc/sysctl.d/99-custom.conf

Wireguard クライアントの構成

手順はサーバの時と同じで、設定ファイルのみが少し異なる。

[Interface]
## Private Key of VPN Client ##
PrivateKey = qCi5ugILVhTOOmCzchqFzkNaHM3HP1qFUWgtYun2A3w=

## IP address of VPN Client ##
Address = 192.168.108.102/24

[Peer]
## Public Key of Rocky 8 VPN Server ##
PublicKey = m58H6KTuRt+4z6g+jMIeRCdAkQoikkiVvTd7pJvrPGE=

## set ACL ##
AllowedIPs = 0.0.0.0/0

## IP address and Port of CentOS 8 VPN Server ##
Endpoint = 192.168.108.101:51820

なお起動後に、WireGuardサーバにVPN クライアント マシンの IP アドレスと公開キーを登録する必要がある。

[Peer]
## Public Key of VPN Client ##
PublicKey = 73gw+v4V0TKsw2uGLHJ9EI26qfMEwvk+JZ+xED2ttAs=

## IP Address of VPN Client ##
AllowedIPs = 192.168.108.102/32

wg-quickコマンド

wg-quickはWireGuardインターフェイスを起動するコマンド。

wg-quick up wg0
最終更新 2025.01.19: Added ss command (683d062)