라우터가있는 소규모 네트워크가 있는데, 로컬 네트워크의 인터넷, 서버 및 일부 워크 스테이션에 대한 연결을 유지합니다.
서버는 인터넷에서 액세스하도록되어 있으며 라우터 iptables에 다음과 같은 몇 가지 DNAT 항목이 설정되어 있습니다.
-A PREROUTING -i ppp0 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
외부 패킷은 ppp0
인터페이스 를 통해 라우터로 전달 되고 내부 패킷은 br-lan
스위치와 WLAN 어댑터가 실제로 포함 된에서 전송됩니다. 문제는 외부 액세스는 제대로 작동하지만 DNS 확인 외부 IP (에 할당 됨 ppp0
)로 LAN 내부에서 서버에 액세스하려는 시도 가 실패 한다는 것 입니다.
내가 발명 할 수있는 유일한 해결책 /etc/hosts
은 내부 IP를 가리키는 라우터의 정적 항목을 추가 하는 것입니다.하지만 와일드 카드가 없기 때문에 (그리고 시스템에 할당 된 최상위 도메인이 3 개 이상 있고 수십 개의 하위 도메인을 세지 않음), 오히려 바삭 바삭하고 실패하기 쉽습니다. 더 나은 것을 제안 할 수 있습니까?
이 질문 만 찾았 는데 도움이되지 않았습니다.
관련이 있으면 라우터는 dnsmasq와 함께 OpenWRT 10.03 Kamikaze를 실행합니다.
답변
거의 8 년이 지난 후에도 OpenWRT에서 기본적으로 사용되는 UCI 구성 시스템을 사용하여 올바른 방법을 설명하는 사람이 아무도 없습니다.
Steven Monday의 대답은 정확하지만 iptables
UCI 구성 시스템보다 낮은 계층 인 명령을 직접 사용 하고 있으며 가능한 경우 대부분의 OpenWRT 사용자는 그대로 두는 것이 가장 좋습니다.
UCI의 다른 내부 호스트에서 공개 IP / 포트 콤보를 통해 내부 서버에 액세스하는 올바른 방법 reflection
은 파일의 각 특정 DNAT 대상에서 구성 옵션을 활성화하는 것 /etc/config/firewall
입니다. 이 동작은 여기 에 설명되어 있습니다 .
예를 들면 다음과 같습니다.
config redirect
option target 'DNAT'
option src 'wan'
option dest 'lan'
option proto 'tcp'
option src_dport '44322'
option dest_ip '192.168.5.22'
option dest_port '443'
option name 'apache HTTPS server'
option reflection '1'
참고 : 표시된 OpenWRT 설명서에 reflection
따라 기본적으로 활성화되어 있습니다. 내 테스트에서는 그렇지 않았습니다.
답변
정확한 답을 완전히 확신하지 못했기 때문에 원래 답변을 삭제했습니다. 그 후 문제의 네트워크를 시뮬레이션하기 위해 VM의 가상 네트워크를 약간 설정할 시간이있었습니다. 나를 위해 일한 방화벽 규칙 세트는 다음과 같습니다 ( 표의 경우에만 iptables-save
형식으로 nat
).
-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE
첫 번째 POSTROUTING
규칙은 LAN과 인터넷 연결을 공유하는 간단한 방법입니다. 나는 완전성을 위해 그곳을 떠났습니다.
PREROUTING
규칙 및 제 POSTROUTING
외부 IP 주소를 통해 서버에 접속하는 관계없이 LAN 연결은 내부 또는 외부에서 발생 여부에 일어날 수 있도록 함께 규칙 적절한의 NAT를 확립한다. LAN의 클라이언트가 외부 IP 주소를 통해 서버에 연결되면 서버는 라우터의 내부 IP 주소 (192.168.2.1)에서 연결이 온 것으로 간주합니다.
흥미롭게도 두 번째 POSTROUTING 규칙에는 몇 가지 변형이 적용됩니다. 대상이로 변경 -j SNAT --to-source 192.168.2.1
되면 그 결과는 다음과 같습니다 (놀랍지 않게) MASQUERADE
. 서버는 로컬 LAN 클라이언트의 연결을 라우터의 내부 IP 주소 에서 시작한 것으로 간주 합니다. 반면 대상이로 변경 -j SNAT --to-source 89.179.245.232
되면 NAT는 여전히 작동하지만 이번에는 서버가 로컬 LAN 클라이언트의 연결을 라우터의 외부 IP 주소 (89.179.245.232)에서 시작한 것으로 간주합니다.
마지막으로, 규칙 이 LAN 클라이언트에서 오는 패킷과 일치하지 않기 때문에 원래 PREROUTING
/ DNAT
규칙이 -i ppp0
작동하지 않습니다 ( ppp0
인터페이스 를 통해 라우터에 들어 가지 않기 때문에 ). PREROUTING
내부 LAN 클라이언트에 대해서만 두 번째 규칙 을 추가하여 작동 시킬 수 있지만 IMO (Inelegant)이며 외부 IP 주소를 명시 적으로 참조해야합니다.
이제 “헤어핀 NAT”(또는 “NAT 루프백”또는 “NAT 리플렉션”또는 호출하기를 원하는 모든 것) 솔루션을 자세하게 배치 한 후에도 분할 수평 DNS 솔루션은 여전히 믿습니다. -외부 클라이언트가 외부 IP로 해석되고 내부 클라이언트가 내부 IP로 해석되는 경우, 더 권장되는 경로입니다. 왜? NAT가 작동하는 방식을 이해하는 것보다 DNS가 작동하는 방식을 이해하는 사람이 더 많기 때문에 우수한 시스템을 구축하는 데있어 큰 부분은 유지 관리 가능한 부분을 사용하는 것입니다. DNS 설정은 비전 NAT 설정 (물론 IMO)보다 이해하기 쉬우므로 올바르게 유지 관리 될 가능성이 높습니다.
답변
일반적인 해결책은 내부 호스트를 로컬 DNS 서버로 지정하여 이러한 호스트 이름에 대한 올바른 “내부”주소를 반환하는 것입니다.
Cisco 방화벽에서 작업 할 때이 솔루션을 사용하는 또 다른 솔루션은 이러한 주소에 해당하는 방화벽에서 DNS 응답을 다시 작성하는 것입니다. 지금 당장 Linux 용 도구가 있다고 생각하지 않습니다.
게이트웨이에서 올바른 작업을 수행하도록 라우팅을 구성 할 수 있어야합니다. 외부에서 매핑 된 IP 주소를 인식하도록 서버를 구성해야 할 수도 있습니다 (예 : 더미 인터페이스에 할당). 이 구성을 사용하면 “내부”주소를 사용하여 한 내부 시스템에서 다른 내부 시스템으로의 통신이 라우터를 통과합니다.
답변
요청한 사항을 호출 NAT Loopback
하고 LAN에서 서버로 전송되는 패킷이 라우터를 통해 다시 전달되도록 SNAT 규칙을 추가해야합니다.
-A POSTROUTING -p tcp -s 192.168.2.0/24 -d 192.168.2.10 -m multiport --dports 22,25,80,443 -j SNAT --to-source 89.179.245.232
답변
네임 스페이스 \ 도메인의 내부 버전 호스팅에 대한 larsks 의견은 일반적으로 과거 에이 문제를 처리 한 방식입니다. 물론이를 위해서는 내부에 DNS 서버가 필요합니다.
답변
게스트 네트워크가 wan에서 lan 네트워크로 전달 된 포트에 연결할 수 있도록 다음 솔루션을 생각해 냈습니다. 이 스크립트는 “네트워크-> 방화벽-> 사용자 지정 규칙”섹션에 있습니다.
# lookup the public IP (DDNS resolves to this)
wanip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')
# Guest network to LAN
# srcname is the guest network name, this needs to match for iptables
srcname=guest
# CIDR notation of guest and lan networks
srcnet=192.168.15.0/24
tgtnet=192.168.10.0/24
# router (openwrt) IP on lan network
tgtrouter=192.168.10.1
# host on lan network where ports are normally forwarded
tgthost=192.168.10.5
# ports to forward as a list or range
tcpports=8080,9090
udpports=12345
prechain=prerouting_${srcname}_rule
postchain=postrouting_${srcname}_rule
# reset the tables to prevent duplicate rules
iptables -t nat -F ${prechain}
iptables -t nat -F ${postchain}
iptables -t nat -A ${prechain} -s ${srcnet} -d ${wanip}/32 -p tcp -m tcp -m multiport --dports ${tcpports} -m comment --comment "${srcname} NAT reflection TCP DNAT" -j DNAT --to-destination ${tgthost}
iptables -t nat -A ${postchain} -s ${srcnet} -d ${tgthost}/32 -p tcp -m tcp -m multiport --dports ${tcpports} -m comment --comment "${srcname} NAT reflection TCP SNAT" -j SNAT --to-source ${tgtrouter}
iptables -t nat -A ${prechain} -s ${srcnet} -d ${wanip}/32 -p udp -m udp -m multiport --dports ${udpports} -m comment --comment "${srcname} NAT reflection UDP DNAT" -j DNAT --to-destination ${tgthost}
iptables -t nat -A ${postchain} -s ${srcnet} -d ${tgthost}/32 -p udp -m udp -m multiport --dports ${udpports} -m comment --comment "${srcname} NAT reflection UDP SNAT" -j SNAT --to-source ${tgtrouter}
재부팅을 지원하려면 openwrt의 ssh 명령 줄에서 다음을 실행해야했습니다 (그렇지 않으면 재부팅 중에 일부 규칙이 추가 된 다음 플러시되는 경쟁 조건이 있다고 생각합니다).
uci set firewall.@include[0].reload="1"
uci commit firewall
NAT 리플렉션은 트래픽을 격리하기 위해 여러 인터페이스를 만든 경우 LAN 네트워크 내에서 자체적으로 연결되도록 설정되지만 다른 네트워크로는 연결되지 않습니다. 웹 인터페이스에서 전달 규칙을 구성하려고 시도했지만 모든 트래픽을 게스트 네트워크에서 해당 LAN 호스트로 포트로 보냅니다. 위의 내용은 모든 네트워크 트래픽 대신 WAN IP에 대한 요청 만 차단합니다.
이 대신 내부 DNS를 사용할 수 있지만 모든 포트 전달이 단일 호스트로만 이동하는 경우에만 가능합니다. 다른 포트를 전달하는 호스트가 여러 개인 경우 다른 포트의 규칙을 다른 tgthost
IP 및 포트로 반복 할 수 있습니다 .