~~~~~

~~~~~

オープンイベントをしたいです。トルルーター。

私のオプトアウトポリシーは次のとおりです。退出政策の縮小

しかし、私はまた、Torネットワークが私のリソースを誤用するのを難しくしたいと思います。

クライアントがTorを通過しないようにしたい。

  • パケット数の多いサイトを攻撃します。
  • フルIPブロックの積極的なネットワークスキャン

私がしたくないのは、クライアントがTorを通過するのをブロックすることです。

  • 何百もの画像ファイルをクラウドにアップロード
  • 種をまく

私の質問はこれが可能であり、どのようにできるかということです。

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

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

また、Tor出口ノードのセキュリティに関する一般的なヒントも要求されます。

アップデート(2012年9月)

役に立つ回答やその他の研究によると、これはできないと思います。

人々がDDOSに貢献するために出口ノードを乱用するのを防ぐための最善の方法は、IPに転送される非常に頻繁なパケットを検出することです。

「非常に頻繁に」しきい値は、ノード全体の帯域幅によって異なります。誤った場合、偽の肯定が発生し、リアルタイムTCPアプリケーションへの正当なトラフィックと、複数のクライアントから単一の宛先へのトラフィックをブロックします。

アップデート(2014年12月)

私の予測は間違いなく正しい。インターネットプロバイダから何度もネットワーク乱用の苦情を受けました。

サービスの中断を防ぐには、次のiptablesルールセット(ONEW発信TCP SYN(新しいエントリとも呼ばれる)パケットチェーン)を採用する必要があります。

これが十分かどうかはわかりませんが、次のようになります。

-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

答え1

覚えておいてください:

  • 現在の理解によれば、Torクライアントは約10分ごとに仮想回線を切り替えます。これは、ソースIPがその期間内に変更されたことを意味します。この期間よりも長い間悪意と見なされる行動を防ぐことはできません。

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

iptables新しい発信TCP接続を既存の接続とは異なる方法で処理できます。すべてが「既存のTCP接続」チェーンを通過するESTABLISHED,RELATED必要があり、そのチェーンによってキャプチャされていない発信TCPは速度が制限される可能性があります。ACCEPTED発信するすべてのTorトラフィックはこの規則に従う必要があります。

私は上記と「退出方針の削減」を使用することがあなたができる最善の方法だと思います。

理想的には、以下を除き、Torボックスで他のものを実行しないでください。

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

他の目的で使用されているマシンでTorを実行しないでください。 Exit Relayセクションを必ずお読みください。Torの法的FAQそしてその意味を完全に理解しています。返品以下をすべて読んで完了してください。

答え2

ソースIPが一定ではないため、これらの攻撃をブロックするのは通常よりも困難です。しかし、私が知っているのは、Torのルートは数分ごとに変わります。

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

以下をフィルタリングできます。

  • 不良または一般的なパケット指紋認識/スキャン(無効なTCP / IPフラグ、XMAS、ほとんどのICMPタイプなど)
  • 進行中の接続または新しい接続に適していない無効なパケット(-mステータス)
  • 新しい接続はかなり高いしきい値で始まります。

ただし、この種の操作は通常、着信トラフィックで行われます。あなたはあなたの「クライアント」がどのプロトコルを実行しているのかわかりません。

また、レート制限付きの新しい(またはステートレス)パケットの場合、拒否された(明白な攻撃ではない限り絶対に破棄されない)パケットがランダムに割り当てられるより複雑なシナリオを考慮することができます。これにより、フルスピードが現在制限されていても、通常のユーザーはリロードを試みて幸運になる可能性がありますが、同時ポートスキャナはレート制限をバイパスできません。

また、Torメーリングリストに連絡してください。おそらくこのアイデアを初めて考えた人ではないでしょう。https://lists.torproject.org/cgi-bin/mailman/listinfo

答え3

まず第一に、私はこれらすべての問題を解決するためにiptablesを提案するわけではありません。実際に理想的なegress Torノードは、一部のVPNトンネルを介してトラフィックのロードバランシングを実行し、ISPがパケットと実際の宛先および/または実際の宛先から離れていることを確認します。サイトの重複要求の人気を防ぐためにキャッシュプロキシを利用してください。変化のない最小限のコンテンツ...オプションの調査中にここに絆倉庫虐待申告の場合

使用された情報のソース

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 つのソースリンクを 1 つのルールにまとめると、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

上記のように実行すると、bashCammasを持つ変数に対して魔法を実行できます,

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さまざまな種類の接続を見つけるために新しいアウトバウンド接続をフィルタリングすることもできます。興味深い一部のボットは、悪用可能なサーバーを見つけるために企業を利用しています。ここに例のチェーンがあります。上記の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とSource forgeにあります。マニュアルページは、前のホームページ(wordpressサブドメイン)にあります。 DigitalOceanには、PHPとFirejailでNginxを使用する方法が記載されています。いくつかの修正で利用可能であり、ネットワークを制限する場所のより良いアイデアを提供します。KVM運用境界内で特別なサービスを維持するために使用できる他のツールもあります。お店あなたのシステムに最適なものを見つけてください。

もう1つのオプションは、クレイジーシステム管理者がhttpまたはSSLを介してIPに接続しようとしたときに終了通知ページを要求している人への接続をfail2ban切断するルールを追加する方法で実行することです。-m state --state NEW合理的な禁止解除のタイムアウトと組み合わせると、システム管理者がログの汚染について文句を言う間にリモートサーバーを休ませることができます。 ;-) ただし、これは現在の回答の範囲外であり、使用するサービスソフトウェアによって異なります。通知ページを終了してください。ヒント 今すぐ URL を要求すると、nginx と apache の両方が構成の最初の仮想ホストまたはサーバーブロックを提供します。 apacheやnginx以外のものを使用している場合は、マニュアルページを参照する必要がありますが、私は別のファイルにログインする最初の仮想ホストを設定し、その中にIPが追加されたすべてを失敗2banに記録するのと同じくらい簡単でした。一時禁止リストは、パブリックサーバーでボットを禁止するのにも非常に効果的です。ボットは通常、IPアドレスを使用し、ドメイン要求を処理しないと、サーバーがボットトラップ(この場合は終了通知)を提供するためです。

私が好むのは、制限されたTorシャットダウンポリシー(すでに処理されているように見える)を実行してからVPNトンネルを介してトラフィックをプッシュして、複数のトンネル間のロードバランシングのための追加クレジットを提供することです。これは、Tor ネットワークトラフィックへの干渉を減らし、ISP が VPN トラフィックをスニッフィングしてクラッキングすることを喜んで認めない限り、終了ノードを実行していることを検出することを不可能にするからです。これは、リモートホストを一時的に禁止または自己禁止することを許可するルールを実行するとノードクライアントのプライバシーを侵害する可能性がありますが、VPN(または少数)にトラフィックをプッシュするとクライアントのプライバシーを保護し、情報を保存します。に役立つからです。トレースから保護されるISP必要価値のあるすべての政府はネットワークトラフィックを記録しますwhois www.some.domain

~~

編集/更新

~~

詳細なノートを見て、私が使用しているパブリックサーバーの構成を抽出しました。

これはFail2banjail.localスタンザです。

[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

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

最後に、ドメインを要求していないユーザーを特定のアクセスログとエラーログにルーティングするようにApache vHost設定を設定し、常にエラーが発生するようにアクセスを許可および拒否し、ループバックもポップアップなしで機能しないようにすることです。ページの取り出し中にエラーが発生しました。最後に、ApacheのエラーページをTorのデフォルトの終了通知に設定して、通常のメッセージではなく503その404通知を提供します。または、Fail2banのiptablesアクションにステータス行を追加した場合は、シャットダウン通知に使用されたのと同じログファイルを簡単に指すことができます。その結果、あなたのサーバーはあなたのIPアドレスを確認するサーバーのIPへの新しい接続を確立することはできませんが、すでに確立されている関連接続は引き続き許可されます。つまり、他のページは引き続き閲覧できますが、あなたは検索できません。

答え4

より良い解決策があります:イカキャッシュサーバー。 Squidキャッシュサーバーは、aclあなたdenyまたはacceptそれぞれを定義するように設定できますacl。興味深いことに、Squidチームはあなたの質問のWikiに一連のルールを定義しました。そこ iptables,PFそうしないと、他のレイヤーで作業しているため、他の人が作業を実行できなくなります。

関連情報