QEMU/KVM
다양한 머신의 가상화 에 사용하고 있습니다 . 게스트 시스템과 호스트 시스템 간에 파일을 공유하기 위해 Samba
게스트 시스템에 네트워크 드라이브를 제공하는 호스트에서 서버를 실행합니다.
모든 게스트는 QEMU 표준 브리지를 통해 네트워크를 수신합니다 virbr0
.
지금 내 질문은 다음과 같습니다.
모든 손님의 공용 인터넷 액세스를 금지하는 방법아니요Samba
네트워크 드라이브에 액세스하지 못하도록 차단하시겠습니까 ?
답변1
최근에 가상 머신(kvm-qemu + virt-manager)에 대한 인터넷 액세스를 차단해야 했습니다.
가상 머신을 시작하면 호스트에서 다음과 같은 iptables 규칙을 찾을 수 있습니다(아직 없는 경우).
$ iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
이 구성을 사용하면 가상 머신이 인터넷에 액세스할 수 있습니다(FORWARD 규칙). 따라서 FORWARD 규칙을 삭제하기만 하면 됩니다.
$ iptables -L --list-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere udp dpt:domain
2 ACCEPT tcp -- anywhere anywhere tcp dpt:domain
3 ACCEPT udp -- anywhere anywhere udp dpt:bootps
4 ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED
2 ACCEPT all -- 192.168.122.0/24 anywhere
3 ACCEPT all -- anywhere anywhere
4 REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
5 REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere udp dpt:bootpc
$ iptables -D FORWARD 1
$ iptables -D FORWARD 2
$ iptables -D FORWARD 3
$ iptables -P FORWARD DROP
이는 실제로 가상 머신에 대한 인터넷 액세스를 차단하기에 충분합니다. 편집증이 있는 경우 라우터에서 직접 삼바 포트를 차단할 수 있습니다(라우터 인터페이스를 사용하거나 명령줄 방화벽을 사용하여 셸 액세스가 있는 경우).