LAN 어댑터를 통해 두 번째 mysql 서버에 연결하는 클라이언트 역할을 하는 첫 번째 서버에 이 iptables 규칙이 있습니다.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:44135]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Feb 4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb 4 20:33:41 2015
*nat
:PREROUTING ACCEPT [76:10856]
:POSTROUTING ACCEPT [11:734]
:OUTPUT ACCEPT [11:734]
COMMIT
# Completed on Wed Feb 4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb 4 20:33:41 2015
*mangle
:PREROUTING ACCEPT [2739:2511918]
:INPUT ACCEPT [2739:2511918]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1913:165876]
:POSTROUTING ACCEPT [1913:165876]
COMMIT
내가 하자마자 무슨 일이 일어나고 있는 걸까?
service iptables restart
두 번째 서버에 대한 모든 MYSQL 연결은 올바르게 작동하는 것으로 보이지만 짧은 시간(보통 1-2분) 동안만 작동하지만 이 1-2분 동안 nginx(웹 서버, 80 포트)에 대한 연결이 작동하지 않습니다. 1~2분 정도 지나면 웹서버는 작동하고 MYSQL은 작동하지 않는 현상이 발생합니다. 지금까지 iptables-save 명령을 시도했지만 아무것도 변경되지 않았습니다.
이것은 두 번째 mysql 서버의 방화벽 구성입니다.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2785:425650]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
답변1
DROP
마지막 포괄 규칙이 실수로 제거된 경우를 대비하여 기본 정책을 로 설정해야 합니다 . 이와 같이 :
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:44135]
이제 두 번째 서버에서.
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
이 규칙은 대상이 192.168.1.1, 소스 포트가 1024~65535, 대상 포트가 3306이고 상태가 신규 또는 설정인 연결과 일치합니다. 당신은 이것을 지나치게 생각하고 있습니다. MySQL 연결을 허용하려면 대상 포트를 일치시키고 특정 소스 IP 또는 인터페이스에 고정하려면 선택적으로 소스 및/또는 인터페이스 매개변수를 추가하면 됩니다.
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
lo
-A INPUT -i lo -j ACCEPT
첫 번째 규칙은 루프백에서 오는 모든 항목과 일치하므로 이미 액세스 권한이 있습니다 .
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
좋습니다. 이제 전체 서브넷을 허용하게 되었지만 이미 더 좋아졌고 제대로 작동할 것입니다.
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
위와 마찬가지로 루프백은 이미 허용됩니다.
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
이제 대상 포트가 3306인 eth1에서 오는 모든 것을 허용하게 됩니다.
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
귀하의 OUTPUT 정책은 어쨌든 모든 것을 허용하므로 해당 규칙은 의미가 없습니다.
나는 당신의 문제가 다음과 같은 것이라고 확신합니다.상태 모듈은 더 이상 사용되지 않습니다.제거될 수도 있으므로 conntrack을 사용해야 합니다.
요약 :
첫 번째 서버:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
두 번째 서버:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
이렇게 하면 eth1, 192.168.1.0/24에서 시작되는 모든 SSH 연결과 MySQL 연결이 허용됩니다. 자유롭게 변경해 보세요.