これは本当に2つの部分からなる質問です。私はシステム管理者ではなく開発者ですが、会社で唯一の従業員であるため、すべての帽子をかぶっています。
負荷分散/冗長性のためにCARPで実行されている2つのファイアウォールと、データベースおよびその他のバックエンドアプリケーションのニーズのために約40台のコンピューターを使用してサーバーを展開しました。スタートアップとして、DDoS保護に加えて、ビジネス専用インターネットにISPに支払うことなく、DDoS攻撃の被害を軽減することで、いくらかのお金を節約したいと考えています。 DDoSから完全に保護することはできないことを私は知っています。アプリが収益を上げ始めるまで被害を軽減したいだけです。そうすれば、ISPに頭痛の種に対処させることができます。
その精神で、スクリプト(おそらくcronを介して)が現在の使用法に基づいてPFルールを変更するソリューションを誰かが実装したことがあるかどうか疑問に思いました。たとえば、数百万のIPアドレスからのハーフオープン接続が多すぎる場合は、PFにSYN-Cookieモードに移行し、攻撃が終了したとき(またはしばらく経過したとき)に通常に戻るように指示します。
アプリのバックエンドを実行していて、コンテンツの99%が静的ではないため、Cloudfareを使用できません。アプリのウェブサイトでクラウドフェアを行うことはできましたが、それだけです。
繰り返しになりますが、お金IS問題です。現在、FIOS Businessを使用していますが、Verizonはそのタイプの回線でDDoS保護を提供しません。
最後に、SYN-COOKIES/SYN-PROXYINGを有効にした後、誰かが劇的な問題を経験しましたか。本当の話をしてください。お願いします。
PS私はSYN-PROXYINGとSYN-COOKIESについての議論を始めたくありません!
誰も私の質問に答えていないので、これは私が最終的に得たpf構成です。特に、テーブルが15%のオープンtcp接続で満たされた後、Cookieを設定するための行を確認します。 SYN Cookieは、ハーフオープン接続が多すぎるのを防ぐという点で、大きなメリットをもたらします。ただし、これは最終的なものではありません。独自の環境で実行できるもう1つのことは、外部インターフェイスでのicmpの量を1000 /秒に制限することです。これは私がまだ遊んでいなければならないものです。これは壊滅的な影響を与える可能性があるため、ネットワーク内で制限しないでください。
bogonsテーブルとUSAテーブルは頻繁に更新されます。それぞれ4時間と24時間ごと。これIS今日使用されていないIPアドレス、特にipv6がたくさんあるので、必見です。それで、なぜそれらを処理するのも面倒です。さらに、米国外の誰もがアクセスする必要はありません。 SSH経由。
また、アプリケーションが外部から更新され、sshアプリケーションがpf内で更新されるブルートフォース攻撃テーブルもいくつかあります。誰かが一度にあまりにも多くの接続を試みようとした場合に備えて、彼らは明らかに何か怪しげなことを試みています。
Webサーバーなどの負荷分散を行ったが、不要な情報をあまり投稿したくなかったため、これは最終的な構成ではありませんでした。
最後に、フェイルオーバー/冗長性/負荷分散のために常にcarpを実行してみてください!!
# Macros
udp_services = "{ domain, ntp }"
tcp_services = "{ ssh, smtp, domain, www, pop3, auth, https, pop3s }"
carpdevs = "carp0"
ext_if = "em0"
int_if = "{ em1, em2, em3, em4, em5 }"
localnet = "{ em1:network, em2:network, em3:network, em4:network, em5:network}"
table <USA_IP_ADDRESSES> persist file "/etc/usa_all_ip.zone"
table <dhcpd_leased_ips> persist
table <dhcpd_abandoned_ips> persist
table <dhcpd_changed_ips> persist
table <bruteforce> persist
table <bogons> persist file "/etc/bogons" # see cron jobs for when this file gets updated (daily) and from where
table <lan> const { 192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24, 192.168.4.0/24, 192.168.5.0 }
table <webservers> persist { 192.168.4.10, 192.168.4.20 }
table <websiteoverload> persist
table <appoverload> persist
table <mysmateservers> persist
# Global settings
set debug warning
set limit { states 10000000, table-entries 1000000}
set optimization aggressive
set syncookies adaptive (start 15%, end 8%)
set timeout tcp.established 1800
set skip on lo
set loginterface em0
# Default everything coming in + antispoof
antispoof for $ext_if inet
antispoof for $int_if inet
antispoof for carp0 inet
block drop all
block drop in quick on $ext_if from { <bogons>, <bruteforce> }
# Allow traffic from all our CARP devices
pass on $carpdevs proto carp
# Allow connections between all of our intrefaces
pass from { self, $localnet }
#block drop in on $ext_if from carp0:network
# block all outgoing traffic through em0 coming from em2-em5 and don't bother testing other rules
block return out on egress proto { tcp, udp} from 192.168.0.0/16
# pass out clock synchronization
pass out on egress proto udp from 192.168.0.0/16 to port ntp
# pass out dns look up
pass out on egress proto { udp, tcp } from 192.168.0.0/16 to port domain
pass out on egress from 192.168.1.0/24
pass out on egress from 192.168.5.0/24
pass out log on egress from 192.168.2.0/24
match out on $ext_if inet from 192.168.0.0/16 nat-to (carp0) # NAT, match IPv4 only
# ICMP related rules -- See The PF Book Chapter 3
icmp_types = "{ echoreq, unreach }"
icmp6_types = "{ echoreq unreach timex paramprob }"
pass inet proto icmp icmp-type $icmp_types #max-pkt-rate 100/1
pass inet6 proto icmp6 icmp6-type $icmp6_types # max-pkt-rate 100/1
# Allow default port range for traceroute(8) 64*3 - Reference: The PF Book Chapter 3
pass out on egress inet proto udp to port 33433:33626 # For IPv4
pass out on egress inet6 proto udp to port 33433:33626 # For IPv6
# Allow incoming SSH connections from US IP addresses only
pass in log on $ext_if proto tcp from <USA_IP_ADDRESSES> to port ssh modulate state \
(max-src-conn 50, max-src-conn-rate 10/1, overload <bruteforce> flush global)
# Allow incoming traffic on http,https and forward it to our web_server computer
pass in log on $ext_if proto tcp from <USA_IP_ADDRESSES> to port https rdr-to 192.168.5.5 keep state \
(max-src-conn-rate 100/1, overload <websiteoverload>)
pass in log on $ext_if proto tcp from <USA_IP_ADDRESSES> to port 58777 rdr-to <mysmateservers> least-states modulate state \
(max-src-conn-rate 1000/1, overload <appoverload>)
# By default, do not permit remote connections to X11
block return in on ! lo0 proto tcp to port 6000:6010
# Port build user does not need network
block return out proto {tcp udp} user _pbuild