밤을 제외하고 하루 종일 Facebook을 차단하고 싶습니다. Linux 기반 라우터 OpenWRT에 구현하고 싶습니다. 수정해야 할 아카이브는 /etc/firewall.user(또는 적어도 내 생각에는 그렇게 생각함)이고 추가해야 할 명령은 다음과 같습니다.
iptables RULE -m time --timestart TIME --timestop TIME --days DAYS -j ACTION
규칙은 Facebook이나 기타 웹사이트를 차단하는 데 사용하는 일반 규칙과 유사해야 합니다.
iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -j REJECT
하지만 어떤 이유에서인지 여전히 Facebook에 액세스할 수 있습니다. 어떤 아이디어가 있나요? 제가 몇몇 명령어를 잘못 썼나요? 내가 추가한 코드는 다음과 같습니다.
iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -m time --timestart 1:00 --timestop 20:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j REJECT
그리고 그것은 작동하지 않습니다 ...
일반적으로 웹사이트를 차단하기 위해 OpenDNS를 사용하지만, 이를 사용하면 하루 중 특정 시간에 사람들이 Facebook에 액세스하는 것을 허용할 수 없으므로 이를 사용하는 것은 좋은 선택이 아닙니다. 어떤 조언이라도 정말 감사하겠습니다. 제 질문을 읽어주셔서 미리 감사드립니다.
답변1
time
아마도 iptables 모듈을 사용할 때 날짜와 시간이 UTC 형식으로 제공된다고 가정 하는 로컬 시계와 커널을 사용하려고 할 것입니다 .
내 iptables
매뉴얼 페이지를 인용하면 다음과 같습니다 -m time
.
time
This matches if the packet arrival time/date is within a given range.
All options are optional, but are ANDed when specified. All times are
interpreted as UTC by default.
답변2
crontab을 사용하여 실행될 일부 .sh 스크립트를 만들 수 있습니다. 크론탭에서:
00 9 * * * /somedir/blockfun.sh
00 18 * * * /somedir/unblockfun.sh
다음과 같이 blockfun.sh에 추가하거나
iptables -A INPUT -m string --string "facebook.com" --algo kmp --to 65535 -j DROP
URL을 차단하려는 방법을 추가합니다.
물론 unblock.sh에서 이 규칙을 제거하세요.
답변3
내 생각엔 당신이 말하는 것 같아요이것그리고저것실제로 Facebook을 차단할 때 문제가 발생합니다.
거기에서 논의되지 않은 두 가지 사항이 있습니다.
Facebook으로 전송된 모든 패킷에 문자열이 포함되어 있을 가능성은 거의 없습니다
www.facebook.com
. 연결된 질문에는facebook.com
문자열만 사용됩니다 . 이것이 가장 강력한 방법은 아니지만 공개적으로 허용되는 Facebook 차단 방법인 것 같으니 그렇게 하셔도 됩니다.규칙에 의해 차단되지 않은 도메인 이름을 확인한 후에도 컴퓨터는 계속해서 Facebook에 대한 TCP 연결을 엽니다. TCP 핸드셰이크에는 이 문자열이 포함되어 있지 않으므로
www.facebook.com
규칙이 이를 방지하지 않습니다. 결국 트래픽은-m state --state related,established -j ACCEPT
귀하가 갖고 있을 가능성이 가장 높은 특정 규칙에 의해서만 허용됩니다.아래 스크린샷은 내 (기본) OpenWRT 필터 테이블을 보여줍니다. 여기에서 모든 체인에 대해 두 번째 규칙이 언급된 것을 명확하게 볼 수 있습니다
related,established
. 성공적인 TCP 핸드셰이크와 결합하면 Facebook에서 들어오고 나가는 데이터 트래픽에 대해 규칙이 평가되지 않습니다.이 generic 앞에 규칙을 삽입해야 합니다
-j ACCEPT
.
답변4
귀하의 예와 인터넷 검색을 바탕으로 이것이 나에게 도움이 되었습니다.
for website in facebook.com youtube.com; do
iptables -I FORWARD -p tcp --dport 80 -m string --string "$website" --algo bm -m time --timestart 00:00 --timestop 17:30 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website" --algo bm -m time --timestart 00:00 --timestop 17:30 -j REJECT
iptables -I FORWARD -p tcp --dport 80 -m string --string "$website" --algo bm -m time --timestart 18:30 --timestop 23:59 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website" --algo bm -m time --timestart 18:30 --timestop 23:59 -j REJECT
done
@Delfin의 제안에는 몇 가지 문제가 있습니다.
일부 iptables 모듈이 내 openwrt에 설치되지 않았습니다.
opkg 업데이트; opkg 설치 iptables-mod-filter
*nat 대신 *filter를 사용하십시오. 그렇지 않으면 다음과 같이 불평할 것입니다. (규칙을 *filter에 직접 넣으려면 -t nat를 생략하십시오.)
The "nat" table is not intended for filtering, the use of DROP is therefore inhibited
- INPUT 큐 대신 FORWARD를 사용하세요.