web-dev-qa-db-ja.com

Tor出口ノードのiptables

オープン Tor ルーターを実行したい。

私の終了ポリシーは ReducedExitPolicy のようになります。

しかし、私はまた、torネットワークが私のリソースを悪用しないようにしたいです。

クライアントがTorを介して実行できないようにしたい場合:

  • 非常に多くのパケットで1つのサイトを槌で打つ。
  • IPブロック全体の積極的なネットスキャン

クライアントがTor経由で実行するのを防ぎたくない場合:

  • 数百の画像ファイルをクラウドにアップロードする
  • トレントのシード

私の質問は、これはまったくできるのか、そしてどのように行うのかということです。

私が最初に考えたのはファイアウォール(Linux/iptablesまたは* BSD/ipfw/pf)でしたが、オニオンルーターの固有のプロパティのため、これはおそらく役に立たないでしょう。

このトピックに関して進行中のtorprojectチームの開発はありますか?

また、Tor出口ノードを保護するための一般的なヒントを求めます。

更新(2012年9月)

有益な回答や他のいくつかの調査から、これは不可能だと思います。

人々が出口ノードを悪用してDDOSに貢献するのを防ぐためにできる最善のことは、1つのIPに向けられた非常に頻繁なパケットを検出することです。

「非常に頻繁な」しきい値は、ノードの合計帯域幅によって異なります...間違っていると、誤検知が発生し、リアルタイムの正当なトラフィックをブロックしますTCPアプリと非常に多くのクライアントから1つに送信されるトラフィック先。

更新(2014年12月)

私の予測は明らかに真実でした-私は私のインターネットプロバイダーからいくつかのネットワーク乱用の苦情を受けました。

サービスのシャットダウンを回避するために、次の一連のiptablesルールを使用する必要がありました(ONEWは発信TCP SYN(別名NEW)パケットのチェーンです:

それで十分かどうかはわかりませんが、次のとおりです。

-A ONEW -o lo -j ACCEPT
-A ONEW -p udp --dport 53 -m limit --limit 2/sec --limit-burst 5 -j ACCEPT
-A ONEW -m hashlimit --hashlimit-upto 1/second --hashlimit-mode dstip --hashlimit-dstmask 24 --hashlimit-name ONEW -j ACCEPT
-A ONEW -m limit --limit 1/sec -j LOG --log-prefix "REJECTED: "
-A ONEW -j REJECT --reject-with icmp-admin-prohibited
9
filiprem

それを念頭に置いて:

  • Torクライアントは、私の現在の理解では、10分ごとに仮想回線を切り替えます。これは、ソースIPがその時間枠の前後で変化していることを意味します。その期間より長く悪意があるとみなす行動を防ぐことはほとんどありません。

  • TorはTCPトラフィックのみをプロキシし、他のプロトコルはプロキシしないという事実は、悪用の可能性をかなり制限することに注意してください。

iptablesを使用すると、新しい発信TCP接続を既存の接続とは異なる方法で処理できます。ESTABLISHED,RELATEDACCEPTEDであるか、「既存のTCP接続」チェーンを通過し、発信TCP)は、それに引っ掛からない必要がありますレート制限される可能性があります。発信Torトラフィックはすべてこれに従う必要があります。

上記と「削減された出口ポリシー」を使用することの間で、あなたができる最善のことだと思います。

理想的には、Torボックスで次の場合を除いて他に何も実行しないでください。

  • おそらく少なくともSSHを起動し、22とは異なるポートに配置します。
  • 単純なWebサーバーを実行して このページ を表示することをお勧めします。 chrootされたmini-httpdインスタンスが行う必要があります。 inetdは使用しないでください。

他の目的で使用されているボックスでTorを実行しないでください。 Tor Legal FAQ の「ExitRelays」セクションを読み、その意味を完全に理解していることを確認してください。また これをすべて読んで実行してください

2
LawrenceC

ソースIPが一定ではないため、これらの攻撃を防ぐことは通常より困難になります。しかし、私の知る限り、torのルートは数分ごとにしか変更されません。

したがって、ソースIPの背後にネットワーク全体があると想定する必要があるため、標準の制限/フィルタリングルールの一部を展開できますが、しきい値は高くなります。

フィルタリングできます:

  • 不正または一般的なフィンガープリント/スキャンパケット(不正なTCP/IPフラグ、XMAS、ほとんどのICMPタイプなど)
  • 進行中または新規の接続に適合しない無効なパケット(-m状態)
  • かなり高いしきい値で始まる新しい接続

ただし、このようなことは通常、インバウンドトラフィックで行われることに注意してください。 「顧客」が実行するプロトコルの種類がわからないため、煩わしい/不明確な方法でそれらを制限する可能性があります。

また、レート制限のあるNEW(またはステートレス)パケットの場合、拒否された(明らかに攻撃されない限りDROPしない)パケットがランダム化される、より複雑なスキームを検討することをお勧めします。このように、通常のユーザーは、全体的なレートが現在制限に達している場合でも、リロードを押して幸運を得ることができますが、同時ポートスキャナーはレート制限を回避できません。

また、Torメーリングリストで質問してください。おそらく、そのような考えを持っているのはあなたが最初ではないでしょう: https://lists.torproject.org/cgi-bin/mailman/listinfo

1
pepe

まず最初に、これらすべてを解決するためのiptablesを提案しません。本当に理想的な出口Torノードは、ISPのパケットと真の宛先から目を離さないようにするため、および/またはアウトバウンドの繰り返し要求を維持するためにキャッシングプロキシを利用するために、いくつかのVPNトンネルを介してbalaceトラフィックをロードします。人気のあるstaticコンテンツを最小限に...これらのオプションを調べている間、ここにband-aidがあります虐待の苦情の問題のために;

使用される情報源

http://www.ossramblings.com/using_iptables_rate_limiting_to_prevent_portscans

http://blog.nintechnet.com/how-to-block-w00tw00t-at-isc-sans-dfind-and-other-web-vulnerability-scanners/

2つのソースリンクをルールに組み合わせて、ポートスキャンにTor出口ノードを使用しようとするボットを苛立たせるために使用できます。これらのルールはnmapのハングタイムを引き起こすため、これにより、出口ノードを使用するハッカーが非常に不満になる可能性があることに注意してください。

#!/bin/bash
## Network interface used by Tor exit daemon
_tor_iface="eth1"
## Ports that Tor exit daemon binds to, maybe comma or space sepperated.
_tor_ports="9050,9051"
## Time to ban connections out in secconds, default equates to 10 minutes, same as default Tor cercut.
_ban_time="600"
## How long to monitor conections in seconds, default equates to 10 minutes.
_outgoing_tcp_update_seconds="600"
## How many new connections can be placed to a server in aloted update time limits. May nead to increes this depending on exit node usage and remote servers usages.
_outgoing_tcp_hitcount="8"
## How long to monitor connections for in minuets, default is 15 minutes but could be lessoned.
_outgoing_tcp_burst_minute="15"
## Hom many connections to accept untill un-matched
_outgoing_tcp_burst_limit="1000"

iptables -N out_temp_ban -m comment --comment "Make custom chain for tracking ban time limits" || exit 1
iptables -A out_temp_ban -m recent --set --name temp_tcp_ban -p TCP -j DROP -m comment --comment "Ban any TCP packet coming to this chain" || exit 1

iptables -N out_vuln_scan -m comment --comment "Make custom chain for mitigating port scans originating from ${_tor_iface}" || exit 1
for _tor_port in ${_tor_ports//,/ }; do
    iptables -A out_vuln_scan -p TCP -o ${_tor_iface} --sport ${_tor_port} -m recent --name temp_tcp_ban --update --seconds ${_ban_time} -j DROP -m comment --comment "Update ban time if IP address is found in temp_tcp_ban list" || exit 1
    iptables -A out_vuln_scan -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --set -m comment --comment "Monitor number of new conncetions to ${_server_iface}" || exit 1
    iptables -A out_vuln_scan -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --update --seconds 30 --hitcout 10 -j out_temp_ban -m comment --comment "Ban address when to many new connections are attempted on ${_tor_iface}" || exit 1
done
iptables -A out_vuln_scan -j RETURN -m comment --comment "Return un-matched packets for further processing" || exit 1

## Add rules to accept/allow outbound packets
iptables -N tor_out -m comment --comment "Make custom chain for allowing Tor exit node services" || exit 1
for _tor_port in ${_tor_ports//,/ }; do
    iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --set --name limit_${_tor_port} -m comment --comment "Track out-going tcp connections from port ${_tor_port}" || exit 1
    iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --update --seconds ${_outgoing_tcp_update_seconds:-60} --hitcount ${_outgoing_tcp_hitcount:-8} --rttl --name limit_${_tor_port} -j LOG --log-prefix "TCP flooding port ${_tor_port}" -m comment --comment "Log atempts to flood port ${_tor_port} from your server" || exit 1
    iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --update --seconds ${_outgoing_tcp_update_seconds:-60} --hitcount ${_outgoing_tcp_hitcount:-8} --rttl --name limit_${_tor_port} -j DROP -m comment --comment "Drop attempts to flood port ${_tor_port} from your server" || exit 1
    iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m limit --limit ${_outgoing_tcp_burst_minute:-15}/minute --limit-burst ${_outgoing_tcp_burst_limit:-1000} -j ACCEPT -m comment --comment "Accept with conditions new connections from port ${_tor_port} from your server" || exit 1
done
iptables -A tor_out -j RETURN -m comment ---comment "Reurn un-matched packets for further filtering or default polices to take effect." || exit 1
## Activate jumps from default output chain to new custom filtering chains
iptables -A OUTPUT -p TCP -o ${_tor_iface} -j out_vuln_scan -m comment --comment "Jump outbound packets through vulnerability scaning mitigation" || exit 1
iptables -A OUTPUT -p TCP -o ${_tor_iface} -j tor_out -m comment --comment "Jump outbound packets through conditional acceptance" || exit 1

上記をbashで実行して、, cammasie;の変数でマジックを実行します。

user@Host~# bash iptables_limit_tor.sh

これが変数のリストです

_tor_iface="eth1"
_tor_ports="9050,9051"
_ban_time="600"
_outgoing_tcp_update_seconds="600"
_outgoing_tcp_hitcount="8"
_outgoing_tcp_burst_minute="15"
_outgoing_tcp_burst_limit="1000"

一部のボットが悪用可能なサーバーを見つけるために使用する-m state NEW ! --syn種類のfunnyビジネスの新しいアウトバウンド接続をフィルタリングすることもできます。これは、優先できるチェーンの例です。このような不正なチャタリングをさらにフィルタリングするための上記の2

iptables -N out_bad_packets -m comment --comment "Make new chain for filtering malformed packets" || exit 1
iptables -A out_bad_packets -p TCP --fragment -j out_temp_ban -m comment --comment "Drop all fragmented packets" || exit 1
iptables -A out_bad_packets -p TCP -m state --state INVALID -j out_temp_ban -m comment --comment "Drop all invalid packets" || exit 1
iptables -A out_bad_packets -p TCP ! --syn -m state --state NEW -j out_temp_ban -m comment --comment "Drop new non-syn packets" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL NONE -j out_temp_ban -m comment --comment "Drop NULL scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL ALL -j out_temp_ban -m comment --comment "Drop XMAS scan"|| exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL FIN,URG,PSH -j out_temp_ban -m comment --comment "Drop stealth scan 1" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL SYN,RST,ACK,FIN,URG -j out_temp_ban -m comment --comment "Drop pscan 1"|| exit 1
iptables -A out_bad_packets -p TCP --tcp-flags SYN,FIN SYN,FIN -j out_temp_ban -m comment --comment "Drop pscan 2" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags FIN,RST FIN,RST -j out_temp_ban -m comment --comment "Drop pscan 3" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags SYN,RST SYN,RST -j out_temp_ban -m comment --comment "Drop SYN-RST scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ACK,URG URG -j out_temp_ban -m comment --comment "Drop URG scans" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL SYN,FIN -j out_temp_ban -m comment --comment "Drop SYNFIN scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL URG,PSH,FIN -j out_temp_ban -m comment --comment "Drop nmap Xmas scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL FIN -j out_temp_ban -m comment --comment "Drop FIN scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL URG,PSH,SYN,FIN -j out_temp_ban -m comment --comment "Drop nmap-id scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags RST RST -o ${_tor_iface} --sport ${_tor_port} -m limit --limit 2/second --limit-burst 3 -j out_temp_ban -m comment --comment "Mitigate Smurf attacks from excesive RST packets"
iptables -A out_bad_packets -p TCP --tcp-flags RST RST -o ${_tor_iface} --sport ${_tor_port} -m limit --limit 2/second --limit-burst 2 -j RETURN -m comment --comment "Ban Smurf attacks using excesive RST packets"
iptables -A out_bad_packets -j RETURN -m comment --comment "Return un-matched packets for further processing." || exit 1

ただし、上記のチェーンは、一致するパケットのIPが禁止されるため(テスト用に-j out_temp_ban-j DROPまたは-j REJECTに変更する可能性があります)、そのチェーンのルールで選択された秒数の間、非常に制限されます。 。この一連のルールは、クライアント側で正しくコーディングされていないアプリが新しいTor cercutを介して再接続したときに、誤検知を引き起こす可能性もあります。

~~~~~

さらにトラフィックを削減するために検討するソフトウェアLinuxの場合はfirejailを確認してください。ソースはGithubとSourceforgeにあり、マニュアルページは古いホームページ、a wordpressサブドメイン、DigitalOceanにあります。 PHPとFirejailを使用したNginxのガイドがあり、少し変更を加えるだけで、ネットワークをどこで抑制すべきかについてはるかに刺激を与えることができます。KVMなどの他のツールも使用できます。スパイシーなサービスを運用境界内に維持するために、shopを使用して、システムに最適なサービスを見つけます。

さらに別のオプションは、狂ったsys-adminがIPへのhttpまたはssl接続を試みたときに、出口を要求しているものへのfail2ban接続をドロップするルールが追加されるように-m state --state NEWを実行することです。通知ページ。これを適切な禁止解除時間制限と組み合わせると、システム管理者がログの汚染についてつぶやく間、リモートサーバーが中断する可能性があります;-)ただし、これは現在の回答の範囲を超えており、サービスに使用しているソフトウェアによって異なります。終了通知ページ;ヒントURLが要求された場合、nginxとApacheの両方が構成の最初の仮想ホストまたはサーバーブロックを提供します。 Apacheまたはnginx以外のものを使用している場合は、マニュアルページを参照する必要がありますが、私にとっては、最初の仮想ホストを別のファイルに記録するように設定し、fail2banにそのログのIPを一時禁止リストに追加させるだけでした。 ;これは、パブリックサーバーでボットを禁止する場合にも役立ちます。ボットは通常IPアドレスを使用し、ドメインリクエストを提供しないと、サーバーがボットトラップを提供するか、この場合は終了通知を提供するためです。

制限されたTor出口ポリシー(処理されたように見えます)を実行してから、VPNトンネル、マルチプルトンネル間の負荷分散のための追加のクレジットポイントを介してトラフィックをプッシュする2番目の方法を学びます。これにより、Torネットワークトラフィックの中断が少なくなり、VPNトラフィックをスニッフィングしてクラッキングすることを認めたくない限り、出口ノードを実行しているという事実にISPの目を曇らせ続けるからです。これは、一時禁止またはリモートホストの自己禁止を許可するルールを実行すると、ノードのクライアントのプライバシーが侵害される可能性があるためです。一方、トラフィックをVPN(または少数)にプッシュすると、クライアントのプライバシーが保護され、 ISPは、whois www.some.domainを実行できる政府によって、ネットワークトラフィックログに対する要求に悩まされることを防ぎます。

~~~~

編集/更新

~~~~

私は自分の拡張ノートに足を運び、使用するパブリックサーバーの構成をプルアップしました

これがfail2banjail.localstansaです

[Apache-ipscan]
enabled  = true
port = http,https
filter = Apache-ipscan
logpath = /var/log/Apache*/*error_ip*
action = iptables-repeater[name=ipscan]
maxretry = 1

そして、これがフィルターApache-ipscan.confファイルです

[DEFAULT]
_Apache_error_msg = \[[^]]*\] \[\S*:error\] \[pid \d+\] \[client <Host>(:\d{1,5})?\]
[Definition]
failregex = \[client <Host>\] client denied by server .*(?i)/.*
#^<Host>.*GET*.*(?!)/.*
#   ^%(_Apache_error_msg)s (AH0\d+: )?client denied by server configuration: (uri )?.*$
#            ^%(_Apache_error_msg)s script '\S+' not found or unable to stat(, referer: \S+)?\s*$
ignoreregex = 
# DEV Notes: 
# the web server only responds to clients with a valid Host: 
# header. anyone who tries using IP only will get shunted into 
# the dummy-error.log and get a client-denied message
#
# the second regex catches folks with otherwise valid CGI paths but no good Host: header
#
# Author: Paul Heinlein

そして、これがアクションiptables-repeater.confファイルです

# Fail2Ban configuration file
#
# Author: Phil Hagen <[email protected]>
# Author: Cyril Jaquier
# Modified by Yaroslav Halchenko for multiport banning and Lukas Camenzind for persistent banning
# Modified by S0AndS0 to combine features of previous Authors and Modders
#
[Definition]
# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart = iptables -N fail2ban-BADIPS-<name>
              iptables -A fail2ban-BADIPS-<name> -j RETURN
          iptables -I INPUT -j fail2ban-BADIPS-<name>
          ## Comment above line and uncomment bello line to use multiport and protocol in addition to named jails
          #iptables -I INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-BADIPS-<name>
          # set up from the static file
          #cat /etc/fail2ban/ip.blocklist.<name> |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-BADIPS-<name> 1 -s $IP -j DROP; done
          cat /etc/fail2ban/ip.blocklist.<name> |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-BADIPS-<name> 1 -d $IP -j DROP; done
          ## Comment above line and uncomment bellow line to check if there are blacklist files to load before attempting to load them
          # if [ -f /etc/fail2ban/ip.blacklist.<name> ]; then cat /etc/fail2ban/ip.blacklist.<name> | grep -e <name>$ | cut -d "," -s -f 1 | while read IP; do iptables -I fail2ban-BADIPS-<name> 1 -s $IP -j DROP; done; fi
# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop = iptables -D INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-BADIPS-<name>
         iptables -F fail2ban-BADIPS-<name> 
         iptables -X fail2ban-BADIPS-<name>
# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
#actioncheck = iptables -n -L INPUT | grep -q fail2ban-BADIPS-<name>
actioncheck = iptables -n -L OUTPUT | grep -q fail2ban-BADIPS-<name>
# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
#actionban = if ! iptables -C fail2ban-BADIPS-<name> -s <ip> -j DROP; then iptables -I fail2ban-BADIPS-<name> 1 -s <ip> -j DROP; fi
actionban = if ! iptables -C fail2ban-BADIPS-<name> -d <ip> -j DROP; then iptables -I fail2ban-BADIPS-<name> 1 -d <ip> -j DROP; fi
# Add offenders to local blacklist, if not already there
        if ! grep -Fxq '<ip>,<name>' /etc/fail2ban/ip.blocklist.<name>; then echo "<ip>,<name> # fail2ban/$( date '+%%Y-%%m-%%d %%T' ): auto-add for BadIP offender" >> /etc/fail2ban/ip.blocklist.<name>; fi
# Report offenders to badips.com
#        wget -q -O /dev/null www.badips.com/add/<name>/<ip>
# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
#actionunban = iptables -D fail2ban-REPEAT-<name> -s <ip> -j DROP
actionunban = iptables -D fail2ban-REPEAT-<name> -d <ip> -j DROP
# Disabled clearing out entry from ip.blacklist (somehow happens after each stop of fail2ban)
#sed --in-place '/<ip>,<name>/d' /etc/fail2ban/ip.blacklist.<name>
[Init]
# Defaut name of the chain
# 
# Defaut name of the chain
name = BADIPS
# Option:  port
# Notes.:  specifies port to monitor
# Values:  [ NUM | STRING ]  Default:
# 
#port = ssh
# Option:  protocol
# Notes.:  internally used by config reader for interpolations.
# Values:  [ tcp | udp | icmp | all ] Default: tcp

上記のフィルターは、開始/停止アクションでOUTPUTをブロックするように編集されていますが、ログに記録されたIPアドレスからの新しいアウトバウンド接続のみを禁止するには、各行に-p TCP -m state --state NEW構成を追加する必要があります。

最後は、ドメインを要求していないユーザーを特定のアクセスとエラーログにルーティングするApache vHost構成を設定し、ループバックでさえエラーをポップせずにページをプルアップできないように、許可されたアクセスと拒否されたアクセスを常にエラーになるように設定します。 。最後になりましたが、ApacheのエラーページをTorからのデフォルトの終了通知に設定して、503または404の当たり障りのないメッセージの代わりにそれが提供されるようにします。または、fail2banのiptablesアクションに状態行を追加した場合は、終了通知で使用されているのと同じログファイルを簡単に指すことができます。その結果、サーバーはIPアドレスをチェックしたサーバーのIPに新しい接続を確立できなくなりますが、確立された関連する接続は引き続き許可されます。つまり、他のページを閲覧することはできますが、それらを閲覧することはできません。 。

1
S0AndS0

私にはもっと良い解決策があります:squidキャッシュサーバー。 aclの定義を構成するために使用できるSquidキャッシュサーバーとあなたはdenyまたはacceptそれぞれacl。あなたの質問が見つけたウィキで一連のルールを定義しているイカチームが非常に興味深いです そこにiptables,PFまたは他の人はあなたの仕事をすることができません、なぜならただ別の層で働くからです。

0
PersianGulf

Torネットワークの残りの部分の限られた帯域幅はあなたのためにそれらの問題を解決します。また、心配な場合は、出口ノードではなく、リレーだけを実行してください。

0
Richard Hum