O fato de você já rodar o nginx é um bom começo - servidores baseados em eventos são muito mais resistentes a ataques do tipo slolor.
Ainda assim, é uma boa idéia evitar ataques do DOS o mais longe possível do seu aplicativo. O próximo passo é o iptables.
Você precisa pensar sobre como clssificar ataques e diferenciá-los do tráfego real - a velocidade na qual novas conexões estão sendo criadas é um indicador muito bom - e você pode configurar o iptables para limitar novas conexões em uma base por ip:
iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent \
--update --seconds 30 --hitcount 80 -j DROP
(descarta novas solicitações de conexão quando a taxa aumenta acima de 80 a cada 30 segundos)
Você pode limitar o número de conexões simultâneas por endereço IP:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 20 -j REJECT --reject-with tcp-reset
Também é uma boa ideia limitar a largura de banda, dependendo do seu perfil de tráfego para, digamos, 10% da largura de banda disponível - isso é feito usando tc ao invés de iptables.
Em seguida, para as conexões que passarem, pode haver características na solicitação HTTP que identificam um ataque (referenciador, URL solicitado, user agent, accept language ...). Não importa qual específico valores que você escolhe para estes apenas agora - você só precisa garantir que você tem o maquinário no lugar onde você pode alterar rapidamente os parâmetros no primeiro sinal de um ataque. Embora você possa manipular a solicitação no servidor da Web, uma solução melhor é bloquear o acesso do endereço IP remoto usando o iptables - fail2ban é a ferramenta para unir seus dados de log à sua configuração do iptables.
É claro que para um DDOS de grande escala isso não resolverá o problema dos invasores enchendo seu canal de internet com pacotes que seu servidor ignora - para isso você precisa falar com seu provedor de upstream.