はじめに
皆様こんにちは。
インフラ開発課でインフラエンジニアをしている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変換等の処理を行う。
更にコールバック関数を使用し、さまざまな場所に処理を組み込めるといったものでしょうか。
弊社のサービスの一部でLVS(Linux Virtual Server)を使いL4負荷分散を導入しているんですが、これもNetfilterのコールバック関数を使っています。
iptables 書式
iptablesではパケットを4つのテーブルに分けて処理をします。
iptablesのよく使うテーブルとコマンドの例を紹介します。
よく使うオプションとチェイン
チェイン | 内容 |
---|---|
INPUT | 入ってくるパケットに対して適用 |
OUTPUT | 出ていくパケットに対して適用 |
FORWARD | 転送パケットに対して適用 |
PREROUTING | ルーティング前に適用 |
POSTROUTING | ルーティング後に適用 |
オプション | 内容 |
---|---|
-s (--source) | パケットの送信元を指定。特定のIPや範囲を指定 |
-d (--destination) | パケットの宛先を指定。※指定方法は↑の「-s」と同じ |
-p (--protocol) | パケットのプロトコル(tcp、udp、icmp、all) |
-i (--in-interface) | パケットを受信するインターフェース名 |
-o (--out-interface) | 送信先インターフェース名 |
-j (--jump) | ターゲット(ACCEPT、DROP、REJECT等)を指定(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エントリ周りのことを頭に入れておくと多少幸せになれるかもしれませんので何かの役に立てば幸いです。
最後までお読みいただき有難うございました。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com