OpenWRT에서 Iptables를 사용하여 요일 및 시간별로 웹사이트를 차단하세요.

OpenWRT에서 Iptables를 사용하여 요일 및 시간별로 웹사이트를 차단하세요.

밤을 제외하고 하루 종일 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 DROPURL을 차단하려는 방법을 추가합니다.

물론 unblock.sh에서 이 규칙을 제거하세요.

답변3

내 생각엔 당신이 말하는 것 같아요이것그리고저것실제로 Facebook을 차단할 때 문제가 발생합니다.

거기에서 논의되지 않은 두 가지 사항이 있습니다.

  1. Facebook으로 전송된 모든 패킷에 문자열이 포함되어 있을 가능성은 거의 없습니다 www.facebook.com. 연결된 질문에는 facebook.com문자열만 사용됩니다 . 이것이 가장 강력한 방법은 아니지만 공개적으로 허용되는 Facebook 차단 방법인 것 같으니 그렇게 하셔도 됩니다.

  2. 규칙에 의해 차단되지 않은 도메인 이름을 확인한 후에도 컴퓨터는 계속해서 Facebook에 대한 TCP 연결을 엽니다. TCP 핸드셰이크에는 이 문자열이 포함되어 있지 않으므로 www.facebook.com규칙이 이를 방지하지 않습니다. 결국 트래픽은 -m state --state related,established -j ACCEPT귀하가 갖고 있을 가능성이 가장 높은 특정 규칙에 의해서만 허용됩니다.

    아래 스크린샷은 내 (기본) OpenWRT 필터 테이블을 보여줍니다. 여기에서 모든 체인에 대해 두 번째 규칙이 언급된 것을 명확하게 볼 수 있습니다 related,established. 성공적인 TCP 핸드셰이크와 결합하면 Facebook에서 들어오고 나가는 데이터 트래픽에 대해 규칙이 평가되지 않습니다.

    이 generic 앞에 규칙을 삽입해야 합니다 -j ACCEPT.

    필터 테이블을 위한 OpenWRT INPUT, FORWARD 및 OUTPUT 체인

답변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를 사용하세요.

관련 정보