iptables는 요청 외부에서 127.0.0.1로 리디렉션


41

포트 2222를 사용하여 127.0.0.1에서 서비스를 실행하고 있습니다. 모든 요청을 서브넷 192.168.1.0/24에서 127.0.0.1:2222 로만 192.168.2.2:2222 (외부 IP)로 전달해야 합니다.

이것을 사용하려고하는데 작동하지 않습니다.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

이 기능을 작동 시키려면 어떻게해야합니까?

UPD : 주소 체계를 편집합니다.


우리는 약간의 설명이 필요합니다. 트래픽은 어디에서 발생합니까? 트래픽은 원래 어디로 가고 있습니까? 교통은 어디로 가야합니까? 내가 읽을 때 192.168.1.0/24에서 127.0.0.1:2222로가는 트래픽이 12.23.34.45:2222로 리디렉션되기를 원합니다. 그러나 Warren의 답변에 따르면 192.168.1.0/24에서 12.23.34.45:2222로 트래픽을 127.0.0.1:222로 리디렉션해야한다고 가정합니다.
Patrick

1
트래픽은 192.168.1.0/24 서브넷에서 192.168.2.2:2222로 발생하며 127.0.0.1:2222에서 서비스로 변환되어야합니다. 주소 체계가 수정되었습니다.
SimWhite

1
2222서브넷에서 루프백 인터페이스로 트래픽을 포트하는 규칙을 원 192.168.1.0/24하십니까? 이는 단일 규칙 유형의 설정이 아닙니다. 여기를 참조하십시오 : debuntu.org/…
slm

예. 내가 이해할 때 masq 규칙을 추가해야합니까? IP 전달은 이미 활성화되어 있습니다.
SimWhite

"실제"IP로 실행하고 원치 않는 소스에서 들어오는 트래픽을 걸러 내지 않겠습니까? 이것이 방화벽을위한 것입니다.
vonbrand

답변:


60

사용중인 iptables 규칙이 작동하지만 추가로 변경해야 할 사항이 하나 있습니다.

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

( eth0NIC 교체 와 함께 192.168.2.2)

기본적으로이 값은입니다 0. 커널은 대상 외부 트래픽을 라우팅하지 않도록 지시합니다 127.0.0.0/8. 이는 트래픽이 정상이 아니기 때문에 보안을위한 것입니다.


추가 참고 사항 : 현재 iptables 규칙이 너무 광범위합니다. 규칙 -d 192.168.1.0/24 --dport 2222은 대상 일치로 지정합니다 . 즉, 컴퓨터가 포트 2222의 다른 호스트 (예 : 아웃 바운드 트래픽)와 통신을 시도하면 리디렉션됩니다. -d일치를 로 변경 -d 192.168.2.2하거나 추가 -i eth0(또는 귀하의 nic가 무엇이든)해야합니다.


8
이 정보는 놀랍게도 찾기가 어렵습니다.
Wren T.

그렇습니다. 매우 찾기 어려운 정보입니다! 감사합니다! 그러나 나는 없습니다 route_localnet. 그것에 대한 다른 이름이 있었습니까? (리눅스 2.6.30에서) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm 전달 mc_forwarding promote_secondaries rp_filter send_redirects 태그
IMZ - 이반 Zakharyaschev

내가 볼, 대한 패치route_localnet 내 커널 (2.6.30-STD-DEF-alt15 # 1 SMP 월 12월 14일 세계 협정시 08시 45분 48초 2009)보다 최신 (2012 년 6 월 7 일). 좋아, 나는 단순히 같은 전달 과정에 (외부에서 내부로) 원하는 포트 포워딩을 달성 할 것 netcat( nc) xinetd, 또는 포트 포워딩 옵션 ssh(후자는 효과와 바보, 물론입니다,하지만 난 그것을 언급, 왜냐하면이 가능성이 있기 때문입니다).
imz-Ivan Zakharyaschev

2
내 2 센트 : sysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan의

다른 사람들과 마찬가지로이 정보는 찾기가 어려웠습니다. 고마워, 내가 이것을 일찍 발견했다면, 엄청난 노력을 절약했을 것입니다.
Stephen Simpson

3

localhost로 리디렉션 할 수 있지만 루프백 (127.0.0.0/8)으로 리디렉션 할 수는 없습니다. 루프백은 허점입니다. 실제 인터페이스 중 하나로 리디렉션해야합니다. REDIRECT를 사용해보십시오.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222


이것은 아마도 sysctl voodo없이 가장 좋은 대답 일 것입니다 ...
Lester Cheung

포트 222가 로컬 호스트에서만 수신되는 경우에도 여전히 도움이되지 않습니다 (규칙은 대상 주소를 변경하지 않음)
sanmai

이 경우-j DNAT --to-destination w.x.y.z:222
dresende

2

로 정답이 route_localnet작동하지 않으면 어떻게합니까? ..

커널 에 패치route_localnet 가 포함 되어 있지 않으면 ... 커널을 업그레이드하십시오!

또는 외부 인터페이스에서 수신 대기하고 트래픽을 전달하는 프로세스를 실행하여 한 인터페이스로 들어오는 트래픽을 다른 인터페이스의 다른 포트 (특히 localhost)로 전달하는 다른 방법이 있습니다.

netcat( nc),, xinetdssh(그리고 아마도 더)는 이것을 할 수있는 프로그램의 모든 예입니다 (선택 ssh은 이상하고 비효율적 이지만 ).

이에 대한 구성을 작성했습니다 xinetd. 이제이 서비스가 자동으로 나타납니다.

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

( vaio.ob외부 네트워크 인터페이스에서이 호스트의 이름입니다.)

a service xinetd reload다음에 듣고 있는지 확인하십시오.

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

그리고 실제로 연결이 이루어집니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.