여러 NIC와 IPv4 전달이 활성화된 간단한 Linux 라우터가 있습니다.
라우터에는 하나의 인터페이스( eth0
, eth0:0
)에 할당된 두 개의 고정 WAN IP 주소가 있습니다. (아래 텍스트에서는 실제 공용 IP 주소(옥텟으로 257)를 난독화하고 있습니다.)
두 외부 WAN IP 주소 모두 외부 인터넷에서 ping할 수 있습니다.
상호 작용:
eth0
: 인터넷 연결, 134.257.10.10/24, 게이트웨이 134.257.10.1eth0:0
: 이 인터페이스의 두 번째 IP 주소: 134.257.10.20/스물넷eth1
: LAN 1, 192.168.1.1/24eth2
: LAN 2, 192.168.2.1/24eth3
: LAN 3, 192.168.3.1/24
내 설정이 작동하면 모든 LAN 클라이언트(LAN 1-3)가 인터넷에 액세스할 수 있고 외부적으로 134.257.10으로 나타날 수 있습니다.10. 또한 두 개의 수신 포트가 전달되었습니다.
내 iptables NAT 테이블은 다음과 같습니다.
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Port forwarding:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
-A PREROUTING -i eth0:0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.3.33:25
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
eth3
LAN3 클라이언트( )를 134.257.10으로 표시 하는 방법 .20eth0:0
134.257.10이 아닌 인터넷( )에서 나가는 연결을 만드세요.10( eth0
)?
답변1
MASQUERADE 대신 SNAT 사용
...기본값이 아닌 다른 것을 선택합니다.
일반적인 경우(다른 모든 LAN)에는 MASQUERADE를 사용하지 말고 LAN3 클라이언트에 대해서는 SNAT 예외를 추가하십시오. 이를 재정의하려면 다른 nat/POSTROUTING 규칙보다 먼저 일치해야 하므로 기존 규칙 세트의 올바른 위치에 적용하는 -I
대신 아래에서 사용됩니다 -A
(가짜 257 참고).
iptables -t nat -I POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT --to-source 134.257.10.20
iptables(반대로nftables) 일치할 수 없음입력하다POSTROUTING 후크에서 패킷이 라우팅되는 인터페이스이므로 -i eth3
위에서는 사용할 수 없으며 대신 원래 IP 주소 소스를 확인하여 일치가 수행됩니다.
문제를 풀다eth0:0
ifconfig
이 과정에서 20년 넘게 Linux에서 사용되지 않았지만 여전히 존재하는 Linux 명령과의 호환성을 위해서만 존재하는 개념인 소위 별칭 인터페이스 이름의 잘못된 사용을 수정합니다 . 실제로 Linux에서는 ifconfig
하나의 인터페이스에서 여러 IPv4 주소를 처리할 수 없으며 이 해결 방법은 이 문제를 극복하기 위한 것입니다. 실제로 커널을 포함하여 134.257.10.20/24를 제외한 eth0:0
모든 항목은 이를 레이블 설정과 관련된 주소로 간주합니다. 이 보조 주소는 다음과 같이 최신 주소를 사용하여 추가할 수 있습니다(기본 주소가 이미 설정된 후).ifconfig
eth0
eth0:0
ip addr
ip addr add 134.257.10.20/24 brd + label eth0:0 dev eth0
이것이 중요한 이유는iptables사용된 규칙과 정확하게 일치하지 않습니다 eth0:0
. 그래서 단기간에 교체해야 합니다.iptables인터페이스 확인: eth0
동일한 규칙에 IP 주소 확인을 추가합니다.
따라서 포트 80이 둘 다 대신 첫 번째 공용 IP 주소에 대해 192.168.1.10:80에만 도달하는 경우 다음을 바꾸십시오.
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
그리고:
-A PREROUTING -i eth0 -d 134.257.10.10 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
두 주소가 모두 적용되면 초기 규칙은 괜찮습니다.
그러나 포트 25에 대한 규칙은 다음과 같이 다시 작성되어야 합니다.
-A PREROUTING -i eth0 -d 134.257.10.20 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.3.33:25
실제 인터페이스에서 일치해야 함( eth0
)그리고eth0:0
주소는 인터페이스가 아니라 주소 이기 때문입니다 .
최종 규칙 세트는 다음과 같습니다(물론 가짜 257에 유의하세요).
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -d 134.257.10.10/32 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
-A PREROUTING -d 134.257.10.20/32 -i eth0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.3.33:25
-A POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT --to-source 134.257.10.20
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT