2012-04-07 3 views
0

우리는 지난 며칠 동안 우리의 응용 프로그램 서버와 데이터베이스 서버 (Mysql) 사이에 이상한 문제가 발생했습니다 : 응용 프로그램 서버의 데이터베이스 서버에 대한 연결이 SYN_SENT 상태에서 중단되고 그 이후에 우리는 mysql 포트 (3306)에있는 데이터베이스 서버에 대한 모든 연결. 우리가 데이터베이스 서버의 netstat 출력을 SYN_RECV 상태로 확인할 때.SYN_SENT의 mysql 서버에 연결

내가 알 수있는 것은 mysql 서버가 SYN 요청을 수신하고 응답하고 클라이언트에 도달하지 못해서 서버 측의 SYN_RECV와 클라이언트 측의 SYN_SENT입니다. 나는 SYN_SENT 상태가 약간의 시간 후에 가야한다고 생각하고, 같은 서버에 대한이 다른 db 연결 시도가 멈추지 않아야하기 때문에.

누구든지이 문제를 어떻게 해결할 수 있습니까?

설정 세부 정보 : 응용 프로그램 서버 : RHEL 5.4, 커널 릴리스 = 2.6.18-164.el5, x86_64 데이터베이스 서버 : MySQL 버전 : 5.1.49 RHEL 5.4, kernel-release = 2.6.18-164.el5 단지 로컬 호스트 액세스 서버에 대한 x86_64에

답변

0

수정 : my.cnf 파일에 바인드 주소 설정 127.0.0.1 원격 IP의 에 연결하기위한

수정은

iptables -A INPUT -p tcp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT 
iptables -A INPUT -p udp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT 
iptables -A INPUT -p tcp --dport 3306 -j DROP 
iptables -A INPUT -p udp --dport 3306 -j DROP 
(REMOTE_IP 원격 IP로 대체)

또한 다음을 설정해야합니다. my.cnf의 ip를 0.0.0.0의 두 번째 규칙에 바인딩하면됩니다.) (udp 부분)

개념 증명 : 먼저 원격 연결에서 대상에 대한 연결을 허용합니다 -d 127.0.0.1 = localhost를) -p TCP/UDP = protocoll의 TCP 또는 UDP

이 당신이 포트/UDP 연결을 TCP에 대한 모든 요청을 드롭하는 규칙을 만들 필요가 규칙 후 3306

이것이 작동하는 이유는 무엇입니까? iptables가 실행되고 있기 때문에 "숫자"입니다. 항상 규칙 1 개.

당신은 명령 규칙을 볼 수

iptables -L INPUT -n --line-numbers 

당신이 그것을하지 않습니다 모든 연결이 다음의 IP XXXX에서 드롭 이후의 모든 연결을 허용하고 말한다면 있도록 표시되는 첫 번째 규칙은 첫 번째 규칙입니다 작업. 이 IP의 모든 연결을 삭제하려면 첫 번째 규칙을 선택해야하며 이후에는 모든 연결을 허용해야합니다. (그것은 나쁜 예입니다 ..)

당신이 규칙을 표시하고 규칙 앞에 숫자를 가지고 명령과 규칙을 드롭 할 수있는 항목이 실패 할 경우 :

iptables -D INPUT <<number here>>