localhost에 대해 iptables 포트 경로 재 지정이 작동하지 않습니다


54

포트 443에서 내부 포트 8080으로 모든 트래픽을 리디렉션하고 싶습니다. iptables에이 구성을 사용하고 있습니다.

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

이것은 모든 외부 클라이언트에서 작동합니다. 그러나 동일한 maschine에서 포트 443에 액세스하려고하면 연결 거부 오류가 발생합니다.

wget https://localhost

로컬 트래픽도 리디렉션하도록 iptables 규칙을 확장하려면 어떻게해야합니까?


이 주제는보다 일반적인 답변을 제공합니다. serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen

1
담당자가 줄 바꿈 전에 명령에 백 슬래시를 추가 할 수 있습니까?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

답변:


68

루프백 인터페이스에서 PREROUTING을 사용하지 않으므로 OUTPUT 규칙도 추가해야합니다.

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080

3
첫 번째 규칙이 필요 없습니다. 로컬로 생성 된 패킷은 PREROUTING 체인을 통과하지 않습니다.
Khaled

9
외부 트래픽도 리디렉션하기를 원하기 때문에 compeletion을 위해 초기 규칙을 추가했습니다. 규칙은 모든 IP를 수락한다고 말하는 경우 소스 / 대상을 필요로하지 않습니다
Andy

오 응용 론 나는 대답했을 때 당신의 대답을 보지 못했습니다.
Andy

앤디, 여전히 server.com에 연결 중입니다. | <ip> | : 443 ... 실패 : 연결이 거부되었습니다.
Chris

크리스 안녕하세요, 로컬 호스트에 연결 중입니까? | 127.0.0.1 | 443 도메인인가요? 후자가 서버에서 실행중인 경우 내부 라우팅 문제가있을 수 있습니다. wget server.com:8080 을 시도하여 다시 확인할 수 있습니다 (포트 포워딩 이유는 외부에서 차단 되었기 때문에 가정합니다). 내 자신의 VPC에 그 문제가 있지만 / etc / hosts 파일에서 도메인을 127.0.0.1로 정의하면 해결 방법을 사용할 수 있습니다.
Andy

10

로컬 호스트에서 다른 시스템으로 패킷을 리디렉션하려면 규칙 :

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

작동하지만 커널 에서이 옵션을 활성화해야합니다.

sysctl -w net.ipv4.conf.all.route_localnet=1

커널 설정이 없으면 작동하지 않습니다.


그것도 작동합니다. 나는 iptables에서 모든 것을하는 것이 더 깨끗하다고 ​​생각합니다.
quadruplebucky

실제로 대상이 다른 시스템, VM 또는 원격 시스템에있는 경우 커널 설정이 조정됩니다.

그것은 하지 앤디 위의 제안대로 두 가지 규칙이있는 경우.
quadruplebucky

죄송합니다. DNAT가 작동하지 않는 다른 컴퓨터로 전달하는 경우에 대해 이야기했습니다. 나는 localhost에 연결되었다고 생각하는 것을 동일한 컴퓨터의 컨테이너에 전달하려고 할 때 문제에 대한 해결책을 찾기 위해이 답변을보고있었습니다. 예를 들어 로컬 쿼리를 위해 컨테이너에서 네임 서버를 실행합니다.

실제로 커널 버전> = 3.6에 의존합니다.
quadruplebucky

3

이것은 어떤가요?

iptables -t nat -A 출력 -d 127.0.0.1 -p tcp --dport 443 -j 리디렉션-포트 8080


2

연결 거부 오류가 발생 했다고 말했습니다 . 이것은 연결하려는 포트에서 로컬 프로세스 수신 대기가 없음을 의미합니다! 청취 프로세스를 확인하려면 다음 명령을 사용하십시오.

$ sudo netstat -lnp | grep 8080

규칙을 적용한 후 포트 8080에서 수신 대기하는 프로세스가 있어야합니다.

대신 다음 규칙이 있어야합니다.

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

로컬 호스트에서 전송한다는 것을 기억하십시오. 따라서 출력 패킷을 리디렉션해야합니다.


1
대답 해 주셔서 감사합니다. 프로세스가 포트 8080에서 수신 대기 중입니다. 따라서 모든 트래픽을 해당 포트로 리디렉션하고 싶습니다.
Chris

프로세스가 루프 인터페이스에서도 수신 대기하고 있습니까? 실제 인터페이스에서만 청취 할 수 있습니다. 일반적으로 웹 서버는 오히려 말,보다 0.0.0.0에 192.168.10.0을 경청해야합니다
MrMajestyk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.