방화벽에서 iptables를 사용하여 NAT를 구성하는 데 문제가 있습니다.
내 방화벽 설정은 다음과 같습니다.
- 내 게이트웨이와 ISP의 게이트웨이 사이에 위치하는 레이어 2 투명 방화벽입니다.
- 두 인터페이스를 모두 br0으로 연결했습니다. 이 두 인터페이스는 ISP 측에서는 eno0이고 로컬 네트워크 측에서는 eno1입니다.
- 기본적으로 NAT 규칙을 제외하고는 iptables 규칙을 설정하지 않았습니다.
내 규칙은 다음과 같습니다.
root@firewall:~# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
root@firewall:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.50.1.0/24 -j SNAT --to-source xxx.195.142.205
root@firewall:~# iptables -t mangle -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
즉, 문제는 주소 변환이 나가는 트래픽에는 작동하지만 응답에는 작동하지 않는다는 것입니다.다음은 테스트 예입니다.
- IP 10.50.1.7인 노트북을 LAN에 연결하고 8.8.8.8로 핑을 보냈습니다.
- 방화벽에서 다음
tcpdump -i eno1
을 사용하여 - 방화벽에서 다음을
tcpdump -i eno0
사용하여 - 노트북에서는 ICMP 응답을 받지 못하는 것 같습니다.
따라서 응답은 로컬 IP로 다시 변환되지 않습니다. 내가 무엇을 놓치고 있나요?
당신의 도움을 주셔서 감사합니다!
(참고: NAT 규칙을 제거하고 내 노트북에서 공용 IP xxx.195.142.205를 사용하면 인터넷에 완전히 액세스할 수 있습니다.)
답변1
@dirkt가 제안했듯이 conntrack은 브리지와 잘 작동하지 않는 것 같습니다. 따라서 원치 않는 iptables 규칙은 브리지에서는 작동하지만 NAT에서는 작동하지 않는 것 같습니다.
방화벽을 레이어 3 방화벽으로 구성했더니 문제가 해결되었습니다.
다른 사람이 관심이 있는 경우를 대비해 NAT와 함께 투명한 레이어 2 방화벽을 사용할 수 있는지 온라인으로 광범위하게 검색했지만 명확한 답변을 얻지 못했습니다.
ebtables 웹사이트이것이 가능하다는 것을 보여줍니다:
bridge-nf 코드를 사용하면 iptables가 브리지된 IP 패킷을 확인하고 투명한 IP NAT를 활성화할 수 있습니다.
나는 그것을 작동시키는 ebtables 명령을 찾지 못했습니다.