• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:IPTABLESの理解をしたいです。)

IPTABLESの使い方を調べる

このQ&Aのポイント
  • IPTABLESの使い方を理解できません。PCルーターを作成して、最低限の機能に絞って試してみました。
  • 質問1: ルーター機能としてIPTABLESを使用するには、/etc/sysctl.confにnet.ipv4.ip_forward = 1を設定すればよいですか?
  • 質問2: TTLが切れるのはなぜですか?PcCでPING 192.168.101.1 -i 250と入力しても期限切れと表示されます。ルーターが1つしかないのにTTLが切れることがありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • EF_510
  • ベストアンサー率50% (306/604)
回答No.4

できればもう少し簡素にお願いします… >PPPインターフェスも、ルーターとして起動していると自ホスト扱いに >なると思います。 この設定だとグローバルアドレスからルーターで >起動しているサービスにすべてacceptされないでしょうか? ルーターとして起動しているか(この場合はIPマスカレード)どうかにかかわらず、何も操作しなければパケットは到達します。その後の処理はアプリケーション側の問題です。 sshdはバインドアドレスを指定しなければ自ホストのすべてのアドレスに対して応答しますのでacceptになると思います。

nekonimatatabi
質問者

お礼

EF_510さん レスありがとうございました。 http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/ipttut_all.html ここのIPTABLES HOW TOを一通り流し読みしてみました。 Linux(iptables)をルーターとして使用する場合の考え方を知りたかったのですが、 ネット上の情報をかじる程度で読んだので逆に混乱しました。 HOW TOを一通り読み、PCにUbuntuを入れて自宅でルーターテストを行ってみました。 pptpで遠隔地から入るテストや、ブルートフォースアタックのテストなども行ってみました。 ttp://www2s.biglobe.ne.jp/~nuts/labo/inti/ipt_recent.html portscanも遠隔から行ってみて、1723.greしか開いていないことを確認できました。 少しだけわかってきたように感じます。 ありがとうございました。

その他の回答 (3)

  • EF_510
  • ベストアンサー率50% (306/604)
回答No.3

まず修正します。 FORWARDのルールは「自ホスト宛」じゃないパケットに適用され、それはOUTPUTを「通りません」 が、 1.192.168.100.50から192.168.100.101.1あてのsshd接続要求。(経路は正常に指定できていることが前提) 2.192.168.100.179のlocalrouterのeth0でパケット受信 3.eth0で受信したパケットは、あて先が192.168.100.179宛ではないのでFORWARD処理に入る。 ここが違います。宛先が自ホストとは100.179も101.1も該当します。 なのでINPUTに回ってしまいます。 参考にされたサイトの2ページ目、最初の処理がそうです。 NATの処理が入ると話がまたややこしくなるのですがそういう場合はsshdのバインドアドレスを調整するなどの工夫が必要だと思います。

nekonimatatabi
質問者

補足

返信ありがとうございます。 >>ここが違います。宛先が自ホストとは100.179も101.1も該当します。 >>なのでINPUTに回ってしまいます。 目から鱗が落ちました。 そうだったのですか。 実際に理解するためにテストしました。 1.eth1のinput/outputを無効にして、192.168.101.1に対して接続要求を通すとつながる。 ポリシーはすべてDROPです。 -A INPUT -i lo -j ACCEPT -A INPUT -i eth0 -j ACCEPT -A FORWARD -i eth0 -j ACCEPT -A FORWARD -i eth1 -j ACCEPT -A FORWARD -o eth0 -j ACCEPT -A FORWARD -o eth1 -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -o eth0 -j ACCEPT ETH1は、192.168.101.1なのでETH1のINPUT/OUTPUTを無効にしても 自ホストなので通信できることをSSHで確認しました。 2.ETH0のOUTPUTをDROPにして、ETH192.168.101.1のINPUTをDROP 通信できないのを確認しました。 iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A INPUT -i eth0 -j ACCEPT #iptables -t filter -A INPUT -i eth1 -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT #iptables -t filter -A OUTPUT -o eth0 -j ACCEPT iptables -t filter -A OUTPUT -o eth1 -j ACCEPT iptables -t filter -A FORWARD -i eth0 -j ACCEPT iptables -t filter -A FORWARD -i eth1 -j ACCEPT iptables -t filter -A FORWARD -o eth0 -j ACCEPT iptables -t filter -A FORWARD -o eth1 -j ACCEPT ETH0 192.168.100.179のINPUTが有効でも、EHT0のOUTPUTが無効の ため通信できませんでした。 EHT1のOUTPUTを有効にしていますが、自ホストの場合はFORWARDされないので 通信できないのが当然の結果と認識しました。 3.eth0のinput/outputをDROP 192.168.100.0からアクセスできず。 192.168.101.2からは192.168.101.1と192.168.100.179にアクセスできました。 iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -t filter -A INPUT -i lo -j ACCEPT #iptables -t filter -A INPUT -i eth0 -j ACCEPT iptables -t filter -A INPUT -i eth1 -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT #iptables -t filter -A OUTPUT -o eth0 -j ACCEPT iptables -t filter -A OUTPUT -o eth1 -j ACCEPT iptables -t filter -A FORWARD -i eth0 -j ACCEPT iptables -t filter -A FORWARD -i eth1 -j ACCEPT iptables -t filter -A FORWARD -o eth0 -j ACCEPT iptables -t filter -A FORWARD -o eth1 -j ACCEPT 4. sshdの設定(/etc/ssh/sshd_conf)で、192.168.101.1にアドレスを設定。 iptablesの設定は、すべて通す設定。 192.168.100.179宛の接続は、接続されず。(拒否される) 192.168.101.1には接続可能。 アプリケーションレベルでの拒否設定可能なことを確認しました。 5.eth0/eth1/loのinput/outputをDROPに設定。 192.168.101.2の別pcからインターネットや192.168.100.250のファイル共有にアクセスできることを確認できました。。 192.168.100.170からは192.168.101.2のファイル共有を見ることができました。 iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP #iptables -t filter -A INPUT -i lo -j ACCEPT #iptables -t filter -A INPUT -i eth0 -j ACCEPT #iptables -t filter -A INPUT -i eth1 -j ACCEPT #iptables -t filter -A OUTPUT -o lo -j ACCEPT #iptables -t filter -A OUTPUT -o eth0 -j ACCEPT #iptables -t filter -A OUTPUT -o eth1 -j ACCEPT iptables -t filter -A FORWARD -i eth0 -j ACCEPT iptables -t filter -A FORWARD -i eth1 -j ACCEPT iptables -t filter -A FORWARD -o eth0 -j ACCEPT iptables -t filter -A FORWARD -o eth1 -j ACCEPT なんとなくわかってきたように思います。 ディストリビューションごとのfirewallの設定の違いも iptables-saveで、コマンド一覧を取得できることがわかりました。 iptables -vLでインターフェースの一覧がでることがわかりました。 試しに、下記コンテンツを理解しようとしているのですが・・・ tp://www.teradas.net/hiromo/linux/poptop/6.ht echo 1 > /proc/sys/net/ipv4/ip_forward  ルーター機能ON iptables -t filter -F FORWARD iptables -t filter -F INPUT  組み込みチェインの初期化 iptables -t filter -P FORWARD DROP  FORWARDポリシーをDROP iptables -t filter -A FORWARD -i eth1 -j ACCEPT  ローカルからの通信をすべて転送許可 iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT  接続要求以外の通信を許可 iptables -t filter -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT  インターネット側からのPPTPで使用する1723を許可(ルーターマシンで起動しているpptpへ) iptables -t filter -A INPUT -i eth0 -p 47 -j ACCEPT  インターネット側からのPPTPで使用する47(gre)を許可(ルーターマシンで起動しているpptpへ) iptables -t filter -A INPUT -i ppp+ -j ACCEPT iptables -t filter -A FORWARD -i ppp+ -j ACCEPT  pppインターフェスからINPUT/FORWARDを許可 ・中から外へはIPMASQUARADEで接続する。 ・インターネット側からPPTPに接続して内部に接続する。 下記コマンドを追加(更新) iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P INPUT DROP iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE PPPインターフェスも、ルーターとして起動していると自ホスト扱いに なると思います。 この設定だとグローバルアドレスからルーターで 起動しているサービスにすべてacceptされないでしょうか? たびたびすみません。 よろしくお願いいたします。

  • EF_510
  • ベストアンサー率50% (306/604)
回答No.2

>よくよくやってみると昨日も色々試したのですが、eth1にlanケーブルを接続しなかったときになります。 > >再現性があります、eth1に192.168.101.1に必ずケーブルがささっていないとだめなんですね。ipを振っているので問題ないと勘違いしていました。 > >tracert 192.168.101.1と行うと、192.168.100.1<->192.168.100.179を延々と繰り返しました。 ケーブルを抜いた場合、何もしなければeth1は機能していないと認識されますのでeth0でループしてしまうと思います。 IPアドレスを振っただけでは機能しません。 (ケーブルを挿した状態のアダプタをダウンさせることはできるのですが、挿してないのを起動できたかな…?) >試しにeth0のinputとoutputをdropにしました。 >そうすると、192.168.100.50等のpcから192.168.101.1のsshdに接続できなくなりました。 > >転送後のパケットはeth1に届けば,eth1から帰りのforwardでそのままeth0から帰っていかないのでしょうか? >それとも転送の場合も、outputする際にはそのインターフェースを使用するのでしょうか。 その前にinputをdropしていますのでsshdにパケットが到達しません。故に帰りのパケットは生成されません。rejectなら生成されます。 パケットが転送されたものでもそうでなくても出て行く際にはoutputルールを参照します。 input/forward/outputはそれぞれ独立しています、該当するルールの中で一つでも拒否があれば通信できません。 iptables -L INPUT -v でパケット数を見るとどうなったかがすぐに判ると思います。(増えた、とかで) iptables --zero でカウンターだけをリセットできます。

nekonimatatabi
質問者

補足

レスありがとうございます。 >>パケットが転送されたものでもそうでなくても出て行く際にはoutputルールを参照します。 ネット上のIPTABLESのパケットの流れを見るとそのように書いているように考えにくいのですが、一部絵が省かれているのでしょうか?(自分の理解力のなさが嫌になってきました。) 転送処理でもOUTPUTを通るとのことなので、間違っていることは理解しています。 今間違った理解での流れです。 eth0は、192.168.100.179 eth1は、192.168.101.1 ssh機能は、eth0でもeth1でも動作しています。 ett0のinputおよびoutputをdropにした場合・・・ 以下のように考えています。 http://www.atmarkit.co.jp/flinux/rensai/security05/security05a.html の図1のパケットフィルタリングの流れを見ると・・・ たとえば、192.168.100.50のpcから192.168.100.179および192.168.101.1のsshdサーバーにアクセスするとします。 sshdサーバーはルーター機能としても動作しています。 この場合、eth0のinput/outputどちらか片方でもdropした段階で通信できなくなるのは理解できます。 しかし、forwardをこのローカルルーター上で動作している場合。 1.192.168.100.50から192.168.100.101.1あてのsshd接続要求。(経路は正常に指定できていることが前提) 2.192.168.100.179のlocalrouterのeth0でパケット受信 3.eth0で受信したパケットは、あて先が192.168.100.179宛ではないのでFORWARD処理に入る。 4.FORWARD処理では、lo,eth0,eth1のinput,outputのインターフェスを許可(ポリシーでACCEPT)に設定しているのと同じことのため、パケット送信処理に入る。 5.192.168.101.1のeht1のインターフェスはinput,outputを制限していないので、eth1からhubに一度パケットが飛ぶ。 6.hub上でパケットの宛先が、192.168.101.1のため、eht1へパケットが送信される。 7.eth1上で宛先が自ホストのパケットなので、ルーティング処理に入るが、必要ないのでそのままINPUTチェインに入る。 8.ETH1のINPUTチェインは、すべて許可されているので,ETH1からルーター上で動作しているSSHDサーバーにパケットが渡される。 9.SSHDサーバーが接続要求を許可して、ETH1から入力されたOUTPUTチェインから192.168.101.1のアドレス元としてパケットが送出される。 10.192.168.100.0宛のパケットが192.168.101.1から遅れないので、宛先が不明なのでルーティング処理に入る。 11.宛先が192.168.100.50宛なので、FORWARD処理される。 12.FORWARDされた後は、EHT0から送出される。(このときはローカル処理ではないパケットなのでETH0がINPUT,OUTPUTともにDROPだが関係なくそのままHUBに送出される。 13.HUB上で192.168.100.50のPCにパケットを転送する。 でもつながりません。 なにか根本的に勘違いしてるようなのですが、どこに考え間違いがあるでしょうか? よろしくお願いします。

  • EF_510
  • ベストアンサー率50% (306/604)
回答No.1

質問1 そうです 質問2 各システムのルートテーブルを確認してください。 linuxであればnetstat -rn Windowsであればroute printです。 RT57iはshow ip routeだと思います。 ttlが無くなると言うことであればどこかでループしています。tracerouteコマンドを使うとどこの区間でループしているか確認できます。 質問3 RT57iが192.168.101.0/24を認識していないからだと思われます。 ダイナミックルーティングの仕組みで認識させるか手動でルートテーブルを追加する必要があります。 iptablesはルーターなどを作らないで単体で試した方が理解が早いと思います。 今の状態ではiptablesが悪いのかルート構成が不適切なのかを先に切り分ける必要があります。

nekonimatatabi
質問者

補足

EF_510さん レスありがとうございます。 質問1 そうです=>ありがとうございます。 192.168.101.2のpcから、ネットサーフィンを行うことができました。 質問2 各システムのルートテーブルを確認してください。 ttlが無くなると言うことであればどこかでループしています。tracerouteコマンドを使うとどこの区間でループしているか確認できます。 すみませんでした。 よくよくやってみると昨日も色々試したのですが、eth1にlanケーブルを接続しなかったときになります。 再現性があります、eth1に192.168.101.1に必ずケーブルがささっていないとだめなんですね。ipを振っているので問題ないと勘違いしていました。 tracert 192.168.101.1と行うと、192.168.100.1<->192.168.100.179を延々と繰り返しました。 質問3 RT57iが192.168.101.0/24を認識していないからだと思われます。 ダイナミックルーティングの仕組みで認識させるか手動でルートテーブルを追加する必要があります。 ip route 192.168.101.0/24 gateway 192.168.100.179 でインターネット側にも通信ができるようになりました。 間違えるとだめなので、ファイルに内容を纏めて実行しています。 initialize.sh iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT test.sh iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -j LOG --log-prefix "IPTABLES_INPUT_LOG : " --log-level=info iptables -A OUTPUT -j LOG --log-prefix "IPTABLES_OUTPUT_LOG : " --log-level=info iptables -A FORWARD -j LOG --log-prefix "IPTABLES_FORWARD_LOG : " --log-level=info iptables -t filter -A INPUT -i lo -j ACCEPT #iptables -t filter -A INPUT -i eth0 -j ACCEPT iptables -t filter -A INPUT -i eth1 -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT #iptables -t filter -A OUTPUT -o eth0 -j ACCEPT iptables -t filter -A OUTPUT -o eth1 -j ACCEPT iptables -t filter -A FORWARD -i eth0 -j ACCEPT iptables -t filter -A FORWARD -i eth1 -j ACCEPT iptables -t filter -A FORWARD -o eth0 -j ACCEPT iptables -t filter -A FORWARD -o eth1 -j ACCEPT initialize.shは、filter設定で問題があったときに一回実行しています。 test.shで試しにポリシーを全て、DROPにしたあとに lo,eth0,eth1ともにインターフェスを指定して全てACCEPTにして通信を行いました。 その場合は、ポリシー全て許可と同じように問題なくアクセスできます。 http://www37.atwiki.jp/brain_walks2/pages/20.html のパケットの流れを確認しました。 ルーターはローカルルーターとして現在使用しています。 試しにeth0のinputとoutputをdropにしました。 そうすると、192.168.100.50等のpcから192.168.101.1のsshdに接続できなくなりました。 転送後のパケットはeth1に届けば,eth1から帰りのforwardでそのままeth0から帰っていかないのでしょうか? それとも転送の場合も、outputする際にはそのインターフェースを使用するのでしょうか。 よろしくお願いします。

関連するQ&A