Linux nat/iptables는 피어 링크 체인을 구성합니다.

Linux nat/iptables는 피어 링크 체인을 구성합니다.

4대의 Linux(CentOS) 머신을 사용하여 실험적인 설정을 했습니다.

https://i.stack.imgur.com/HLs9f.png

4개 시스템 모두 내부 연결에 서로 다른 네트워크를 사용하며 서로의 직접 연결을 ping할 수 있습니다. 하지만 PC4만이 인터넷에 접속할 수 있습니다.

PC1이 PC4를 통해 인터넷에 액세스할 수 있도록 iptables 규칙을 설정하려고 하는데 어떻게 해야 할지 모르겠습니다.

PC2, PC3 및 PC4의 발신 인터페이스에 NAT를 추가해 보았습니다.

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

그러나 이것이 작동하지 않습니다. 몇 가지 아이디어를 주실 수 있습니까? 이와 같은 설정에서 PC1이 10.0.0.1 네트워크에 액세스하도록 하려면 어떻게 해야 합니까?

답변1

먼저, 각 PC는 다음 PC를 내부 파이프의 게이트웨이로 사용해야 합니다.

PC1# ip route add default via 1.1.1.2 # PC2's address where it can join PC1
PC2# ip route add default via 2.1.1.2 # PC3's address where it can join PC2
PC3# ip route add default via 3.1.1.2 # PC4's address where it can join PC3

그리고 이것이 기본 경로이기 때문에 이제 모든 PC가 다음 PC에 연결할 수 있음을 의미합니다. 따라서 이제 모든 PC는 이론적으로 rp_filter¹활성화되지 않은 경우 다음 PC와 인터넷으로 패킷을 보낼 수 있습니다. 그러나 반환 경로는 없습니다.

이를 위해서는 각 PC가 직접 연결되지 않은 모든 이전 PC에 액세스할 수 있어야 합니다.

PC1에는 이전 것이 없으므로 문제가 없습니다. PC2는 PC1에 직접 연결되어 있으므로 여전히 문제가 없습니다. PC3의 경우 PC2를 통해 PC1로 라우팅해야 합니다.

PC3# ip route add 1.1.1.1/? via 2.1.1.1 # PC1's network via PC2
# Fill the '?' according to PC1's network mask. it should include 1.1.1.2.

이제 PC3과 PC1이 서로 핑을 보낼 수 있습니다. 그렇지 않은 경우 PC2에 전달이 활성화되어 있는지 확인하십시오(두 인터페이스 모두에 대해 sysctl -w net.ipv4.eth?.forwarding=1). 이 옵션은 쓸모가 없으므로 PC1을 제외한 모든 PC에 이 옵션이 설정되어 있는지 확인하십시오.

이제 PC4에는 PC3을 거쳐 PC2와 PC1로 가는 경로가 필요합니다.

PC4# ip route add 1.1.1.1/? via 3.1.1.1 # PC1's network via PC3
PC4# ip route add 2.1.1.1/? via 3.1.1.1 # PC2's network via PC3

이제 모든 PC가 서로 핑을 보낼 수 있습니다. 그렇지 않은 경우 설정을 다시 확인하고 전달이 활성화되어 있는지 확인하세요.

이제 인터넷 연결이 잘 될 것입니다. PC4에서 인터넷에 액세스하기 위해 NAT가 필요한 경우 라우팅 테이블을 수정하지 않고 PC4에서 NAT를 구성합니다.

1은 rp_filter일반적으로 유용한 옵션이지만 테스트를 더욱 복잡하게 만듭니다. 즉, 패킷을 수락하기 전에 역방향 경로가 올바른지 확인합니다. ip 1.1.1.1의 패킷이 eth0에서 수신되면 1.1.1.1이 eth0을 통해 라우팅되는지 확인합니다. 그렇지 않은 경우에는 패킷을 거부합니다. 따라서 rp_filter부분적으로 구성된 설정은 허용되지 않지만 일단 설정이 완료되면 rp_filter활성화되어 제대로 작동합니다. rp_filter일부 Linux 배포판에서는 보안 조치로 기본적으로 활성화되어 있습니다.

관련 정보