web-dev-qa-db-ja.com

特定のIPSetセットのみがiptablesを使用して特定のポートにアクセスできるようにするにはどうすればよいですか?

私はIPSetを使用して、次のようにさまざまな国のIP範囲を構築しています。

# Canada
ipset -F ca.zone
ipset -N ca.zone nethash
for IP in $(wget -O - http://www.ipdeny.com/ipblocks/data/countries/ca.zone)
        do ipset -A ca.zone $IP 
        echo $IP
done

次に、次のiptablesルールを使用して、サーバー上の特定のポートからこれらの国をブロックしています。

iptables -A INPUT -m set --match-set fr.zone src -p tcp --dport 15765 -j DROP
iptables -A INPUT -m set --match-set cn.zone src -p tcp --dport 15765 -j DROP
iptables -A INPUT -m set --match-set ca.zone src -p tcp --dport 16247 -j DROP
iptables -A INPUT -m set --match-set de.zone src -p tcp --dport 16247 -j DROP

これはすべてうまく機能しますが、特定のIPSet国のIP範囲のみを許可することで、一部のポートでこれとは逆のことを実現したいと思います。たとえば、uk.zoneセットとth.zoneセット内のIPを除くすべてのIPをブロックします。

これを実現するには、どのiptablesルールが必要ですか?

4
James Morrison

推定を逆にします。必要なものを許可し、残りを拒否します。

iptables -A INPUT -m set --match-set uk.zone src -p tcp --dport 15765 -j ACCEPT
iptables -A INPUT -m set --match-set th.zone src -p tcp --dport 15765 -j ACCEPT
iptables -A INPUT                                -p tcp --dport 15765 -j DROP

(ポート16247についても同様です。または、-m multiportで賢くしてみてください)。順序が重要であることに注意してください。例外(ACCEPTs)はルール(DROP)の前に来る必要があります。

3
MadHatter