다음을 고려하십시오.
WAN IP1: aaa.aaa.aaa.aaa/23
WAN IP2: bbb.bbb.bbb.bbb/25
LAN Subnet: 10.3.0.0/24
두 WAN 주소 모두 Linux Server로 라우팅되었으며 Linux 서버는 두 주소에서 모두 연결할 수 있습니다. LAN 인터페이스 (10.3.0.2)의 다른 호스트로 bbb.bbb.bbb.bbb를 라우팅하고 싶습니다.
INTERNET -- Linux Server
(aaa.aaa.aaa.aaa/23, bbb.bbb.bbb.bbb/25 ens3)
(10.3.0.1/24 tap0) -------- Router
(10.3.0.2/24 tap0)
INTERNET -- ISP NAT -- (xxx.xxx.xxx.xxx/xx eth0)
(172.16.1.0/24 br-lan)
이제 bbb.bbb.bbb.bbb를 tap0을 통해 10.3.0.2의 라우터로 라우팅하려고합니다 (bbb.bbb.bbb.bbb는 ens3의 주소였습니다). 따라서 내 라우터에는 공용 IP 주소가 있습니다. 이것이 내가 한 일입니다.
ip addr del bbb.bbb.bbb.bbb/25 dev ens3 # remove from ens3
ip route add bbb.bbb.bbb.bbb dev tap0 # route it to tap0
그래프는 다음과 같습니다.
INTERNET -- Linux Server
(aaa.aaa.aaa.aaa/23 ens3)
(10.3.0.1/24 tap0) -------- Router
(10.3.0.2/24, bbb.bbb.bbb.bbb tap0)
INTERNET -- ISP NAT -- (xxx.xxx.xxx.xxx/xx eth0)
(172.16.1.0/24 br-lan)
그리고 Linux 서버의 라우팅 테이블 :
% ip -4 route
default via aaa.aaa.aaa.1 dev ens3 onlink
10.3.0.0/24 via 10.3.0.1 dev tap0
10.3.0.1 dev ens3 scope link
aaa.aaa.aaa.0/23 dev ens3 proto kernel scope link src aaa.aaa.aaa.aaa
bbb.bbb.bbb.bbb dev tap0 scope link
169.254.0.0/16 dev ens3 scope link
그리고 라우터에서 address를 추가 bbb.bbb.bbb.bbb
했으며 이제 bbb.bbb.bbb.bbb
Linux 서버 에서 ping 을 할 수 있습니다.
그러나 bbb.bbb.bbb.bbb
다른 호스트 에서는 핑 을 할 수 없습니다 . 그래서 나는 시도했다 :
iptables -t nat -A POSTROUTING -j MASQUERADE
그 규칙 bbb.bbb.bbb.bbb
으로 인터넷 에서 핑 을 할 수있었습니다 . 추적 경로를 수행하면 bbb.bbb.bbb.bbb가 aaa.aaa.aaa.aaa 뒤에 있다는 것을 알 수 있습니다.
...
10. ???
11. aaa.aaa.aaa.aaa 0.0% 16 45.3 43.6 43.1 45.5 0.8
12. bbb.bbb.bbb.bbb 0.0% 16 53.7 54.8 51.2 79.4 7.1
그러나 터널 끝점 (10.3.0.2)에서 실제 소스 IP를 원합니다. 이제 Linux 서버가 SNAT를 수행하기 때문에 라우터에서 모든 트래픽 10.3.0.1을 얻습니다. 어떻게해야합니까?
답변
이렇게하지 준 명령, … 때문에, 약간 혼란 질문 나는 일단 tap0을 통해 10.3.0.2에 내 라우터 위에 경로 bbb.bbb.bbb.bbb을 원하는 . 내가 당신을 올바르게 이해한다면, 인터넷에 연결하기 위해 라우터가 Linux 서버를 통과하기를 원합니다. 경우 이 맞다,이, 당신의 첫 번째 그림의 구성에서 시작, 그것을 얻는 방법이다 즉 당신의 다음 명령을 무시.
-
Linux 서버에서 IPv4 전달을 사용으로 설정 한 후 다음을 발행하십시오.
iptables -t -nat -A POSTROUTING -o eth0 -j MASQUERADE ip route add 172.16.0.0/24 via 10.3.0.2 dev tap0
-
라우터에서 IPv4 전달이 기본적으로 활성화되어 있다고 가정합니다 .
ip route del default ip route add default via 10.3.0.1 dev tap0 iptables -A INPUT -s 10.8.3.0.1 -j ACCEPT
이것의 장점은 Linux 서버에서 단일 레벨의 NAT를 수행 한 다음 라우팅이 모든 것을 처리한다는 것입니다. LAN 클라이언트가 이름으로 Linux 서버를 찾도록하려면 (LS라고 함) 다음 행을 추가하십시오.
10.3.0.2 LS
라우터의 / etc / hosts 파일에 : 이렇게 작은 필요를 위해 DNS 서버를 설정할 필요가 없습니다.
그러나, 이것은 …에 해당 하지 않습니다 . 따라서 공개 IP 주소는 Linux 서버에 속하기 때문에 라우터에 공개 IP 주소가 있습니다 . 누군가 aaa.aaa.aaa.aaa 에 연락하려고 하면 Linux 서버가 응답해야합니다. 당신이 제공 할 수있는 유일한 예외는 포트 전달을 통한 것 입니다. 즉 , 주어진 포트의 모든 통신이 라우터로 전송되지만 모든 포트의 모든 통신을 라우터로 전송할 수는 없습니다 ( 실제로 내 라우터를 의미합니다 … 공개 IP 주소를 갖습니다 ). 물론 Linux 서버가 2 개의 IP 주소를 소유하지 않는 한이 경우 라우터 용으로 예약하고 다른 하나는 Linux 서버용으로 예약 할 수 있습니다.
답변
그냥 알아 냈습니다-너무 간단하고 왜 이전에 그것을 알지 못했는지 모르겠습니다.
라우터에서 내 기본 게이트웨이이기 때문에 NOT 터널 서버 – 라우터는 eth0를의 게이트웨이를 통해 tun0에서 오는 응답 패킷을 시도하고 있습니다. SNAT를 사용하면 소스 주소가 10.3.0.1이됩니다. 라우터는 어디로 다시 보낼 것인지 알고 있으므로 MASQUERADE와 함께 작동합니다.
따라서 라우터에서 새 라우팅 테이블을 만들고 기본 게이트웨이를 tun0으로 설정하십시오. 그런 다음 bbb.bbb.bbb.bbb
해당 테이블에서 소스 IP를 조회하십시오.