libvirt 게스트 서버로의 포트 전달에 대한 개념 증명을 수행하려고 합니다.
다음은 일반화에 사용하는 변수입니다.
port=500 # Arbitrary port, for proof of concept
public_if=wlp0s20f3 # My public interface, connected to the internet.
private_if=virbr0 # My private interface, through which the guest OS communicates
public_ip=192.168.0.11 # public interface's IP
private_ip=192.168.122.1 # private interface's IP
guest_ip=192.168.122.175 # Guest's IP
sudo nc -l 500 -k
게스트는 터미널에서 명령이 실행되는 Ubuntu 라이브 CD입니다 . 를 실행하여 설정을 테스트합니다 nmap $public_ip -p $port
. 을 실행하면 nmap $guest_ip -p $port
포트가 "열림"으로 표시됩니다.
물론 이것은 상대적으로 간단하고 잘 문서화된 작업처럼 보이지만 제가 시도한 튜토리얼 중 어느 것도 작동하지 않는 것 같습니다.
우선, 모든 경우에 다음을 실행합니다.echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
그런 다음 다음 명령 세트를 시도했습니다.이 튜토리얼:
sudo iptables -A FORWARD -i $public_if -o $private_if -p tcp --syn --dport $port -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i $public_if -o $private_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i $private_if -o $public_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -t nat -A PREROUTING -i $public_if -p tcp --dport $port -j DNAT --to-destination $guest_ip
sudo iptables -t nat -A POSTROUTING -o $private_if -p tcp --dport $port -d $guest_ip -j SNAT --to-source $private_ip
이것은하지 않습니다. 이후에는 sudo iptables -F
다음 명령도 시도했습니다.이 답변:
sudo iptables -t nat -I PREROUTING -p tcp -d $public_ip --dport $port -j DNAT --to-destination $guest_ip:$port
sudo iptables -I FORWARD -m state -d $private_ip/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
그리고 그것도 작동하지 않았습니다. 포트는 에서 닫힌 상태로 유지됩니다 $public_ip
.
더 자세한 내용을 알아보기 위해 게스트를 시작한 후, 그리고 해당 게스트에서 모의 서버를 시작한 후에 이러한 규칙을 실행하고 있습니다.
내가 뭘 잘못하고 있는 걸까요? 이것을 디버깅하는 방법에 대한 제안 사항이 있습니까?
업데이트:
호스트와 게스트 모두에서 패킷 캡처를 실행해 보았습니다.
호스트에서:
sudo tcpdump -i $private_if
에서는 출력이 전혀 없지만 nmap $public_ip -p $port
에서는 출력이 있습니다 nmap $guest_ip -p $port
.
게스트:
sudo tcpdump
위와 똑같습니다. 호스트에 결함이 있음을 나타내는 것 같습니다.
답변1
문제는 테스트 방법입니다.
호스트에서 실행하는 것은 nmap $public_ip -p $port
네트워크의 다른 시스템에서 실행하는 것과 다릅니다. 여기서 가장 중요한 점은 SYN 패킷이 패킷을 게스트에게 전달하는 PREROUTING 후크를 통과하지 않는다는 것입니다. OUTPUT 및 POSTROUTING 후크를 순서대로 통과합니다.
기록상 첫 번째 줄 세트는 작동하지 않습니다. 두 번째 줄 세트가 그렇습니다.