iptables를 사용하여 게스트 VM에 대한 포트 전달을 설정하는 방법

iptables를 사용하여 게스트 VM에 대한 포트 전달을 설정하는 방법

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 후크를 순서대로 통과합니다.

기록상 첫 번째 줄 세트는 작동하지 않습니다. 두 번째 줄 세트가 그렇습니다.

관련 정보