
저는 두 개의 공용 웹 서버와 일부 가정용 Ubuntu 시스템을 가지고 있습니다. 저는 MySQL 및 Memcache와 같은 항목을 모니터링하기 위해 특별히 두 개의 도메인을 유지 관리합니다. 이상적으로는 다른 모든 사람의 액세스를 거부하면서 내 집 컴퓨터에서 MySQL, Memcache 등에 연결할 수 있습니다.
따라서 내 iptables는 현재 다음과 같습니다.
ACCEPT tcp -- home ip 0.0.0.0/0 tcp dpt:3306
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT all -- server 1 ip 0.0.0.0/0
ACCEPT all -- server 2 ip 0.0.0.0/0
ACCEPT all -- server 3 ip 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
집에서 모든 것에 액세스할 수 있도록 iptables를 확장하고 싶습니다. 내 집 IP에 모든 포트에 대한 액세스 권한을 부여하는 것보다 내가 원하는 각 포트에 내 집 IP에 대한 라인을 추가하는 것이 아마도 좋은 습관이라고 생각합니다. 하지만 어쩌면 그것은 중요하지 않을 수도 있습니다. 또한 비밀번호 없이 phpMemcachedAdmin과 같은 작업을 실행하고 싶습니다.
그래서 전 세계의 도메인에 대한 액세스를 거부하는 방법에 대해 몇 가지 Google 검색을 실행했습니다. 나는 전 세계의 도메인에 대한 액세스를 거부하는 줄 바로 위에 포트 80에 내 IP를 허용하는 줄을 넣었고 (손가락을 교차) 나를 제외한 모든 사람을 차단해야 한다고 생각합니다.
Google 검색에서 본 게시물에 따르면 -m string "Host: domain.com"
또는 를 통해 도메인을 차단할 수 있다고 나와 있습니다 --string "domain.com"
. 둘 다 작동하지 않는 것 같습니다. 내가 시도한 것은 다음과 같습니다.
sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP
잘못된 인수 'Host:...'로 인해 처음 두 개의 오류가 발생하고 마지막 오류는 알 수 없는 옵션 "--string"으로 인해 발생합니다.
문제를 좀 더 복잡하게 만들기 위해 내 집 IP는 정적이 아닌 동적입니다. 따라서 내가 설정한 DynDNS 도메인을 통해 내 집 IP를 허용하는 기능(필수는 아니지만)이 있으면 좋을 것입니다. iptables를 중지하고 시작하는 스크립트가 있으므로 필요한 경우 언제든지 중지하고 다시 시작하여 IP를 강제로 업데이트할 수 있습니다. (iptables가 시작 시 도메인의 IP만 확인한다는 내용을 여러 곳에서 읽었습니다.)
표준 웹 서버에 대한 iptables 사용에 대한 보안 관련 조언도 환영합니다.
감사해요
-m string
2014 년 3월 17일 추가: 내 iptables 줄에서 구문 오류를 발견했습니다 -m string --string
. . 이제 사람들이 접근하지 못하도록 하고 싶은 도메인을 인식하는 iptables가 있는 것 같습니다. 그러나 문제는 iptables 규칙의 순서가 되었습니다.
내 새 iptables는 다음과 같습니다.
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_for_matching" ALGO name bm TO 65535
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
아이디어는 문자열과 일치하는 DROP 전에 내 IP를 잡는 것입니다. DROP이 첫 번째 줄이면 이를 포착하고 502 오류가 발생합니다. 그러나 iptables가 내가 나열한 것과 같으면 요청이 통과됩니다. 내 집 IP는 아직 규칙 테이블에 없습니다.
작동하는 것은 다음과 같습니다:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
ACCEPT all -- My Home IP 0.0.0.0/0
ACCEPT all -- My Laptop IP 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_to_match" ALGO name bm TO 65535
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
IP 대신 DynDNS 도메인 이름을 사용하여 동적 IP를 포함시킬 수 있었습니다.
아마도 이것이 답이 될 수 있지만 이 문제와 관련하여 모범 사례에 대한 조언을 듣고 싶습니다.