iptables
背景:私は何年も何もしていません...私はVMWareの仮想マシンでFedora 16を実行し、ファイアウォール(TomatoUSB)ポートを仮想マシンに転送しています。
仮想マシンがあります192.168.1.155
。パケットが仮想マシンに送信されていることがわかっています。
に基づいてこの絵パケットがどのように送信されるべきかを確認するために、カーネルが他の理由でパケットを破棄しない限り、パケットは入って来る必要がありnat-PREROUTING
ますmangle-INPUT
。mangle-FORWARD
だからいくつかのロギングを有効にしました。
iptables -t mangle -v -A PREROUTING -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-PREROUTING '
iptables -t nat -v -A PREROUTING -j LOG -p tcp --destination-port 80 --log-prefix 'nat-PREROUTING '
iptables -t filter -v -I INPUT 1 -j LOG -p tcp --destination-port 80 --log-prefix 'filter-INPUT '
iptables -t filter -v -I FORWARD 1 -j LOG -p tcp --destination-port 80 --log-prefix 'filter-FORWARD '
iptables -t mangle -v -I INPUT 1 -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-INPUT '
iptables -t mangle -v -I FORWARD 1 -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-FORWARD '
それから私は外部テストサービスパケットはチェーンを通過しますPREROUTING
が無視されることがわかります。
Apr 23 19:11:52 webmail64 kernel: [ 351.116042] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20466 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:11:52 webmail64 kernel: [ 351.121701] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20466 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:11:55 webmail64 kernel: [ 354.113372] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20467 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:11:55 webmail64 kernel: [ 354.114834] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20467 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:12:01 webmail64 kernel: [ 360.109534] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20468 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:12:01 webmail64 kernel: [ 360.111023] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20468 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
TTL
これが良いと見ることができます。 VMのIPが192.168.1.155
このため、次にINPUT
進む必要がありますが、成功しません。パケットが私のネットワーク内から来る場合、期待どおりに動作します。
Apr 23 19:20:03 webmail64 kernel: [ 841.725402] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.729647] mangle-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.731056] filter-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.732784] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.734257] mangle-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.735676] filter-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0
私は何を試みたか。
- SELinuxをオフにする
- 完全閉鎖
iptables
- 基本ポリシーが次のようになっていることを確認してください。
ACCEPT
- パケット数
ACCEPT
増加の確認
- パケット数
/proc/sys/net/ipv4/ip_forward
準備ができたらIP転送()を有効にしてください。
私の設定:* kernel
= Linux webmail64 3.3.2-1.fc16.x86_64 #1 SMP Sat Apr 14 00:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
*iptables v1.4.12
iptables
すべての重要な情報は次のとおりです。
[root@webmail64 ~]# iptables-save
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*nat
:PREROUTING ACCEPT [916:127527]
:INPUT ACCEPT [1:60]
:OUTPUT ACCEPT [87:7857]
:POSTROUTING ACCEPT [87:7857]
-A PREROUTING -p tcp -m tcp --dport 80 -j LOG --log-prefix "nat-PREROUTING "
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*mangle
:PREROUTING ACCEPT [1402:193108]
:INPUT ACCEPT [1343:189856]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [303:67789]
:POSTROUTING ACCEPT [303:67789]
-A PREROUTING -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-PREROUTING "
-A INPUT -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-INPUT "
-A FORWARD -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-FORWARD "
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1075:220262]
-A INPUT -p tcp -m tcp --dport 80 -j LOG --log-prefix "filter-INPUT "
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -p tcp -m tcp --dport 80 -j LOG --log-prefix "filter-FORWARD "
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
次はどこで見ることができますか?
修正する
実行するように要求されましたが、パケットをtcpdump
送信していないようですか?ACK
:
tcpdump -i eth1 -An -vvv \(net 50 or net 173\)
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
19:31:26.305048 IP (tos 0x20, ttl 53, id 26094, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xca12 (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152517194 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D..J........
19:31:26.521815 IP (tos 0x20, ttl 53, id 61033, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x82b4 (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152517216 ecr 0,nop,wscale 7], length 0
E .<[email protected].. ...................
D..`........
19:31:29.300994 IP (tos 0x20, ttl 53, id 26095, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xc8e6 (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152517494 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D..v........
19:31:29.521214 IP (tos 0x20, ttl 53, id 61034, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x8188 (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152517516 ecr 0,nop,wscale 7], length 0
E .<[email protected].. ...................
D...........
19:31:35.302578 IP (tos 0x20, ttl 53, id 26096, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xc68e (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152518094 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D...........
19:31:35.532347 IP (tos 0x20, ttl 53, id 61035, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x7f2f (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152518117 ecr 0,nop,wscale 7], length 0
E .<[email protected].. ........./.........
D...........
答え1
少し遅れていることがわかりますが…知るどのIPを担当しますか?これは私が作成したルールファイルの一番上に置いたスキーマです。同様のフローチャートを他の場所でも見つけることができますが、端末で非常に便利なASCII形式(アートと呼びたくありません)です。
ほとんどの場合、私はこれを頭の中で知っていますが、忘れたとしても参考にするのも悪くありません。
###############################################################################
###
### PACKET FLOW THROUGH NETFILTER TABLES AND CHAINS
###
###
### {Packet in}
### |
### v
### +-----------------+
### |mangle/PREROUTING|
### +-----------------+
### |
### v
### +-----------------+
### | nat/PREROUTING |
### +-----------------+
### |
### v
### *~~~~~~~~~~~~~~~~~*
### | kernel routing |
### *~~~~~~~~~~~~~~~~~*
### |
### v
### .------------{?for this host?}------------.
### yes! | | no!
### v v
### +-----------------+ +-----------------+
### | mangle/INPUT | | mangle/FORWARD |
### +-----------------+ +-----------------+
### | |
### v v
### +-----------------+ +-----------------+
### | filter/INPUT | | filter/FORWARD |
### +-----------------+ +-----------------+
### | |
### v |
### *~~~~~~~~~~~~~~~~~~~~* |
### | response & routing | |
### *~~~~~~~~~~~~~~~~~~~~* |
### | |
### v |
### +-----------------+ |
### | mangle/OUTPUT | |
### +-----------------+ |
### | |
### v |
### +-----------------+ |
### | nat/OUTPUT | |
### +-----------------+ |
### | |
### v |
### +-----------------+ |
### | filter/OUTPUT | |
### +-----------------+ |
### | |
### .-------------------+---------------------.
### |
### v
### +------------------+
### |mangle/POSTROUTING|
### +------------------+
### |
### v
### +------------------+
### | nat/POSTROUTING |
### +------------------+
### |
### v
### {Packet out}
###
###############################################################################
どういう意味ですか?
ルーティングは、ルーティングテーブル(上記のフローチャートの「カーネルルーティング」)を使用するか、netfilterを使用して実行できます。これで、最も可能性の高いシナリオの場合、ルーティングテーブルを適切に設定しないと、カーネルはパケットがどこに行くべきかを知らず、最終的にパケットを破棄します。注:この場合は、カスタムチェーンを作成してLOG
からDROP
その順序でルールを追加すると便利です。これにより、どのルールが影響を受けるかを確認できます。iptables-save -c
チェーンに追加する方法[packets:bytes]
と同様に、各ルール行にパケットとバイトカウンタを追加することも便利です。
仮想マシンに転送するポートには、DNAT
次のレシピがあります(以下に説明します)。
#!/bin/bash
VMNET=192.168.1.0/24
MAINIP=66.249.67.195
CONTIP=192.168.1.2
VMPORT=80
INPORT=80
ACTION="-I"
iptables -t nat $ACTION PREROUTING -d $MAINIP -p tcp --dport $INPORT -j DNAT --to-destination $CONTIP:$VMPORT
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p tcp -j MASQUERADE --to-ports 1024-65535
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -j MASQUERADE
iptables -t filter $ACTION INPUT -p tcp -d $MAINIP --dport $INPORT -j ACCEPT
iptables -t filter $ACTION FORWARD -p tcp --dport $INPORT -d $VMNET -j ACCEPT
iptables -t filter $ACTION FORWARD -p tcp --dport $INPORT -d $MAINIP -j ACCEPT
自分のルールに合わせて順序を変更することもできます。また、OUTPUT
チェーンにACCEPT
デフォルトポリシーがない場合は、出力ルールを追加する必要があります。ただし、すべての実用的な目的のためには、RELATED,ESTABLISHED
状態規則を使用してそれを満たす必要があります。ワイルドカードを介して一致または一致するようにインターフェイスを絞り込むこともできます。たとえば、仮想ゲストのブリッジにすべてのプレフィックス(アンダースコア)を指定して、と_
一致するようにしました。同様に、複数のネットワークカード(、)の場合と一致させることができます。-i _+
-o _+
eth0
eth1
-i eth+
ここで何が起こるかは次のとおりです。
DNAT
$INPORT
TCP(ホスト)ポートから入力を受け入れ、それを$CONTIP:$VMPORT
コンテナのIPとコンテナのポートに「ルーティング」する規則を挿入します。はい、異なる場合があります。そうでない場合は、ターゲット部分を省略できます(例:「$ CONTIP」)。- トラフィックマスキングのための3つのルール~から仮想ゲストサブネットがありますが、行かない到着別の仮想ゲスト。
INPUT
パブリックIP(インターフェイスは提供されていませんが、おそらく!)ポートからの着信パケットの通過を許可するルールです$INPORT
。少なくともパブリックインターフェイスにバインドする場合は、このルールが厳密に必要ではないと思います。$INPORT
仮想ゲストサブネットにトラフィックを転送するルール($VMNET
)$INPORT
パブリックIPにトラフィックを転送する$MAINIP
ルール()
sysctl
最後に、()の値は次のよう/proc/sys/net/ipv4/ip_forward
になります。
# cat /proc/sys/net/ipv4/ip_forward
1
ホストをルーターにします。
echo 1
上記の「ファイル」に書かないprocfs
場合。sysctl -w net.ipv4.ip_forward=1
root
答え2
私はまだ分からないなぜしかし、私はそれを働かせました。
eth0
(192.168.99.x)とeth1
(192.168.1.x)の2つのインターフェースがあります。従来の理由で存在するため、新しいVMが必要な場合や古いVMをコピーするときは怠惰です。とにかく、私はちょうど無効にしたが、eth0
すべてがうまくいきます。
rp_filter
いくつかの設定を確認しましたが/etc/sysctl.conf
解決されませんでした(しかし、IFの問題は奇妙なようです)。これらの設定は/usr/share/doc/kernel-doc-x.x.x/Documentation/networking/ip-sysctl.txt
パッケージに文書化されていますkernel-doc
。
これで動作するので、検索エンジンが見つかるようにここに残しておきます。いつかこれは他の人に役立つかもしれません。