RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

iptables まとめ【Linux ファイアウォール】

はじめに

皆様こんにちは。
インフラ開発課でインフラエンジニアをしているsnnmrです。

ラクスで働きだしてかれこれ数年、その中でも比較的使用頻度の高いiptablesについて改めてまとめてみました。

Linuxの理解をより深めたい方へ以下関連おすすめブログ
ls コマンド 【使い方 まとめ】
find コマンド 【使い方 まとめ】
iptables まとめ【Linux ファイアウォール】
sed コマンド【使い方 まとめ】
vi コマンド【使い方まとめ】
Linuxのファイル操作でよく使うLinuxコマンド
初心者のためのawkコマンド
実務で使える!基本的なシェル(Linux)コマンドの話 ~forとsed~
【Linux】今振り返りたい、プロセスって何?

iptablesとは

まず、iptables - Wikipediaで確認してみます。

iptablesは、Linuxに実装されたパケットフィルタリングおよびネットワークアドレス変換 (NAT) 機能であるNetfilter(複数のNetfilterモジュールとして実装されている)の設定を操作するコマンドのこと。Netfilterは、いわゆるファイアウォールやルータとしての役割を果たす。IPv4 用の実装が iptables で、IPv6 用の実装が ip6tables である。 Linuxカーネル2.4以降では、Netfilterというパケット処理のためのフレームワークをもっており、これの設定を操作するツールがiptablesである。
 
                            引用元:https://ja.wikipedia.org/wiki/Iptables

iptablesは、netfilterを操作するためのものです。
フィルタリングやNATを行っているのはkernelモジュールのnetfilterとのことです。


Netfilterとは

Netfilterについても調べてみましょう。

The netfilter project enables packet filtering, network address [and port] translation (NA[P]T), packet logging, userspace packet queueing and other packet mangling.
The netfilter hooks are a framework inside the Linux kernel that allows kernel modules to register callback functions at different locations of the Linux network stack. The registered callback function is then called back for every packet that traverses the respective hook within the Linux network stack.  
                              引用元:https://netfilter.org/index.html

(Google翻訳)

netfilterプロジェクトは、パケットフィルタリング、ネットワークアドレス[およびポート]変換(NA [P] T)、パケットロギング、ユーザースペースパケットキューイング、およびその他のパケットマングリングを可能にします。 netfilterフックは、カーネルモジュールがLinuxネットワークスタックのさまざまな場所にコールバック関数を登録できるようにするLinuxカーネル内のフレームワークです。登録されたコールバック関数は、Linuxネットワークスタック内のそれぞれのフックを通過するすべてのパケットに対してコールバックされます。

netfilterを使用してパケットフィルタリング、NAT変換等の処理を行う。
更にコールバック関数を使用し、さまざまな場所に処理を組み込めるといったものでしょうか。

弊社のサービスの一部でLVSLinux Virtual Server)を使いL4負荷分散を導入しているんですが、これもNetfilterのコールバック関数を使っています。


iptables 書式

iptablesではパケットを4つのテーブルに分けて処理をします。
iptablesのよく使うテーブルとコマンドの例を紹介します。

よく使うオプションとチェイン

チェイン 内容
INPUT 入ってくるパケットに対して適用
OUTPUT 出ていくパケットに対して適用
FORWARD 転送パケットに対して適用
PREROUTING ルーティング前に適用
POSTROUTING ルーティング後に適用
オプション 内容
-s (--source) パケットの送信元を指定。特定のIPや範囲を指定
-d (--destination) パケットの宛先を指定。※指定方法は↑の「-s」と同じ
-p (--protocol) パケットのプロトコルtcpudp、icmp、all)
-i (--in-interface) パケットを受信するインターフェース名
-o (--out-interface) 送信先インターフェース名
-j (--jump) ターゲット(ACCEPT、DROPREJECT等)を指定(LOGでログをとることが可能)


filterテーブル

filterテーブルはパケットの出入りを制御することができるため、サーバのメンテナンスしたりするときにもよく使うやつですね。

filterテーブルでよく使うチェインは「INPUT(入ってくるパケットに対して適用)」とか「OUTPUT(出ていくパケットに対して適用)」です。

その他にも「FORWARD(転送パケットに対しての適用)」などがあります。

[root@localhost ~]# iptables -t filter -I INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 80 -j DROP

これは「-s」で指定した接続元IPアドレスで80番ポート宛のパケットをDROP(破棄)するといった設定になります。
「-t」でテーブルの指定をしない場合は、filterテーブルが指定されます。


natテーブル

NAT(Network Address Translation)テーブルは、パケットの中身を書き換えることが可能です。
natテーブルで使用できるチェインは

  • 「PREROUTING(ルーティング前に適用)」
  • 「OUTPUT(出ていくパケットに対して適用)」
  • 「POSTROUTING(ルーティング後に適用)」

があります。

[root@localhost ~]# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.10.10 -j MASQUERADE

上記は、IPマスカレードの設定例です。
eth1にプライベートネットワーク、eth0にIPマスカレードで使用するグローバルIPが設定されている環境(ルータなど)を想定しています。

[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.10.10 -p tcp --dport 25 -j REDIRECT

また、上記は「-d」で指定された宛先アドレスのtcpパケットを25番ポートへリダイレクトする設定です。
上述しましたが、弊社ではL4負荷分散を使用しているので、LBサーバ配下のサーバに上記設定を行い、L4で分散されたパケットをこれで処理させていたりします。

mangleテーブル

mangleテーブルはパケットのIPヘッダの中で定義されているTOS(Type Of Service)フィールドを書き換えることが可能です。

[root@localhost ~]# iptables -t mangle -A OUTPUT -p tcp --sport 443 -j DSCP --set-dscp 46

上記は、443ポートから出ていくパケットにDSCP値「46」を設定して優先度を上げる例です。
弊社では、一斉メール配信サービスを提供しているため、実際にDSCP値の設定をしており管理画面へのアクセス(tcp/443)のパケットの優先度を上げてたりします。

rawテーブル

rawテーブルはパケットに特定のマークを付け、追跡を除外したりするときに使用します。
書式としては以下のように書き、22番へのtcp通信をトラッキングしない場合の例です。

[root@localhost ~]# iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK

今まで全く使ったことが無いので実際にためしてみました。
rawテーブルに設定する前に、sshした時のトラッキングを確認してみます。
ssh接続元のIPアドレスは「172.20.100.120」です。

[root@localhost ~]# cat /proc/net/nf_conntrack | grep 172.20.100.120
ipv4     2 tcp      6 431996 ESTABLISHED src=172.20.100.120 dst=172.20.100.209 sport=17041 dport=22 src=172.20.100.209 dst=172.20.100.120 sport=22 dport=17041 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

「172.20.100.120」からの接続が、conntrackエントリにのってESTABLISHされているこがわかります(環境はCentOS8です)。

次にrawテーブルに設定を入れて確認してみます。

[root@localhost ~]# iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK
[root@localhost ~]# cat /proc/net/nf_conntrack | grep 172.20.100.120
ipv4     2 tcp      6 296 ESTABLISHED src=172.20.100.209 dst=172.20.100.120 sport=22 dport=17045 [UNREPLIED] src=172.20.100.120 dst=172.20.100.209 sport=17045 dport=22 mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

ESTABLISHEDですが、ステータスが「UNREPLIED」になっています。
conntrack-toolsで確認していても「UNREPLIED」でエントリされたものは数分後DESTROYされました。

特定の通信をファイアウォールで処理せず、他の機器で処理させるとき等に使うようです。


conntrackエントリについて

サーバを運用していると「通信できなくなった」とか「たまに通信できなくなる」といったことが発生することがまれに?あると思います。

そんな時、conntrackにエントリされた通信の状態を見ると調査が捗るかもしれません。(「-j」でログを出すのも有効です)
ちなみに、firewalldを起動していなくてもiptablesコマンドで設定をいれてやれば、モジュールは有効化されます。

[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@localhost ~]# lsmod | grep conntrack
xt_conntrack           16384  0
nf_conntrack_netlink    49152  0
nf_conntrack_ipv4      16384  2
nf_defrag_ipv4         16384  1 nf_conntrack_ipv4
nf_conntrack          155648  7 xt_conntrack,nf_conntrack_ipv4,nf_nat,ipt_MASQUERADE,nf_nat_ipv4,nf_conntrack_netlink,xt_CT
nfnetlink              16384  4 nft_compat,nf_conntrack_netlink,nf_tables
libcrc32c              16384  3 nf_conntrack,nf_nat,xfs

CentOS8のconntrackエントリの見方については、procの「/proc/net/nf_conntrack」でも確認できますが、onntrack-toolsをインストールすればリアルタイムでも確認できるので便利です。

以前、tcpの最初のSYNパケットがNEWとして判定されず、INVALIDとして判定される事象が発生しました。
その時もconntrackのエントリを確認して調査することで、比較的早く原因が判明しました。
普段あまりみない部分かとおもいますが、見方を知っておくと良いかもしれません。
※ちなみにその時は送信元IPとポート、送信先IPとポートが同じである過去のセッションが残っていたためINVALIDになっていました。


iptables まとめ

iptablesをがっつりファイアウォールとして使っているというケースは少ないと思いますが、メンテナンス時に一時的に使用したりするなど使用頻度はそこそこ高いのではないでしょうか。
インフラエンジニアをやっていると「通信できない」みたいな場面に遭遇することはよくあると思います。

基本的にtcpdump等を使って低レイヤから調査すると思いますが、パケットはきてるっぽいけどなんか通信できない、みたいな場面でiptablesやconntrackエントリ周りのことを頭に入れておくと多少幸せになれるかもしれませんので何かの役に立てば幸いです。

最後までお読みいただき有難うございました。


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.