ロックの透過的なバイパスを使用してインターネットゲートウェイを設定します(広告をブロックします)





2枚のネットワークカードを搭載した古い(またはそうではない)コンピューターをお持ちですか? あなたはロックをバイパスするための広告と余分な体の動きにうんざりしていませんか? これに我慢したくない? それから猫にようこそ。



目的



追加設定なしでローカルネットワーク内のクライアントが制限なしにインターネットで動作するように、インターネットゲートウェイを構成します。 ブロックされたサイトへのアクセスはtorを介して行われ、残りは通常のインターネット接続を介して行われます。 通常のサイトについては、ブラウザから.onionリソースにアクセスします。 ボーナスとして、トーラス(ロシア連邦のユーザーの機能を制限するサイト)を介して、広告ドメインのブロックと条件付きでブロックされたサイトへのアクセスを設定します。 私のインターネットプロバイダーは、 あなたがしゃっくり 、DNSクエリを傍受し、アドレスを偽装します(つまり、禁止サイトを解決するときに、そのスタブのアドレスを返します)。そのため、すべてのDNSクエリをトーラスに送信します。



警告
以下で説明することはすべて、ロックのバイパスに役立ちますが、匿名性は提供しません。 すべての言葉から。



アイデアと実装方法はここここから取っ 。 これらの記事の著者に感謝します。



行きましょう



初期段階では、2つのネットワークインターフェイスを備えたコンピューターにOS(私の場合はUbuntuサーバー16.04)が既にインストールされていると想定されています。 そのうちの1つ(私にとってはppp0)はプロバイダーに向かっており、2番目(私にとってはenp7s0)はLANに向かっています。 ゲートウェイの内部IPは192.168.1.2です。 LAN 192.168.1.0/24。



ネットワーク上には十分な情報があるため、この記事ではこの段階へのアプローチ方法については考慮していません。 pppoeconfユーティリティを使用してプロバイダへのpppoe接続を設定するのが便利だとしか言えません。



準備段階



私のように、n {e | oy} tbukを使用する場合、おそらく蓋を閉じたときに眠らないようにしたいでしょう。



sudo nano /etc/systemd/logind.conf
      
      





 HandleLidSwitch=ignore
      
      





カーネルでの転送を許可します。 IPv6を無効にしました。



 sudo nano /etc/sysctl.conf
      
      





 net.ipv4.ip_forward=1 # IPv6 disabled net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
      
      





再起動せずに変更を適用します。



 sudo sysctl -p
      
      





DHCPセットアップ



クライアントが自分で自動的に構成するようにしたいので、DHCPサーバーなしではできません。



 $ sudo apt install isc-dhcp-server $ sudo nano /etc/dhcp/dhcpd.conf
      
      





ファイルをほぼこの形式にします。

 default-lease-time 600; max-lease-time 7200; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; option routers 192.168.1.2; option domain-name-servers 192.168.1.2, 8.8.8.8; option broadcast-address 192.168.1.255; }
      
      





説明
subnet 192.168.1.0 netmask 255.255.255.0-ネットワークとマスクを定義し、

範囲192.168.1.100 192.168.1.200; -サーバーによって発行されるアドレスの範囲、

オプションルーター192.168.1.2; -ゲートウェイアドレス

option domain-name-servers 192.168.1.2、8.8.8.8; -DNSサーバーアドレス

option broadcast-address 192.168.1.255; -ブロードキャストアドレス。



サーバーを再起動します



 sudo /etc/init.d/isc-dhcp-server restart
      
      





TOR設定



設定をインストールして開きます。



 $ sudo apt install tor $ sudo nano /etc/tor/torrc
      
      





行を追加

 #        onion #   .   . VirtualAddrNetworkIPv4 10.0.0.0/8 # DNS   AutomapHostsOnResolve 1 #     DNS TransPort 0.0.0.0:9040 DNSPort 0.0.0.0:5353 #       ExcludeExitNodes {RU}, {UA}, {BY}
      
      





DNSセットアップ



広告のブロックが不要な場合、この項目は省略できます。 トーラスのDNSのみを使用する場合は、 DNSPort 0.0.0.0:53行を/ etc / tor / torrcファイルに追加します。



しかし、広告をカットします。つまり、設定を開いて設定します



 $ sudo apt install bind9 $ sudo nano /etc/bind/named.conf.options
      
      





ファイルを次のフォームに持ち込みます

 options { directory "/var/cache/bind"; forwarders { 127.0.0.1 port 5353; }; listen-on { 192.168.1.2; 127.0.0.1; }; dnssec-validation auto; auth-nxdomain no; listen-on-v6 { none; }; };
      
      





プロバイダーがDNSクエリを使用しない場合、他のDNSサーバーにトラフィックを誘導できます。 たとえば、Googleサーバーの場合:

 forwarders { 8.8.8.8; 8.8.4.4; };
      
      





理論的には、トーラスよりも速く動作するはずです。

少し後で、さらにDNS構成に戻ります。 今のところこれで十分です。 サービスを再起動します。



 sudo /etc/init.d/bind9 restart
      
      





iptablesのセットアップ



すべての魔法はここで作成されます。



アイデアの本質
  1. トーラスを通過するIPアドレスのリストを作成します。
  2. これらのアドレスへのリクエストを透過プロキシトーラスでラップします。
  3. DNSトーラス上の.onionリソースにDNSクエリをラップします
  4. .onionゾーンから名前を解決する場合、トーラスは10.0.0.0/8サブネット(TOPのセットアップ時に指定した)からIPアドレスを返します。 もちろん、このゾーンはインターネット上でルーティングされないため、このサブネットへの呼び出しを透過プロキシトーラスでラップする必要があります。




叙情的な余談
最初は、DNSクエリをiptablesの.onionにリダイレクトせずにできると思っていました。 要求をDNSトーラスにリダイレクトし、10番目のゾーンからアドレスを返すようにバインドを構成することが可能です。 このように設定できませんでした



 forwarders { 127.0.0.1 port 5353; };
      
      





127.0.0.1ポート5353上のフォワーダーとの別個のゾーン.onionの割り当てだけでなく、望ましい結果にもつながりません。

誰かがこれがなぜ起こるか、そしてそれを修正する方法を知っているなら、コメントに書いてください。



iptablesは既にインストールされていると思います。 ipsetをインストールします。 このユーティリティを使用して、ブロックされたアドレスのリストを管理し、透過プロキシトーラスでパケットをラップできます。



 sudo apt install ipset
      
      





次に、ルートの下から順にiptables設定コマンドを実行します。 もちろん、インターフェイス名とアドレスを独自のものに置き換える必要があります。 これらのコマンドは、 exit 0の前に/etc/rc.localに配置し、ロード後に毎回実行されます。



同じことをお勧めします。
 # ipset    ipset -exist create blacklist hash:ip #  DNS  TOR   onion.  bind9      iptables -t nat -A PREROUTING -p udp --dport 53 -m string --hex-string "|056f6e696f6e00|" --algo bm -j REDIRECT --to-port 5353 iptables -t nat -A OUTPUT -p udp --dport 53 -m string --hex-string "|056f6e696f6e00|" --algo bm -j REDIRECT --to-port 5353 #   IP     iptables -t nat -A PREROUTING -p tcp -m set --match-set blacklist dst -j REDIRECT --to-port 9040 iptables -t nat -A OUTPUT -p tcp -m set --match-set blacklist dst -j REDIRECT --to-port 9040 #         10.0.0.0/8 #  .onion iptables -t nat -A PREROUTING -p tcp -d 10.0.0.0/8 -j REDIRECT --to-port 9040 iptables -t nat -A OUTPUT -p tcp -d 10.0.0.0/8 -j REDIRECT --to-port 9040 ########################################### #       ,     # ########################################### # NAT iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE #   iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT #    iptables -A INPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP #    iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP #   syn-flood  iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP #      ,      iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i enp7s0 -j ACCEPT iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #   iptables -P INPUT DROP #   . iptables -A FORWARD -i enp7s0 -j ACCEPT iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #   iptables -P FORWARD DROP
      
      







再起動後、次のようなゲートウェイを取得する必要があります。





ブラックリストを作成してルーティングを構成したにもかかわらず、ブラックリスト自体はまだ空であるため、ロックのバイパスはまだありません。 それを修正する時が来ました。

ブラックリストに記入する



スクリプトが置かれるディレクトリを作成します。



 # mkdir -p /var/local/blacklist
      
      





スクリプトを作成する



 # nano /var/local/blacklist/blacklist-update.sh
      
      





次の内容で
 #! /bin/bash #    cd $(dirname $0) #  github      git pull -q || git clone https://github.com/zapret-info/zi.git . # dump.csv     blacklist.txt  IP    cat dump.csv | cut -f1 -d\; | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort | uniq > blacklist.txt #  my-blacklist c  ,     #       .  blacklist.txt dig +short -f my-blacklist >> blacklist.txt # ipset ipset flush blacklist #c   cat blacklist.txt | xargs -n1 ipset add blacklist
      
      







スクリプトを実行可能にする

 # chmod +x /var/local/blacklist/blacklist-update.sh
      
      





my-blacklistファイルを作成します。これは、将来、トーラスを通過するリソースを手動で入力します。

 # echo lostfilm.tv > /var/local/blacklist/my-blacklist
      
      





スクリプトを実行します

 # /var/local/blacklist/blacklist-update.sh
      
      





スクリプトは長い間機能します。忍耐強くてください。 これで、 フライバストが開き、ブロックされたサイトが機能するはずです。 /etc/rc.localをファイルの末尾に追加しますが、 終了0の前に追加します

 #     , , #  DNS sleep 60 #   .  . /var/local/blacklist/blacklist-update.sh
      
      





広告フィルターをカスタマイズする



アイデアの本質
  1. マイクロHTTPサーバーをインストールして起動します。このサーバーは、ポート80をリッスンし、1つの透明ピクセルを含むpng画像をリクエストに返します。
  2. 広告ドメインのリストを取得します。
  3. バインドを権限のあるサーバーとして構成します。
  4. HTTPサーバー上の広告ドメインに対するすべてのリクエストを素晴らしい画像でラップします。




始めましょう。 北に行こう。 ファイルを作成する



 # nano /usr/local/bin/pixelserv
      
      





コンテンツ付き
 #! /usr/bin/perl -Tw use IO::Socket::INET; $crlf="\015\012"; $pixel=pack("C*",qw(71 73 70 56 57 97 1 0 1 0 128 0 0 255 255 255 0 0 0 33 249 4 1 0 0 0 0 44 0 0 0 0 1 0 1 0 0 2 2 68 1 0 59)); $sock = new IO::Socket::INET ( LocalHost => '0.0.0.0', LocalPort => '80', Proto => 'tcp', Listen => 30, Reuse => 1); if (!defined($sock)) { print "error : cannot bind : $! exit\n"; exit(1); } while ($new_sock = $sock->accept()) { while (<$new_sock>) { chop;chop; # print "$_\n"; if ($_ eq '') { last; } } print $new_sock "HTTP/1.1 200 OK$crlf"; print $new_sock "Content-type: image/gif$crlf"; print $new_sock "Accept-ranges: bytes$crlf"; print $new_sock "Content-length: 43$crlf$crlf"; print $new_sock $pixel; shutdown($new_sock,2); undef($new_sock); } close($sock); exit(0);
      
      







実行可能にする



 # chmod +x /usr/local/bin/pixelserv
      
      





サーバー初期化ファイルを作成する



 # nano /etc/init.d/pixelserv
      
      





コンテンツ付き
 #! /bin/sh # /etc/init.d/pixelserv # # Carry out specific functions when asked to by the system case "$1" in start) echo "Starting pixelserv " /usr/local/bin/pixelserv & ;; stop) echo "Stopping script pixelserv" killall pixelserv ;; *) echo "Usage: /etc/init.d/pixelserv {start|stop}" exit 1 ;; esac exit 0
      
      







実行可能にし、サービスを登録し、httpサーバーを実行します



 # chmod +x /etc/init.d/pixelserv # update-rc.d pixelserv defaults # /etc/init.d/pixelserv start
      
      





広告ドメインを更新するためのスクリプトを作成します



 # nano var/local/blacklist/ad-update.sh
      
      





コンテンツ付き



 #! /bin/bash cd /etc/bind/ curl "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=bindconfig&showintro=0&mimetype=plaintext" | sed 's/null.zone.file/\/etc\/bind\/db.adzone/g' > named.ad.conf rndc reload
      
      





実行可能にします



 # chmod +x /var/local/blacklist/ad-update.sh
      
      





そして実行する



 # /var/local/blacklist/ad-update.sh
      
      





ゾーンファイルを作成する



 # nano /etc/bind/db.adzone
      
      





次の内容で



 $TTL 86400 ; one day @ IN SOA ads.example.com. hostmaster.example.com. ( 2014090102 28800 7200 864000 86400 ) NS my.dns.server.org A 192.168.1.2 @ IN A 192.168.1.2 * IN A 192.168.1.2
      
      





ファイルに追加



 # nano /etc/bind/named.conf
      
      









 include "/etc/bind/named.ad.conf";
      
      





変更を適用



 rndc reload
      
      





起動時にドメインのリストを更新するように構成します。 これを行うには、ファイル/etc/rc.localを開き、スリープ後に追加します60



 /var/local/blacklist/ad-update.sh
      
      





最後の仕上げ



リストを定期的に更新するには、ファイルを作成します



 # nano /etc/cron.daily/blacklist-update
      
      





次の内容で



 #!/bin/bash #       /var/local/blacklist/ad-update.sh #   .  . /var/local/blacklist/blacklist-update.sh
      
      





実行可能にします



 # chmod +x /etc/cron.daily/blacklist-update
      
      





Ubuntuのデスクトップバージョンのユーザー向けの注意



目標はクライアント設定を必要としないゲートウェイを作成することだったという事実にもかかわらず、私の場合はそうではないことが判明しました。 動作するオペレーティングシステムとして、デスクトップUbuntu 16.04を使用します。 ネットワークを設定するには、NetworkManagerユーティリティを使用します。これは、サーバーDNアドレスがDHCPサーバーから取得されず、127.0.1.1:53に設定されるようにデフォルトで設定されています。 Dnsmasqはこのポートでハングし、既知のルールによってのみ名前を解決します。 通常の生活では、これは干渉せず、私たちの場合、.onionゾーンが完全に機能しなくなります



これを修正するには、/ etc / NetworkManager / NetworkManager.confファイルの行をコメント化する必要があります



 dns=dnsmasq
      
      





そのように



 #dns=dnsmasq
      
      





再起動後、すべてが機能します。

拘留されていない場合の拘留



Androidのクライアントは、追加設定なしで正常に動作します。

Windowsは使用しなかったためチェックしませんでしたが、問題はないはずです。

firefoxとiOの制限については、 こちらをご覧ください。



混chaとしたプレゼンテーションをおaび申し上げます。 追加、修正、コメントを歓迎します。

ご清聴ありがとうございました。



2017年9月3日現在の更新。
労働者の要請により、 彼の設定をgithubに投稿しました

設定は参照情報として提供されます。 箱から出してすぐに、彼らは100%に近い確率であなたに合いません。 カスタマイズが必要です。




All Articles