Iptables
從橋接網路後面的 qemu 來賓訪問 Internet 主機
我正在嘗試在同一個專用網路上設置許多 qemu 任務。我希望它們無法在主機之外訪問,但它們應該能夠相互訪問並從 Internet 訪問資源。對於上下文,這將是一個 thrash kubernetes 設置。
我做了什麼:
- 使用私有 ip 設置網橋介面
ip link add name br0 type bridge ip addr add 10.24.0.1/24 dev br0 ip link set dev br0 up
qemu-bridge-helper
通過添加以下行來允許訪問/etc/qemu/bridge.conf
allow br0
- 啟動綁定到網橋介面的 DHCP 伺服器
dnsmasq --interface=br0 --bind-interfaces --dhcp-range=10.24.0.2,10.24.0.254
- 允許訪客通信跳過 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