Iptables

從橋接網路後面的 qemu 來賓訪問 Internet 主機

  • March 22, 2019

我正在嘗試在同一個專用網路上設置許多 qemu 任務。我希望它們無法在主機之外訪問,但它們應該能夠相互訪問並從 Internet 訪問資源。對於上下文,這將是一個 thrash 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)主機
  • 從客人那裡ping主機的其他IP
  • 從客人那裡,執行主機名查找

我不能做的是訪問主機以外的任何東西,例如網際網路資源。

我安裝了 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 客人訪問網際網路?

如果您更正錯誤的規則,它應該可以工作:

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

引用自:https://unix.stackexchange.com/questions/508028