"LAN" 브리지(vmbr1)와 "WAN" 브리지(vmbr0)가 있는 가상화 호스트에 두 개의 컨테이너가 있습니다.
가상화 호스트는 vmbr0 브리지의 공용 IP로 구성됩니다(가상 123.123.123.123으로 가정).
이 가상화 호스트에는 두 개의 컨테이너가 있습니다.
- 네트워크 컨테이너(10.1.0.210/24)
- 데이터베이스 컨테이너(10.1.0.250/24)
웹 컨테이너는 mysql 데이터베이스를 사용합니다. 10.1.0.250:3306으로 접속하도록 구성되어 있습니다.
mysql에는 웹 호스트(10.1.0.210)의 연결만 허용하는 웹 애플리케이션 사용자가 있습니다.
NAT 규칙(WAN으로부터의 연결을 허용해야 함)을 추가하기 전까지는 모든 것이 잘 작동했습니다. 이것은 내 /etc/network/interfaces vmbr1(LAN) 구성에서 가져온 것입니다.
# there is no need to add -m multiport here, these rules are from my "template"
# post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m multiport --dport 3306 -j DNAT --to-destination 10.5.0.250
# post-up iptables -t nat -A POSTROUTING -o vmbr1 -p tcp -m multiport --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1
# pre-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp -m multiport --dport 3306 -j DNAT --to-destination 10.5.0.250
# pre-down iptables -t nat -D POSTROUTING -o vmbr1 -p tcp -m multiport --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1
문제는 iptables에 다음 규칙을 추가할 때입니다.
iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m multiport --dport 3306 -j DNAT --to-destination 10.5.0.250
iptables -t nat -A POSTROUTING -o vmbr1 -p tcp -m multiport --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1
웹 애플리케이션이 연결을 시도할 때 mysql에서 로그인 오류가 발생하여 웹 애플리케이션이 작동을 멈췄습니다. mysql 관점에서 연결은 실제 10.1.0.210(mysql 사용자)이 아닌 10.1.0.1 주소(LAN 측 게이트웨이)에서 이루어집니다.[이메일 보호됨]연결이 허용되지만 사용자는[이메일 보호됨]허용되지 않음).
이는 이제 포트 3306에 대한 모든 연결이 NAT를 통과하고 NAT가 10.1.0.210을 10.1.0.1로 변환하기 때문인 것 같습니다.
이 문제를 어떻게 해결할 수 있나요?
아마도 이러한 nat 규칙을 "좁혀" WAN에서만 연결이 이루어질 때만 작동하도록 해야 할 것입니다. 그러나 프로덕션 서버에서 이를 망칠 만큼 네트워킹 및 iptables에 대해 충분히 알지 못합니다.
답변1
추가한 NAT 규칙으로 인해 웹 컨테이너 연결의 소스 IP 주소가 웹 컨테이너의 IP 주소 대신 LAN 측 게이트웨이(10.1.0.1)의 IP 주소로 변경되는 것이 문제인 것 같습니다. 실제 IP 주소(10.1.0.210). 이로 인해 MySQL 서버는 연결이 허용되지 않는 IP 주소에서 왔기 때문에 연결을 거부하게 됩니다.
이 문제를 해결하는 한 가지 방법은 들어오는 연결의 소스 IP 주소를 확인하고 연결이 WAN에서 오는 경우에만 DNAT 및 SNAT 규칙을 적용하는 DNAT 및 SNAT 규칙 앞에 추가 iptables 규칙을 추가하는 것입니다. "-s" 옵션을 사용하여 소스 IP 주소를 지정하고 "-j" 옵션을 사용하여 규칙 대상(이 경우 DNAT 및 SNAT 규칙)을 지정할 수 있습니다.
또 다른 해결 방법은 데이터베이스 컨테이너의 내부 IP 주소가 아닌 가상화 호스트의 공용 IP 주소를 통해 MySQL 서버에 연결하도록 웹 컨테이너를 구성하는 것입니다. 이렇게 하면 NAT 규칙이 연결에 영향을 주지 않습니다.
또한 mysql에 바인드 주소를 10.1.0.250 대신 0.0.0.0으로 설정하여 모든 인터페이스를 수신하고 NAT 규칙의 영향을 받지 않도록 하는 옵션이 있는지 확인할 수도 있습니다.