*filter :INPUT ACCEPT [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # 基於狀態放行或丟棄封包 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -m state --state INVALID -j DROP # 允許icmp封包(ping) -A INPUT -p icmp -j ACCEPT # 允許loopback的所有封包 -A INPUT -i lo -j ACCEPT # 一分鐘內如果超過10的新連接,則DROP掉這個IP的封包 -A INPUT -i wan -m state --state NEW -m recent --set --name filter --mask 255.255.255.255 --rsource -A INPUT -i wan -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 10 --name filter --mask 255.255.255.255 --rsource -j DROP # 允許SSH連線 -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # 設定入站規則若都沒匹配,則用icmp-host-prohibited拒絕封包 -A INPUT -j REJECT --reject-with icmp-host-prohibited # 基於狀態放行或丟棄封包 -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -m state --state INVALID -j DROP # 允許子網對外發起連線 -A FORWARD -m state --state NEW --source 10.0.0.0/24 -j ACCEPT COMMIT
table inet filter { set internalv4 { type ipv4_addr flags interval auto-merge elements = { 10.0.0.0/24 } } set global_ratelimitv4 { type ipv4_addr timeout 60s flags dynamic } set global_ratelimitv6 { type ipv6_addr timeout 60s flags dynamic } set input_service_port { type inet_service elements = { 22 } } chain INPUT { type filter hook input priority filter; policy accept; ct state related,established accept ct state invalid drop ip saddr @global_ratelimitv4 reject with icmp type admin-prohibited ip6 saddr @global_ratelimitv6 reject with icmpv6 type admin-prohibited meta l4proto icmp accept iif "lo" accept iifname "wan" tcp dport @input_service_port ct state new limit rate over 10/minute update @global_ratelimitv4 { ip saddr } iifname "wan" tcp dport @input_service_port ct state new limit rate over 10/minute update @global_ratelimitv6 { ip6 saddr } tcp dport @input_service_port accept reject with icmpx type admin-prohibited } chain FORWARD { type filter hook forward priority filter; policy drop; ct state related,established accept ct state invalid drop ip saddr @internalv4 ct state new accept } }