web-dev-qa-db-ja.com

iptablesを使用してVLAN間でトラフィックを転送する

私のネットワークには次の4つのVLANがあり、DHCPを使用してUbuntu Linuxボックスに接続されています。このLinuxはL3ルーターとしても機能します。

VLAN 10  on interface eth1.10  with subnet 10.10.10.0/24
VLAN 20  on interface eth1.20  with subnet 10.10.20.0/24
VLAN 50  on interface eth1.50  with subnet 10.10.50.0/24
VLAN 100 on interface eth1.100 with subnet 10.10.100.0/24

/etc/network/interfacesは次のとおりです。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.10.169
        netmask 255.255.255.0
        gateway 192.168.10.1

auto eth1
iface eth1 inet static
        address 10.10.0.1
        network 10.10.0.0
        netmask 255.255.255.0
        broadcast 10.10.0.255

auto eth1.100
iface eth1.100 inet static
        address 10.10.100.1
        network 10.10.100.0
        netmask 255.255.255.0
        broadcast 10.10.100.255

auto eth1.10
iface eth1.10 inet static
        address 10.10.10.1
        network 10.10.10.0
        netmask 255.255.255.0
        broadcast 10.10.10.255

auto eth1.20
iface eth1.20 inet static
        address 10.10.20.1
        network 10.10.20.0
        netmask 255.255.255.0
        broadcast 10.10.20.255

auto eth1.50
iface eth1.50 inet static
        address 10.10.50.1
        network 10.10.50.0
        netmask 255.255.255.0
        broadcast 10.10.50.255

これで、すべてのVLANのすべてのクライアントが、インターフェースeth0を介してパブリックインターネットに接続できるようになります。その部分は実際にiptablesルール-A POSTROUTING -o eth0 -j MASQUERADEで機能します。 DHCPサーバーも機能しています。

[〜#〜] but [〜#〜] VLAN 100が管理コンピューターのネットワークになるため、VLAN 100は、VLAN 10、20、50上の他のすべてのコンピューターにアクセスできる必要があります。[〜#〜] and [〜#〜] VLAN 10、20、50のクライアント自分のVLAN内のコンピューターにのみアクセスできる必要があります。

これまでに、MASQUERADEとともに次のiptablesルールを試しました:

-A FORWARD -i eth1.100 -o eth1.10 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.20 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.50 -j ACCEPT
-A FORWARD -i eth1.10 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.20 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.50 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT

IPアドレス10.10.100.101のPCからIPアドレス10.10.20.100のPCにpingを実行しようとしましたが、成功しませんでした。 100サブネットから10.10.50.101にpingすることもできませんでした。

[〜#〜] and [〜#〜]奇妙な副次的な振る舞いがあります:VLAN 20は偶然です(理由はわかりません)そこから、VLAN 10と100のPCにpingを送信できますが、最終的には不可能です。

カーネルでIPv4転送を有効にしており、外部インターネットは期待どおりに動作します。

iptables-saveの完全な出力は次のとおりです。

# Generated by iptables-save v1.6.0 on Thu May 26 09:28:59 2016
*filter
:INPUT ACCEPT [7375:724156]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3695:415474]
-A FORWARD -i eth1.100 -o eth1.10 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.20 -j ACCEPT
-A FORWARD -i eth1.100 -o eth1.50 -j ACCEPT
-A FORWARD -i eth1.10 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.20 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.50 -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu May 26 09:28:59 2016
# Generated by iptables-save v1.6.0 on Thu May 26 09:28:59 2016
*nat
:PREROUTING ACCEPT [32796:9980970]
:INPUT ACCEPT [142:30526]
:OUTPUT ACCEPT [1829:211124]
:POSTROUTING ACCEPT [128:29756]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu May 26 09:28:59 2016

そしてrouteの出力:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.10.1    0.0.0.0         UG    0      0        0 eth0
10.10.0.0       *               255.255.255.0   U     0      0        0 eth1
10.10.10.0      *               255.255.255.0   U     0      0        0 eth1.10
10.10.20.0      *               255.255.255.0   U     0      0        0 eth1.20
10.10.50.0      *               255.255.255.0   U     0      0        0 eth1.50
10.10.100.0     *               255.255.255.0   U     0      0        0 eth1.100
link-local      *               255.255.0.0     U     1000   0        0 eth0
192.168.10.0    *               255.255.255.0   U     0      0        0 eth0

事前に感謝します。誰かが私が望むものを達成するためにどのiptablesルールを使用すべきかを理解してくれることを願っています(それが問題である場合)。

編集:

@Sanaelが要求したように、さらにロギング(-A FORWARD -o eth1+ -p icmp -j LOG --log-prefix "IPTABLES FORWARD: " --log-level 7)を実行しました。結果は次のとおりです。

Ping 10.10.20.101-> 10.10.50.100 成功次のログを使用:

May 26 12:14:57 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23708 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=96
May 26 12:14:57 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15185 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=96
May 26 12:14:58 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23709 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=97
May 26 12:14:58 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15317 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=97
May 26 12:14:59 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23710 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=98
May 26 12:14:59 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15349 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=98
May 26 12:15:00 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.50 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.50.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=23711 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=99
May 26 12:15:00 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:3c SRC=10.10.50.100 DST=10.10.20.101 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=15597 PROTO=ICMP TYPE=0 CODE=0 ID=1 SEQ=99

Ping 10.10.20.101-> 10.10.100.100 失敗次のログを使用:

May 26 12:09:06 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18715 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=85
May 26 12:09:11 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18716 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=86
May 26 12:09:16 homeserver kernel: IPTABLES FORWARD: IN=eth1.20 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:c8:0a:a9:e5:f0:bc:08:00:45:00:00:3c SRC=10.10.20.101 DST=10.10.100.100 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=18717 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=87

Ping 10.10.50.100-> 10.10.20.101 failed次のログ:

May 26 12:11:28 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54378 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=1
May 26 12:11:29 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54495 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=2
May 26 12:11:30 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.20 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.20.101 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=54693 DF PROTO=ICMP TYPE=8 CODE=0 ID=1903 SEQ=3

Ping 10.10.50.100-> 10.10.100.100 失敗次のログを使用:

May 26 12:12:24 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8069 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=1
May 26 12:12:25 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8269 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=2
May 26 12:12:26 homeserver kernel: IPTABLES FORWARD: IN=eth1.50 OUT=eth1.100 MAC=00:0a:5e:50:7c:c1:00:1e:ec:fa:d1:10:08:00:45:00:00:54 SRC=10.10.50.100 DST=10.10.100.100 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=8375 DF PROTO=ICMP TYPE=8 CODE=0 ID=1905 SEQ=3

Ping 10.10.100.100-> 10.10.20.101 failed[〜#〜] but [〜#〜]はログ出力を作成しませんでした。

Ping 10.10.100.100-> 10.10.50.100 成功[〜#〜] but [〜#〜]はログ出力を作成しませんでした。

2
AirPett

問題は少なくとも部分的に解決されました(これで問題ありません)。

私は最初にWindowsクライアントでネットワークをテストしていましたが、両方のPCが最近Windows 10にアップグレードされていました。問題自体は本当に愚かでした:Windows 10ではデフォルトで有効になっている新しいセキュリティがあるため、Windowsはpingに応答しませんでした。1つのLinuxラップトップをネットワークに追加すると、他のすべてのLinuxラップトップにpingを実行できる状況になりました(デフォルトのポリシーはALLOW)でしたが、Linux PCは他に何もpingできませんでした(Windowsはpingに応答しませんでした)。次に、VLAN 100とLinuxブームのLinux PCから、VLAN 10と50のWindows PCへのリモートデスクトップを試しました-うまくいきました!

そのため、iptables/netfilterルールにはまったく問題がありませんでした。

すべての回答とコメントをありがとうございました!

これが私の最終的な機能し、単純化されたiptables設定です:

# Generated by iptables-save v1.6.0 on Thu May 26 16:00:55 2016
*filter
:INPUT ACCEPT [359:39449]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [563:89333]
-A FORWARD -i eth1+ -o eth1.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1.100 -o eth1+ -j ACCEPT
-A FORWARD -i eth1+ -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth1+ -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu May 26 16:00:55 2016
# Generated by iptables-save v1.6.0 on Thu May 26 16:00:55 2016
*nat
:PREROUTING ACCEPT [5650:1147271]
:INPUT ACCEPT [91:14019]
:OUTPUT ACCEPT [325:31088]
:POSTROUTING ACCEPT [44:7161]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu May 26 16:00:55 2016
1
AirPett

まず、FORWARDチェーンのデフォルトポリシーはACCEPTであるため、実際にはトラフィックを拒否していません。これは、20-> 50の転送が機能する理由を説明しています。これはiptables -P FORWARD DROPで修正できます。

他のpingに関しては、ログエントリのTTLが127または63のいずれかであり、ファイアウォールがすでにルーティングを決定し、TTLをデクリメントしていることを示しています。また、ファイアウォールがトラフィックをブロックするように構成されていません。これは、クライアントのルーティング構成に問題があることを示しています。ping受信者でスニファを使用して、元のpingパケットが到着しているかどうかを確認してください。クライアントのデフォルトゲートウェイ(ファイアウォール)10.10.10.0/24は10.10.10.1などです。

ルーティングテーブルのコメントをフォローアップすると、ルーティングテーブルは正しく、ファイアウォールがVLANネットワークに直接接続されていることがわかります。

1
Jeremy Dover

I. iptables

既存のルールの後にログ行を追加しましたか?もしそうなら、あなたの問題について私が思うことはあります。

  1. _-j ACCEPT_ルールのパケットのパスを終了します。したがって、ログ行は、6つのルールが一致しなかったことを意味します。
  2. FORWARDのデフォルトポリシーはACCEPTであるため、パケットがFORWARDチェーンの最後に到達した場合でもパケットは受け入れられます。 _iptables -P FORWARD DROP_を追加して、この動作を変更する必要があります。
  3. ログが表示されるということは、正しいデフォルトポリシーがあった場合にパケットがドロップされることを意味します。ログに記録される4つのpingは100以外のVLANからのものであり、これは予想される動作です。
  4. ログがないことは、パケットがルールに一致し、受け入れられたことを意味します。 2つのpingはvlan 100からのものであり、ルールに一致しましたが、これも期待される動作です。

iptables が機能していることがわかります。デフォルトのポリシーを変更するだけです。

II。ルーティング

ここで、問題の原因を理解する必要があります。これは、たとえばルーティングである可能性があります。 FORWARDデフォルトポリシーはACCEPT(問題の根本的な原因が見つかるまで保持できる)であるため、すべてのpingが成功しているはずです。そうでないものを見てみましょう:
20〜100、50〜20、50〜100、100〜20。

ログでは、MACをチェックして、ルーティングが正しいかどうかを確認できます。形式は<MAC dest (6 bytes)><MAC source (6 bytes)><08:00 & sometimes IP header>です。
ルーティングの前にあるので、_<eth1 mac><sender mac><not interesting>_があります。
必要なのは_<receiver mac><eth1 mac><not interesting>_なので、パケットが正しい場所に送信されているかどうかを確認できます。
それを行うために、POSTROUTINGチェーンにログルールを設定できます。

_-A POSTROUTING -o eth1+ -p icmp -j LOG --log-prefix "IPTABLES POSTROUTING: " --log-level 7
_

現在私たちが知っているのは:

  • 10.10.20.101:c8:0a:a9:e5:f0:bc
  • 10.10.50.100:00:1e:ec:fa:d1:10
  • eth1:00:0a:5e:50:7c:c1

10.10.10.100のMACも知る必要があります。
ところで、VLANが4つしかない場合は、デバッグに十分な情報を提供するために実行できるpingを12回試してください。
ルーターインターフェイスから(およびルーターインターフェイスに)8つのpingを試すことはできますか? (例:ルーター:_ping -I eth1.100 10.10.100.100_)

III。サードパーティの原因

Cisco confを再確認し(そして、ウィッチが根本原因であることがほぼ確実である場合は別の質問を開いて)、すべてのVLANがインターネットにアクセスできることを確認します。

編集:書き方が遅すぎる。よくやった!

0
Sanael