내 iptables 스크립트에서 가능한 한 세밀하게 규칙을 작성하는 실험을 해왔습니다. 나는 어느 사용자가 어떤 서비스를 사용할 수 있는지, 부분적으로 보안을 위해 그리고 부분적으로는 학습 연습으로 제한합니다.
3.6.2 커널을 실행하는 데비안 6.0.6에서 iptables v1.4.16.2 사용.
그러나 아직 이해하지 못하는 문제가 발생했습니다 ...
모든 사용자를위한 발신 포트
이것은 완벽하게 작동합니다. 일반적인 상태 추적 규칙이 없습니다.
## 발신 포트 81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate NEW, 설립 됨 -j 수락 $ IPTABLES -A 입력 -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate 설정 -j 수락
사용자가 일치하는 발신 포트
## 사용자 계정의 발신 포트 80 $ IPTABLES -A OUTPUT-소유자 일치 --uid- 소유자 사용자 계정 -p tcp --dport 80 -m conntrack --ctstate NEW, ESTABLISHED --sport 1024 : 65535 -j ACCEPT $ IPTABLES -A 입력 -p tcp --sport 80 --dport 1024 : 65535 -d $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
이렇게하면 "useraccount"계정에 대해서만 포트 80을 사용할 수 있지만 TCP 트래픽에 대해서는 이와 같은 규칙에 문제가 있습니다.
## 기본 발신 로그 + 차단 규칙 $ IPTABLES -A OUTPUT -j LOG --log-prefix "BAD OUTGOING"--log-ip-options --log-tcp-options --log-uid $ IPTABLES -A 출력 -j DROP
문제
위의 작업에서 사용자 "useraccount"는 파일을 완벽하게 얻을 수 있습니다. 시스템의 다른 사용자는 포트 80에 나가는 연결을 만들 수 없습니다.
useraccount @ host : $ wget http://cachefly.cachefly.net/10mb.test
그러나 위의 wget은 x7이 내 syslog에서 항목을 삭제 한 상태로 둡니다.
10 월 18 일 02:00:35 xxxx 커널 : BAD OUTGOING IN = OUT = eth0 SRC = xx.xx.xx.xx DST = 205.234.175.175 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP SPT = 37792 DPT = 80 서열 = 164520678 ACK = 3997126942 창 = 979 RES = 0x00 ACK URGP = 0
UDP 트래픽과 유사한 규칙에 대해서는 이러한 하락을 얻지 못합니다. DNS 요청을 할 수있는 사용자를 제한하는 규칙이 이미 있습니다.
나가는 발신 ACK 패킷은 루트 계정 (URGP = 0)에서 오는 것으로 이해하지 못합니다. 사용자 계정을 루트로 바꾼 경우에도 마찬가지입니다.
conntrack이 3 방향 핸드 셰이크의 3 단계 후에 연결 추적을 시작하기 때문에 ACK 패킷이 새 패킷으로 분류된다고 생각하지만 그 이유는 무엇입니까?
이 방울들을 안전하게 무시할 수 있습니까?
편집하다
그래서 나는 종종 다음과 같은 규칙을 보았습니다.
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state NEW, ESTABLISHED -j ACCEPT $ IPTABLES -A 입력 -p tcp -m tcp --sport 80 -d $ MYIP -m state --state 설정 -j 수락
상태 일치가 더 이상 사용되지 않으므로 "-m state --state"를 "-m conntrack --ctstate"로 바꿨습니다.
일반적인 상태 추적 규칙을 사용하는 것이 가장 좋은 방법입니까? 위의 규칙이 올바른 것으로 간주되지 않습니까?
발신 사용자 연결을 엄격하게 제어하려면 이와 같은 것이 더 좋을까요?
$ IPTABLES-입력 -m conntrack --ctstate 설정 -j 수락 $ IPTABLES-출력 -m conntrack --ctstate 설립 -j 수락 $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m 소유자 --uid-owner useraccount -j ACCEPT $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m 소유자 --uid-owner otheraccount -j ACCEPT