1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #!/bin/bash
- # Simple IPTables script for servers.
- set -eu
- command -v iptables 1>/dev/null || (echo "Please install iptables." 1>&2 && exit -1)
- command -v netfilter-persistent 1>/dev/null || (echo "Please install iptables-persistent and netfilter-persistent." 1>&2 && exit -1)
- ## Helper functions
- ipt4() {
- iptables "$@" || return $?
- }
- ipt6() {
- ip6tables "$@" || return $?
- }
- ipt46() {
- ipt4 "$@" || return $?
- ipt6 "$@" || return $?
- }
- ipt_save() {
- netfilter-persistent save || return $?
- }
- ## Policies
- ipt46 -P INPUT DROP
- ipt46 -P FORWARD DROP
- ipt46 -P OUTPUT DROP
- ## Clear all
- ipt46 -F
- ipt46 -X
- ipt46 -t nat -F
- ipt46 -t nat -X
- ipt46 -t mangle -F
- ipt46 -t mangle -X
- ipt46 -t raw -F
- ipt46 -t raw -X
- ipt46 -t security -F
- ipt46 -t security -X
- ## Input Basic
- # Connection tracking
- ipt46 -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- ipt46 -A INPUT -m conntrack --ctstate INVALID -j DROP
- # Localhost
- ipt46 -A INPUT -i lo -j ACCEPT
- # Ping
- ipt4 -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
- ipt6 -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
- # NDP
- ipt6 -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
- ipt6 -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
- ipt6 -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
- ipt6 -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
- # DHCPv6 client and server
- ipt6 -A INPUT -p udp --dport 546 -j ACCEPT
- ipt6 -A INPUT -p udp --dport 547 -j ACCEPT
- ## Input Special
- # SSH
- ipt46 -A INPUT -p tcp --dport 22 -j ACCEPT
- ## Output
- # Accept all
- ipt46 -A OUTPUT -j ACCEPT
- ## Save
- ipt_save
- echo "Done"
|