iptables를 사용하여 1:1 NAT 만들기

iptables를 사용하여 1:1 NAT 만들기

나는 Linux에서 NAT 변환에 대해 조금 배우려고 노력하고 있지만 가능한 한 기본적으로 요약된 개념 증명을 본 적이 없습니다.

그래도. 내 설정 그림은 다음과 같습니다.

두 개의 서브넷이 있는 간단한 네트워크

나는 인터넷에 대한 매우 기본적인 라우터를 가지고 있습니다. 기본적으로 다음 두 가지 작업만 수행할 수 있습니다.

  • 인터넷에 연결하십시오.
  • 1개의 서브넷에만 IP 주소를 배포합니다.

그것할 수 없다정적 라우팅을 전혀 수행하지 마십시오.

...그리고 IPv6 주소가 어떻게 생겼는지조차 모릅니다! (농담하지 마세요!)

내가 원하는 것은 에서 인터넷에 연결할 수 있을 뿐만 아니라 에서 또는 다른 서브넷의 다른 장치 에도 Raspberry 3연결할 수 있는 것입니다 .My ComputerRaspberry 3

Raspberry 4이로 인해 192.168.10.x/24 범위의 모든 IP 주소가 192.168.1.x/24 범위로 변환되는 1:1 NAT를 my 에 구현하는 아이디어가 생겼습니다 .

그렇게 하면 적어도 내 라우터의 관점에서는 192.168.0.0/23의 주소 풀이 192.168.0.0에서 192.168.1.255까지이므로 네트워크의 모든 호스트가 동일한 서브넷에 속해 있는 것처럼 보입니다.

하지만 어떻게 해야 할까요?

라즈베리 4의 iptables에 다음과 같은 두 가지 규칙을 추가하는 것으로 충분합니까?

iptables -t nat -A PREROUTING -d 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

아니면 ip 패키지의 방향에 대해 좀 더 명시적으로 설명해야 합니까?

업데이트:

문제 해결을 돕기 위해 Raspberry 4가 두 서브넷 모두에 대해 DHCP 서버 역할을 한다는 것을 알려드릴 수 있습니다.

두 네트워크 모두에서 임의의 시스템에서 인터넷으로 경로 추적을 수행할 때 자신을 첫 번째 홉으로 광고합니다.

My computerGoogle이 다음과 같은 내용을 표시한다고 가정하는 추적 경로는 다음과 같습니다 .

  • 1: 라즈베리 4
  • 2: 기본 라우터
  • 3: ISP 게이트웨이
  • 4: ...
  • ...
  • n: Google.com

그러나 내 Raspberry 3.

첫 번째 점프는 Raspberry 4이므로 놀랄 일은 아니지만 경로는 192.168.10.0/24 서브넷에 도달하는 방법을 모르기 때문에 ping에 대한 응답을 제공하지 않습니다.

참고로 저는 Raspberry 4이미 사이트-투-사이트 VPN 클라이언트 역할을 하고 있으므로 다른 모든 작업이 실패하면 소스 기반 라우팅을 수행하고 VPN 연결을 통해 모든 트래픽을 보낼 수 있지만 상당한 속도 저하가 발생합니다(약 70% 속도) 떨어지다).

업데이트 2:

Raspberry 4의 출력:

# ip rule show

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

# ip route show table main

default via 192.168.0.1 dev eth0 src 192.168.0.136 metric 202
192.168.0.0/23 dev eth0 proto dhcp scope link src 192.168.0.136 metric 202
192.168.100.0/24 dev tun-ipv6 proto kernel scope link src 192.168.100.10
  • 라우터는 192.168.0.1에 있습니다.
  • 서브넷 192.168.100.0/24가 내 VPN 내부에 있습니다.

VPN을 통해 모든 트래픽을 보낼 의도가 없기 때문에 해당 부분은 잘 작동합니다.

로컬 LAN에서 IPv6를 사용하기 위해 이전에 특정 트릭을 이미 한 번 수행했으므로 VPN을 통해 192.168.10.0/24에서 리디렉션할 새 라우팅 테이블을 만드는 것은 쉽지 않습니다. :-)

그러나 Tom Yan 솔루션은 제가 특히 "AnyIP"에 대한 그의 힌트를 목표로 삼았던 것과 꽤 비슷해 보입니다. :-)

약간의 테스트가 필요하지만 그의 대답을 받아들이겠습니다. :-)

답변1

우선 소스 NAT는 다음과 같아야 합니다.

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24

( 성냥 POSTROUTING과 함께 -s)

대상 NAT는 다음과 같아야 합니다.

iptables -t nat -A PREROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

( 성냥 PREROUTING과 함께 -d)

참고: AFAIK 대상 NAT 규칙은 "NEW" 트래픽(LAN 내에서)에만 필요합니다. 소스 NAT 규칙은 반환 트래픽에 충분합니다. 왜냐하면 이들 중 하나에 대한 대상 NAT가 "암시"되기 때문입니다.

그러나 문제가 있습니다. ("실제로" ) 트래픽이 추가 라우팅을 위해 이동해야 하는지 어떻게 알 My Computer수 있습니까?Primitive Router192.168.1.0/24192.168.10.0/24Raspberry Pi 4

대답은 Raspberry Pi 4에 대한 ARP 요청에 응답 해야 한다는 것입니다 192.168.1.0/24.

이를 달성하는 방법 중 하나는 "AnyIP"(적어도 제가 들어본 용어)라는 것을 설정하는 것입니다. 이는 기본적으로 다음 local에 대한 유형의 서브넷 경로를 추가하는 것을 의미합니다 192.168.1.0/24.

ip r add local 192.168.1.0/24 dev eth0

arp_ignore참고: 이것이 sysctl을 eg로 설정했을 때 작동하는지 정확히 기억이 나지 않습니다 1.

sysctl을 사용하여 IP(v4) 전달을 활성화했는지, Raspberry Pi 4규칙이나 체인 정책에 따라 원하는 트래픽 전달을 차단하는 방화벽이 없는지 확인하십시오.

답변2

나는 Linux에서 NAT 변환에 대해 조금 배우려고 노력하고 있지만 가능한 한 기본적으로 요약된 개념 증명을 본 적이 없습니다.

LAN을 통해 다른 장치를 연결할 때 데스크탑 PC에서 "인터넷을 공유"하기 위해 사용하는 가능한 기본 스크립트는 다음과 같습니다.

#!/bin/bash

# masquerade $1 (e.g. eth0, ppp0) as $2 (default wlan0)

INTIF="$1"
EXTIF=${2:-wlan0}

echo $INTIF $EXTIF

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -t nat -F
iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

"내부" 인터페이스(NAT가 필요한 클라이언트가 있는 네트워크) 및 "외부" 인터페이스(인터넷 방향)를 사용하여 호출해야 합니다. 내부 인터페이스 설정 및 DHCP 등은 포함되지 않습니다(NAT에 대해서만 문의하셨습니다).

그래서 Raspberry 4에서 192.168.10.x/24 범위의 모든 IP 주소가 192.168.1.x/24 범위로 변환되는 1:1 NAT를 구현하는 아이디어를 얻었습니다.

이는 "기본 NAT"보다 훨씬 어렵습니다.

하지만 그렇게 할 필요는 없으며 실제로 기본 라우터/Raspberry Pi 4 조합에서는 잘 작동하지 않습니다. 대신 Raspberry Pi 4에서 기본 NAT를 수행하세요. 즉, 192.168.10.*/24의 모든 항목이 192.168.0.0으로 NAT되며 라우터는 이를 잘 이해할 것입니다.

(실제로는 두 개의 스위치를 연결하고 라우터에서 단일 서브넷을 제공하기만 하면 됩니다. 그런데 기본 라우터를 OpenWRT 등으로 다시 플래시할 수 있다면 다음과 같은 작업도 수행할 수 있습니다. 음, 라우팅).

답변3

아니요, NAT 규칙을 추가하는 것만으로는 충분하지 않습니다. 로컬 네트워크(브로드캐스트 세그먼트)에서 IPv4 호스트 검색은 ARP를 사용하여 작동하기 때문입니다. ARP의 브로드캐스트 트래픽은 내부 NAT 상자를 통과하지 않으며 NAT 상자도 응답하지 않습니다. 응답하려면 가 필요합니다 proxy_arp.

그러나 이러한 종류의 설정으로 무엇을 얻을 수 있는지는 확실하지 않습니다. 모든 것을 하나의 네트워크에 넣거나 (라우터 대신) PC에 경로를 추가하고 외부 라우터에만 MASQUERADE를 추가하세요.

관련 정보