質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

8729閲覧

iptablesの見方がわかりません

mint.cherry

総合スコア284

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

2クリップ

投稿2015/11/12 03:21

編集2015/11/13 04:34

最初に、IPアドレスのホスト部ネットワーク部やrouting経路や学習に関しては理解していますm(__)m

dockerのネットワークIPマスカレードがきになるので、ホストのiptableを見ました。iptablesの実行は最後に記述しましたm(__)m
ipマスカレード:複数のIPアドレスを1つのIPに変換 と解釈しています。

iptablesに関して初めてで見方がわからなかったので、ある程度は自分で調べましたm(__)m
ここ参照しました。
addrtypeに関して記述がなかったので詳細にここを調べました。

調べてたら以下のことが書いてありました。
addrtype:パケットのアドレスタイプに基づいたマッチを行う。このアドレスタイプを基準にしてカーネルがパケットの分類を行う。
local:我々の今操作しているホスト自体のローカルなアドレス.127.0.0.1。
...イマイチわかりません。127.0.0.1は自分自身なのは知っています。
そのまま英語を訳すと「マッチ宛先タイプローカル」。。。?
他にも、iptablesの実行にもある[!127.0.0.1]の「!」ってなんですか?destination(宛先)に127.0.0.1(自身)ということに混乱します。dockerのコンテナ(172.17.0.0/16)が自身にあるということを示しているのでしょうか?
最後のChain Dockerとは、何でしょうか?

よろしくお願いしますm(__)m

iptablesコマンド実行


iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 anywhere

Chain DOCKER (2 references)
target prot opt source destination

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

順不同になりますが、簡単に説明します。
iptables 自体や、TCP/IP、IPマスカレードなどについては説明しませんので、ご了承ください。

大きく分けて、2つの目的があります。

###Dockerコンテナ → 外部

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 anywhere

Dockerコンテナ → (Dockerネットワーク以外の)外部への通信について、IPマスカレードします。

"Dockerネットワーク以外の" については iptables -t nat -nvL と v オプションを付けるとルールの詳細が見えて、out インターフェースが !docker0 (! は、それ以外を示す)となっていることがわかります。
つまり、Dockerコンテナ間の通信や、Dockerコンテナ→172.17.42.1 (Dockerホスト)には IPマスカレードはかかりません。

###外部 → Dockerコンテナ

Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL

外部 → Dockerホストへの(受信)パケットを DOCKERチェインに転送します。

"dst-type LOCAL" は 127.0.0.1 だけでなく、Dockerホストが持っている(eth0 などの)IPアドレスすべてになります。

Chain DOCKER (2 references)
target prot opt source destination

ここでは、DOCKERチェインにルールがありませんが、
docker run のオプションで "-p 10080:80" などとポート転送すると、以下のようなルールが追加されます。

Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10080 to:172.17.0.1:80

(外部から)Dockerホスト宛の TCP 10080番ポートへのパケットを 172.17.0.1(Dockerコンテナ)の TCP 80番ポートへ転送します。

###おまけ?

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Dockerホスト自身 → Dockerホストへの(受信)パケットを DOCKERチェインに転送します。

これは、Dockerコンテナへのポート転送について、外部からだけでなく、Dockerホストからもポート転送するためのものです。なぜか 127.0.0.1 宛は除外されています。

※このルールがなくても、Dockerホストから TCP 10080番ポートで待ち受けている docker-proxy プロセスにアクセスできるので、通信はできると思います。

投稿2015/11/12 16:23

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mint.cherry

2015/11/13 04:36 編集

回答ありがとうございます。 「!」はそれ以外なんですね。 >dst-type LOCAL" は 127.0.0.1 だけでなく、Dockerホストが持っている(eth0 などの)IPアドレスすべてになります。 私もそうとは思っていました。もしかして、 「ADDRTYPE match dst-type LOCAL」はdestination(宛先?)の項目の一部なのでしょうか? target DOCKER って言うのは、chain docker のルールを参照するという認識でいいでしょうか? 今までdocker run でport指定(-p)していませんでしたので、試しにやってみました。 (見にくくてすいません(汗)teratail横スクロールや見やすくする仕方がやり方がわかりません。) --- docker run --name porttest -h porttest -p 10080:80 -i -t porttest:porttest /bin/bash iptables -t nat -nvL hain POSTROUTING (policy ACCEPT 844 packets, 77720 bytes) pkts bytes target prot opt in out source destination 5 292 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:80 Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 3 152 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10080 to:172.17.0.2:80 --- このあとporttestコンテナを起動しました。 hostIP:192.168.1.1 porttest:172.17.0.2 確認しようとして、違うPC(windowsコマンドプロンプト)で「ping 192.168.1.1 10080」と入力。エラー:パラメータが無効です。 ダメ元で172.17.0.2の80番にこれでpingいくのかなーっと... ping172.17.0.2と記述すればきちんと送れますが、これだと-pで設定した意味がなくなってしまいます><
TaichiYanagiya

2015/11/13 09:39

> もしかして、 「ADDRTYPE match dst-type LOCAL」はdestination(宛先?)の項目の一部なのでしょうか? "-d|--destination" とは別ですが、同じような機能です。 "-d 127.0.0.1", "-d 192.168.1.1", ... と Dockerホストが持っているIPアドレスすべてについてルールを設定する替わりに、ADDRTYPE を利用して 1つのルールで設定しているのだと思います。 > 「ping 192.168.1.1 10080」 ping コマンドでは TCP の接続を確認することはできません。 telnet (http://itpro.nikkeibp.co.jp/article/COLUMN/20060425/236322/)などが利用できると思います。
mint.cherry

2015/11/16 04:16

返信ありがとうございます。遅くなってすいませんm(__)m 「iptables -I FORWARD -p tcp --dport 10080 -j ACCEPT」といれて、telnet確かめて見ました。 windowsコマンドプロンプト「telnet 192.168.1.1 10080」 ホストへ接続できませんでした。とエラーが。。。
TaichiYanagiya

2015/11/16 04:29

コンテナで、TCP 80番で待ち受けるプロセス(httpd など)が無いのではないでしょうか。
mint.cherry

2015/11/18 06:10

確かに80番はhttpのですね。 アパッチを入れないとダメってことですか?
TaichiYanagiya

2015/11/18 08:25

"-p" オプションの確認をしたいのであれば、実際に TCP で待ち受けるポート番号にあわせればいいのではないでしょうか。 例えば、コンテナで postfix を起動するのであれば、"-p 10025:25" など。
mint.cherry

2015/11/18 10:10

返信ありがとう御座いますm(__)m postfixが構築してある既存のコンテナがあるんですけど、docker start で-p は使えませんでした。。。 やっぱり-p のポートの指定はdocker runコマンドだけですよね。コンテナ作りなおすしか。。。 startで使えれば嬉しかったです(笑) 既存のものをimageとしてそのまま保存してdocker runで試してみますm(__)m
mint.cherry

2015/11/19 09:23

実際に確かめて見ました。 docker run --name mail -h mail -p 10002:587 -it ubuntu:mailstart /bin/bash windowsのコマンドプロンプトでtelnet 192.168.1.3 10002でしっかり出来ました。 指導ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問