그래서 우리는 "왜"에 관심이 있는 것이 아니라 "어떻게"에 더 관심이 있으며, 내가 어디에서 잘못되고 있는지 아는 사람이 있는지 알고 싶었습니다.
기본적으로 루프백 장치(169.254.169.254)로 별칭이 지정된 IP의 포트 80으로 향하는 모든 패킷을 동일한 상자의 공용 IP인 다른 IP의 포트 8080으로 전달하고 싶습니다(1.1을 사용하겠습니다). .1.1 이 문제를 해결하기 위해). 그렇게 함으로써 나는 [표면적으로] 달릴 수 있을 것이다.
telnet 169.254.169.254 80
1.1.1.1:8080에 도달했지만 이런 일은 발생하지 않았습니다.
이것은 iptables의 내 nat 테이블입니다.
~# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 66 packets, 3857 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 169.254.169.254 tcp dpt:80 to:1.1.1.1:8080
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
내가 뭐 놓친 거 없니? 나는 iptables 매뉴얼 페이지와 아래 링크에 있는 대부분의 정보를 따랐지만 텔넷 시도 중에 여전히 "연결이 거부되었습니다"라는 메시지가 나타납니다. 내 iptables에 추가하려고 시도했지만 ~#iptables -t nat -A POSTROUTING -j MASQUERADE
소용이 없었습니다./
누구든지 나를 올바른 방향으로 가리킬 수 있다면 좋을 것입니다!
http://linux-ip.net/html/nat-dnat.html
https://www.frozentux.net/iptables-tutorial/chunkyhtml/x4033.html
편집하다 다음 sysctl 매개변수를 활성화했다고 덧붙이고 싶습니다.~# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
편집자 2호 (원래 시도했던 PREROUTING 체인 대신) nat 테이블의 OUTPUT 체인에 규칙을 추가하여 이 문제를 해결할 수 있었습니다.
답변1
나는 실제로 커널 모듈 "br_netfilter"가 호스트 시스템에 로드되었는지 확인하여 이 작업을 수행했습니다. 오랫동안 갇힌 끝에 그것은 너무나 간단하고 짜증스러울 정도로 단순했습니다.
나를 해결책으로 안내한 문서/기사:
1)
https://github.com/omribahumi/libvirt_metadata_api그리고https://thewiringcloset.wordpress.com/2013/03/27/linux-iptable-snat-dnat/
"iptables 설정" 섹션을 참조하세요. "REDIRECT"는 단순히 트래픽을 대상 NAT처럼 삭제된 주소가 아닌 로컬 시스템의 인터페이스로 리디렉션하기 때문에 "REDIRECT" 대신 "DNAT"를 사용했습니다.
2)
https://serverfault.com/questions/179200/difference-beetween-dnat-and-redirect-in-iptables그리고https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html
위에서 언급한 REDIRECT와 DNAT의 차이점을 이해하도록 도와주세요.
삼)
https://github.com/omribahumi/libvirt_metadata_api/pull/4/files
이 커밋을 통해 실제 솔루션을 찾을 수 있었습니다(위의 작업은 이전에 성공하지 못했지만).
답변2
로컬에서 생성된 패킷은 PREROUTING 체인을 통과하지 않으므로 체인 dnat
에 넣어야 합니다 .OUTUPT