web-dev-qa-db-ja.com

iptables FORWARDおよびINPUT

Linux pcのホームネットワークがあり、すべてiptablesが実行されていました。 LANをLinuxゲートウェイ/ファイアウォールの背後に置く方が簡単だと思うので、ルーターとLANの間にpc(Fedoraを搭載、GUIなし)を配置し、iptablesを構成しました。ここでは問題ありません、INPUTはDNS(および一部のローカルのもの)のみを許可し、転送は正常に動作します:LANはインターネットに接続します。

しかし、私の質問は:FORWARDは外部からのすべてを許可するのか、それともINPUTで構成したポートのみを許可するのか? FORWARDとINPUTは一緒に機能しますか、それとも別々ですか?

これは私のiptablesです:

*nat
:PREROUTING ACCEPT [16:1336]
:INPUT ACCEPT [14:840]
:OUTPUT ACCEPT [30:2116]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o p1p1 -j MASQUERADE
COMMIT
# Completed on Tue Oct 16 09:55:31 2012
# Generated by iptables-save v1.4.14 on Tue Oct 16 09:55:31 2012
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [91:9888]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p UDP --dport 53 -j ACCEPT
-A INPUT -p TCP --dport 53 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i p1p1 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i p1p1 -p tcp -m multiport --dports 20,21,443 -j DROP
-A INPUT -i p1p1 -p tcp --dport 5000:5100 -j DROP
-A INPUT -i p1p1 -p icmp -m icmp --icmp-type 8 -j DROP
-A FORWARD -s 192.168.2.0/24 -j ACCEPT
-A FORWARD -d 192.168.2.0/24 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A OUTPUT -j LOG --log-prefix "denied out: "

COMMIT

p1p1(.1.x)は外部nic、p3p1(.2.x)は内部nicです。

29
user1754764

RedHatにはiptablesに関する素晴らしいドキュメント(少し長い)がありますが、カバーする主題は複雑であり、私はそれを避ける方法がわからない多くの異なるユースケース。

iptables kernel routing

ここにFORWARD and NAT Rulesに関する章があります。

たとえば、着信HTTP要求を専用のApache HTTPサーバー172.31.0.23、rootユーザーとして次のコマンドを使用します。

~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80

ここで何が起こるかです:

  • linuxゲートウェイがルーターからパケットを受信します。パケットヘッダーには次のものがあります。
    • ソース:x.x.x.x:y(インターネットからの送信者IPおよびパケット送信に使用される送信元ポート)
    • 宛先:192.168.1.1:80(LinuxゲートウェイIPが外部NICであると仮定します。つまり、p1p1
  • linuxゲートウェイは[〜#〜] prerouting [〜#〜]チェーンを適用して一致を見つけます。上記の内容を入力したと仮定すると、パケットはruleに一致し、次に呼び出します(ジャンプ_-j)toDNAT functionDestination Network Address Translation)whichパケットヘッダーの宛先を変更します。最初の192.168.1.1:80から172.31.0.23:80
  • 次に、パケットはRouting Decisionに到着します。パケットの宛先は172.31.0.23:80
    • あなたのLinuxゲートウェイは自分自身に尋ねます:それは私のためですか(192.168.1.1:80)?いいえ、私は送信しません[〜#〜] input [〜#〜]チェーン。
    • =>[〜#〜] forward [〜#〜]チェーンに送信します。
  • すべてのローカルネットワークでルールをFORWARDに設定しているため(テーブルfilter chain FORWARD)、パケット(たとえば)ローカルのApache HTTPサーバーに正しく転送する必要があります。

内部ルーティングがiptablesでどのように機能するかをもう少し理解するのに役立つことを願っています。

80
Samuel Phan

INPUT、FORWARD、およびOUTPUTは別々です。パケットは、3つのチェーンのうちの1つだけにヒットします。

宛先がtoこのサーバーの場合、INPUTチェーンにヒットします。ソースがfromこのサーバーの場合、OUTPUTにヒットします。送信元と宛先が両方とも他のマシンである場合(ルーティングされている場合)throughサーバー)、FORWARDチェーンにヒットします。

66
John Kugelman