web-dev-qa-db-ja.com

ブリッジネットワークの背後にあるqemuゲストからインターネットホストにアクセスする

同じプライベートネットワーク上にいくつかのqemuクエストを設定しようとしています。ホストの外部からアクセスできないようにしたいのですが、インターネットから相互にアクセスしたり、リソースにアクセスしたりできるようにする必要があります。コンテキストでは、これはスラッシュkubernetesのセットアップになります。

私がしたこと:

  1. プライベートIPを使用してブリッジインターフェイスを設定する
ip link add name br0 type bridge
ip addr add 10.24.0.1/24 dev br0
ip link set dev br0 up
  1. qemu-bridge-helperに次の行を追加して、/etc/qemu/bridge.confへのアクセスを許可しました
allow br0
  1. ブリッジインターフェイスにバインドされたDHCPサーバーを開始しました
dnsmasq --interface=br0 --bind-interfaces --dhcp-range=10.24.0.2,10.24.0.254
  1. ゲスト通信がiptablesをスキップできるようにしました
sysctl -w net.bridge.bridge-nf-call-iptables=0

この時点で、次のことができます。

  • ホストから、ゲストにアクセス(ping/ssh)
  • ゲストから、他のゲストにアクセス(ping/ssh)
  • ゲストから、ホストにアクセス(ping/ssh)
  • ゲストから、ホストの他のIPにpingを実行します
  • ゲストから、ホスト名ルックアップを実行します

私ができないことは、ホスト以外のものにアクセスすることです。インターネットリソース。

Dockerをインストールしていて、Dockerネットワークが機能しています。 docker run -t Alpine ping google.comは完全に機能します。

10.24.0.0ネットワークからのパケットの転送を許可する必要があるように思われますが、その方法がわかりません。私が試してみました

iptables -I FORWARD -i br0 -j ACCEPT
iptables -I FORWARD -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o '!br0' --source 10.24.0.0/24 -j MASQUERADE

しかし、それは役に立ちません。

そして、問題を解決するために、IP転送が有効になっています。

$ cat /proc/sys/net/ipv4/ip_forward
1

QEMUゲストからのインターネットアクセスを許可するために何を変更できますか?

2
Robert Munteanu

間違ったルールを修正すると機能するはずです。

iptables -t nat -A POSTROUTING -o '!br0' --source 10.24.0.0/24 -j MASQUERADE
                               ^^^^^^^^^

!br0という名前のインターフェースがないため、一致することはありません)

に:

iptables -t nat -A POSTROUTING ! -o br0 --source 10.24.0.0/24 -j MASQUERADE

Iptablesを表示する簡単なテストでは、(より簡単な)ダミーインターフェイスを使用して、'!br0'を否定とは見なしません。

ip link add '!test' type dummy
ip address add dev '!test' 10.11.12.1/24
ip link set '!test' up
iptables -I OUTPUT -o '!test'

これで、次のインターフェイスを介してpingを試すことができます:ping 10.11.12.2そして、たとえばiptables-save -c |grep testで、インターフェイスが使用されるとカウンターが増加し、そうでない場合は増加しないことがわかります。

# iptables-save -c|grep test
[1:84] -A OUTPUT -o !test
1
A.B