仮想ブリッジを介してポートを Tap インターフェイスに転送できません。

仮想ブリッジを介してポートを Tap インターフェイスに転送できません。

Ubuntu 16.04にすぐにlibvirtをインストールしました。これは、範囲を提供するdnsmasqインスタンス192.168.122.0/24にvirbr0仮想ブリッジを作成し、デフォルトのNAT迷彩を設定しました。

仮想化ソフトウェアで使用できるように、その下にポイントアンドクリックインターフェイスを作成しました。ソフトウェア自体はインターネットとネットワークの残りの部分に完全にアクセスできるため、胃が正常に機能します。ソフトウェアが要求したIPアドレスを使用して、ホストから仮想化ソフトウェアSSHポートにアクセスすることもできます。だから私は「すぐに利用可能な」ルーティングテーブルが一般的に正しいと思います。

私が望むのは、外部ポートからソフトウェアとホストシステム全体にインバウンドSSH接続を転送することです。もちろん、ホストシステムにはSSHがあり、動作するにはSSHが必要です。だから私は別のポート(ポート2022など)を試しました。

ポート2022のインバウンドトラフィックをポート22のソフトウェアIPアドレスに転送するiptablesにDNATルールを作成しました。外部(たとえば、コンピュータAなど)からログインしようとすると、ターゲットにアクセスできなくなります。アドレス変換は正常に機能しているようですが、iptablesの「FORWARD」ステップに移動した直後に接続できないアウトバウンドICMPパケットの受信を開始します。

どのように進むべきか混乱しています。私はいくつかのSNATルールを試しましたが、間違っていたか、これは問題ではありません。誰でもこれについてどんな考えを持っていますか?

アップデート:tap0のWiresharkは、転送されたパケットが受信されたことを示しません。返されたパケットの内容は仮想化ソフトウェアとは関係ありません。

私のネットワーク写真は次のとおりです。

           ----------
          | Internet |
           ----------
               |
               |
            --------
           | Router | 10.211.255.1
            --------
               |
               | 
   ____________|_______________
  |                            |
 ----------                   ---------
|          |                 |  enp0s5 | 10.211.255.4
| Computer | 10.211.255.2    |  Host   | 192.168.122.1
|    A     |                 |  virbr0 |
 ----------                   ---------
                                  |
                                  | LAN NAT 192.168.122.0/24 
                                  |
                              ----------
                             |   tap0   |
                             | Guest OS | 192.168.122.118
                             |          |
                              ----------

私のIPテーブルルールは次のとおりです。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "INTRACE: "
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "FORTRACE: "
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "OUTTRACE: "
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

NAT tables:
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
LOG        tcp  --  anywhere             anywhere             tcp dpt:2022 LOG level debug prefix "NATPTRACE: "
DNAT       tcp  --  anywhere             anywhere             tcp dpt:2022 to:192.168.122.118:22

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATITRACE: "

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATOTRACE: "

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             LOG level debug prefix "NATQTRACE: "
SNAT       tcp  --  anywhere             anywhere             tcp spt:ssh to::2022
RETURN     all  --  192.168.122.0/24     base-address.mcast.net/24
RETURN     all  --  192.168.122.0/24     broadcasthost.localdomain
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24

最後に、上記のルールを使用してsyslogで見たものの例は次のとおりです。

Oct 20 09:49:15 ubuntu kernel: [85149.812291] RAWPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812318] MGPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812326] NATPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812336] MGFTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812340] FORTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812354] RAWOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812357] MGOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812361] OUTTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812364] MGQTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]

答え1

問題はFORWARDルールにあります。私が設定していないので、出力を誤って解釈しましたiptables --list

このリストのルール4は次のとおりです。

ACCEPT     all  --  anywhere             anywhere

これはどこからでもどこにでもバインドされ、すべての着信パケットを受け入れるようです。

iptables -Sしかし、ルール4を見ると、実際には次のようになります。

-A FORWARD -i virbr0 -o virbr0 -j ACCEPT

これは enp0s5 から入って vibr0 に向かうパケットと一致しません。したがって、vibr0に向けられたすべてのパケットを効果的に拒否するREJECT規則5が発生します。

私が学んだ教訓は、出力を信頼するのではなく、問題が発生したときに出力を確認することですiptables --listiptables -S

関連情報