iptables 是一个配置 Linux 内核防火墙的命令行工具,是 netfilter 项目的一部分。这个快速参考备忘单显示了它的常用命令使用清单

入门

介绍

iptables 使用三个不同的链来允许或阻止流量:输入(input)、输出(output)和转发(forward)

  • 输入(input) —— 此链用于控制传入连接的行为
  • 输出(output) —— 此链用于传出连接
  • 转发(forward) —— 这条链用于传入的连接,这些连接实际上不是在本地传递的,比如路由和 NATing

安装 iptables

CentOS 7 上默认安装了 firewalld 作为防火墙,使用 iptables 建议关闭并禁用 firewalld。

1
2
$ systemctl stop firewalld
$ systemctl disable firewalld

安装 iptables

1
$ yum install -y iptables-services

服务管理

1
2
3
4
5
6
$ systemctl status iptables  # 查看服务状态
$ systemctl enable iptables # 启用服务
$ systemctl disable iptables # 禁用服务
$ systemctl start iptables # 启动服务
$ systemctl restart iptables # 重启服务
$ systemctl stop iptables # 关闭服务

命令参数

基本语法:

1
$ iptables(选项)(参数)

参数 作用
-P 设置默认策略:
iptables -P INPUT (DROP
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址 IP/MASK
加叹号”!”表示除这个 IP
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如 tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号

1
$ iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

开始配置规则

默认情况下,所有链都配置为接受规则,因此在强化过程中,建议从拒绝所有配置开始,然后只打开需要的端口:

1
2
3
$ iptables --policy INPUT DROP
$ iptables --policy OUTPUT DROP
$ iptables --policy FORWARD DROP

删除/插入规则

按链条和编号删除规则

1
$ iptables -D INPUT 10

按规范删除规则

1
$ iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

刷新所有规则,删除所有链,并接受所有

1
2
3
4
5
6
7
$ iptables -P INPUT ACCEPT
$ iptables -P FORWARD ACCEPT
$ iptables -P OUTPUT ACCEPT
$ iptables -t nat -F
$ iptables -t mangle -F
$ iptables -F
$ iptables -X

1
2
3
4
5
6
# 冲洗所有链
$ iptables -F
# 刷新单链
$ iptables -F INPUT
# 插入规则
$ iptables -I INPUT 2 -s 202.54.1.2 -j DROP

显示规则

详细打印出所有活动的 iptables 规则

1
$ iptables -n -L -v

…具有行号的相同输出:

1
$ iptables -n -L -v --line-numbers

最后,相同的数据输出但与 INPUT/OUTPUT 链相关:

1
$ iptables -L INPUT -n -viptables -L OUTPUT -n -v --line-numbers

列出特定链的规则

1
2
3
4
5
$ iptables -L INPUT
# 具有规则规范的相同数据:
$ iptables -S INPUT
# 包含数据包计数的规则列表
$ iptables -L INPUT -v

保存规则

1
2
3
4
# 在基于 Debian 的系统上
$ netfilter-persistent save
# 在基于 RedHat 的系统上
$ service iptables save

iptables 示例

清空当前的所有规则和计数

1
2
3
$ iptables -F  # 清空所有的防火墙规则
$ iptables -X # 删除用户自定义的空链
$ iptables -Z # 清空计数

配置允许 ssh 端口连接

1
$ iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

22 为你的 ssh 端口, -s 192.168.1.0/24 表示允许这个网段的机器来连接,其它网段的 ip 地址是登陆不了你的机器的。-j ACCEPT 表示接受这样的请求

允许本地回环地址可以正常使用

1
2
3
4
$ iptables -A INPUT -i lo -j ACCEPT
# 本地圆环地址就是那个127.0.0.1
# 是本机上使用的,它进与出都设置为允许
$ iptables -A OUTPUT -o lo -j ACCEPT

设置默认的规则

1
2
3
4
5
6
# 配置默认的不让进
$ iptables -P INPUT DROP
# 默认的不允许转发
$ iptables -P FORWARD DROP
# 默认的可以出去
$ iptables -P OUTPUT ACCEPT

配置白名单

1
2
3
4
5
6
# 允许机房内网机器可以访问
$ iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT
# 允许机房内网机器可以访问
$ iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT
# 允许 183.121.3.7 访问本机的3380端口
$ iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT

开启相应的服务端口

1
2
3
4
5
6
# 开启 80 端口,因为web对外都是这个端口
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许被 ping
$ iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 已经建立的连接得让它进来
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

保存规则到配置文件中

1
2
3
4
# 任何改动之前先备份,请保持这一优秀的习惯
$ cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
$ iptables-save > /etc/sysconfig/iptables
$ cat /etc/sysconfig/iptables

列出已设置的规则

1
$ iptables -L [-t 表名][链名]

  • 四个表名 rawnatfiltermangle
  • 五个规则链名 INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING
  • filter 表包含INPUTOUTPUTFORWARD三个规则链
1
2
3
4
5
6
7
8
# 列出 nat 上面的所有规则
$ iptables -L -t nat
# ^ -t 参数指定,必须是 raw, nat,filter,mangle 中的一个
# 规则带编号
$ iptables -L -t nat --line-numbers
$ iptables -L INPUT
# 查看,这个列表看起来更详细
$ iptables -L -nv

清除已有规则

1
2
3
4
5
6
7
8
# 清空指定链 INPUT 上面的所有规则
$ iptables -F INPUT
# 删除指定的链,这个链必须没有被其它任何规则引用,
# 而且这条上必须没有任何规则
$ iptables -X INPUT
# 如果没有指定链名,则会删除该表中所有非内置的链
# 把指定链,或者表中的所有链上的所有计数器清零
$ iptables -Z INPUT

删除已添加的规则

1
2
# 添加一条规则
$ iptables -A INPUT -s 192.168.1.5 -j DROP

将所有 iptables 以序号标记显示,执行:

1
$ iptables -L -n --line-numbers

比如要删除 INPUT 里序号为 8 的规则,执行:

1
$ iptables -D INPUT 8

开放指定的端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 允许本地回环接口(即运行本机访问本机)
$ iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许所有本机向外的访问
$ iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许访问80端口
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许ftp服务的21端口
$ iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# 允许FTP服务的20端口
$ iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 禁止其他未允许的规则访问
$ iptables -A INPUT -j reject
# 禁止其他未允许的规则访问
$ iptables -A FORWARD -j REJECT

屏蔽 IP

1
2
3
4
5
6
7
8
9
10
# 屏蔽恶意主机(比如,192.168.0.8
$ iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP
# 屏蔽单个IP的命令
$ iptables -I INPUT -s 123.45.6.7 -j DROP
# 封整个段即从123.0.0.1到123.255.255.254的命令
$ iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 封IP段即从123.45.0.1到123.45.255.254的命令
$ iptables -I INPUT -s 124.45.0.0/16 -j DROP
# 封IP段即从123.45.6.1到123.45.6.254的命令是
$ iptables -I INPUT -s 123.45.6.0/24 -j DROP

指定数据包出去的网络接口

只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。

1
$ iptables -A FORWARD -o eth0

查看已添加的规则

1
2
3
4
5
6
7
8
9
10
11
12
13
$ iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0

启动网络转发规则

公网210.14.67.7让内网192.168.188.0/24上网

1
$ iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127

端口映射

本机的 2222 端口映射到内网 虚拟机的 22 端口

1
$ iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22

字符串匹配

比如,我们要过滤所有 TCP 连接中的字符串test,一旦出现它我们就终止这个连接,我们可以这么做:

1
2
3
4
5
6
7
8
9
10
11
$ iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
$ iptables -L
# Chain INPUT (policy ACCEPT)
# target prot opt source destination
# REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
#
# Chain FORWARD (policy ACCEPT)
# target prot opt source destination
#
# Chain OUTPUT (policy ACCEPT)
# target prot opt source destination

阻止 Windows 蠕虫的攻击

1
$ iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"

防止 SYN 洪水攻击

1
$ iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT

允许环回连接

1
$ iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT

允许已建立和相关的传入连接

1
$ iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

允许已建立的传出连接

1
$ iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

内部到外部

1
$ iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

丢弃无效数据包

1
$ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

阻止 IP 地址

1
$ iptables -A INPUT -s 192.168.1.10 -j DROP

阻止和 IP 地址并拒绝

1
$ iptables -A INPUT -s 192.168.1.10 -j REJECT

阻止与网络接口的连接

1
$ iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP

允许所有传入的 SSH

1
2
$ iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许来自特定 IP 地址或子网的传入 SSH

1
2
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许传出 SSH

1
2
$ iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许来自特定 IP 地址或子网的传入 Rsync

1
2
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许传入 HTTP

1
2
$ iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许传入 HTTPS

1
2
$ iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许传入 HTTP 和 HTTPS

1
2
$ iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许来自特定 IP 地址或子网的 MySQL

1
2
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许 MySQL 到特定的网络接口

1
2
$ iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许来自特定 IP 地址或子网的 PostgreSQL

1
2
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许 PostgreSQL 到特定的网络接口

1
2
$ iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

阻止传出 SMTP 邮件

1
$ iptables -A OUTPUT -p tcp --dport 25 -j REJECT

允许所有传入的 SMTP

1
2
$ iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许所有传入的 IMAP

1
2
$ iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许所有传入的 IMAPS

1
2
$ iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许所有传入的 POP3

1
2
$ iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许所有传入的 POP3S

1
2
$ iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

在公共接口上删除专用网络地址

1
2
$ iptables -A INPUT -i eth1 -s 192.168.1.0/24 -j DROP
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

将所有传出到 Facebook 网络

获取 Facebook 作为:

1
$ whois -h v4.whois.cymru.com " -v $(host facebook.com | grep "has address" | cut -d " " -f4)" | tail -n1 | awk '{print $1}'

降低:

1
$ for i in $(whois -h whois.radb.net -- '-i origin AS1273' | grep "^route:" | cut -d ":" -f2 | sed -e 's/^[ \t]*//' | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | cut -d ":" -f2 | sed 's/$/;/') ; do  iptables -A OUTPUT -s "$i" -j REJECTdone

记录和丢弃数据包

1
2
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

默认情况下,所有内容都记录到 /var/log/messages 文件中:

1
$ tail -f /var/log/messagesgrep --color 'IP SPOOF' /var/log/messages

记录和丢弃日志条目数量有限的数据包

1
2
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

丢弃或接受来自 Mac 地址的流量

1
2
$ iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
$ iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

阻止或允许 ICMP Ping 请求

1
2
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
$ iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

使用 multiport 指定多个端口

1
$ iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT

使用 random*nth* 进行负载平衡

1
_ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")for ip in "${_ips[@]}" ; do  iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 \    -j DNAT --to-destination ${ip}:80done

or

1
_ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")for ip in "${_ips[@]}" ; do  iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \    -j DNAT --to-destination ${ip}:80done

使用 limit 和 iplimit* 限制连接数

1
$ iptables -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m limit --limit 20/hour --limit-burst 5 -j ACCEPT

or

1
$ iptables -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP

维护要匹配的最近连接列表

1
$ iptables -A FORWARD -m recent --name portscan --rcheck --seconds 100 -j DROPiptables -A FORWARD -p tcp -i eth0 --dport 443 -m recent --name portscan --set -j DROP

匹配数据包数据负载中的 “string*”

1
2
$ iptables -A FORWARD -m string --string '.com' -j DROP
$ iptables -A FORWARD -m string --string '.exe' -j DROP

带有“时间*”的基于时间的规则

1
$ iptables -A FORWARD -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m time --timestart 21:30 --timestop 22:30 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT

基于 TTL 值的数据包匹配

1
$ iptables -A INPUT -s 1.2.3.4 -m ttl --ttl-lt 40 -j REJECT

防止端口扫描

1
$ iptables -N port-scanningiptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURNiptables -A port-scanning -j DROP

SSH 暴力破解保护

1
$ iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --setiptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

同步泛洪保护

1
2
3
4
$ iptables -N syn_floodiptables -A INPUT -p tcp --syn -j syn_floodiptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
$ iptables -A syn_flood -j DROPiptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT
$ iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP:
$ iptables -A INPUT -p icmp -j DROPiptables -A OUTPUT -p icmp -j ACCEPT

使用 SYNPROXY 缓解 SYN 泛洪

1
2
3
$ iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
$ iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
$ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

阻止非 SYN 的新数据包

1
$ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

1
$ iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

强制碎片数据包检查

1
$ iptables -A INPUT -f -j DROP

XMAS 包

1
$ iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

丢弃所有 NULL 数据包

1
$ iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

阻止不常见的 MSS 值

1
$ iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

阻止带有虚假 TCP 标志的数据包

1
2
3
4
5
6
7
8
9
10
11
12
13
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

阻止来自私有子网的数据包(欺骗)

1
_subnets=("224.0.0.0/3" "169.254.0.0/16" "172.16.0.0/12" "192.0.2.0/24" "192.168.0.0/16" "10.0.0.0/8" "0.0.0.0/8" "240.0.0.0/5")for _sub in "${_subnets[@]}" ; do  iptables -t mangle -A PREROUTING -s "$_sub" -j DROPdoneiptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP

另见


评论
avatar
竹山一叶
技术分享 个人心得
Follow Me
公告
欢迎光临小站,这里是我日常工作和学习中收集和整理的总结,希望能对你有所帮助:)

本站的内容经过个人加工总结而来,也参考了网友们分享的资料,如有侵权,请第一时间联系我,我将及时进行修改或删除😊
目录
  1. 1. 入门
    1. 1.1. 介绍
    2. 1.2. 安装 iptables
    3. 1.3. 服务管理
    4. 1.4. 命令参数
    5. 1.5. 开始配置规则
    6. 1.6. 删除/插入规则
    7. 1.7. 显示规则
    8. 1.8. 列出特定链的规则
    9. 1.9. 保存规则
  2. 2. iptables 示例
    1. 2.1. 清空当前的所有规则和计数
    2. 2.2. 配置允许 ssh 端口连接
    3. 2.3. 允许本地回环地址可以正常使用
    4. 2.4. 设置默认的规则
    5. 2.5. 配置白名单
    6. 2.6. 开启相应的服务端口
    7. 2.7. 保存规则到配置文件中
    8. 2.8. 列出已设置的规则
    9. 2.9. 清除已有规则
    10. 2.10. 删除已添加的规则
    11. 2.11. 开放指定的端口
    12. 2.12. 屏蔽 IP
    13. 2.13. 指定数据包出去的网络接口
    14. 2.14. 查看已添加的规则
    15. 2.15. 启动网络转发规则
    16. 2.16. 端口映射
    17. 2.17. 字符串匹配
    18. 2.18. 阻止 Windows 蠕虫的攻击
    19. 2.19. 防止 SYN 洪水攻击
    20. 2.20. 允许环回连接
    21. 2.21. 允许已建立和相关的传入连接
    22. 2.22. 允许已建立的传出连接
    23. 2.23. 内部到外部
    24. 2.24. 丢弃无效数据包
    25. 2.25. 阻止 IP 地址
    26. 2.26. 阻止和 IP 地址并拒绝
    27. 2.27. 阻止与网络接口的连接
    28. 2.28. 允许所有传入的 SSH
    29. 2.29. 允许来自特定 IP 地址或子网的传入 SSH
    30. 2.30. 允许传出 SSH
    31. 2.31. 允许来自特定 IP 地址或子网的传入 Rsync
    32. 2.32. 允许传入 HTTP
    33. 2.33. 允许传入 HTTPS
    34. 2.34. 允许传入 HTTP 和 HTTPS
    35. 2.35. 允许来自特定 IP 地址或子网的 MySQL
    36. 2.36. 允许 MySQL 到特定的网络接口
    37. 2.37. 允许来自特定 IP 地址或子网的 PostgreSQL
    38. 2.38. 允许 PostgreSQL 到特定的网络接口
    39. 2.39. 阻止传出 SMTP 邮件
    40. 2.40. 允许所有传入的 SMTP
    41. 2.41. 允许所有传入的 IMAP
    42. 2.42. 允许所有传入的 IMAPS
    43. 2.43. 允许所有传入的 POP3
    44. 2.44. 允许所有传入的 POP3S
    45. 2.45. 在公共接口上删除专用网络地址
    46. 2.46. 将所有传出到 Facebook 网络
    47. 2.47. 记录和丢弃数据包
    48. 2.48. 记录和丢弃日志条目数量有限的数据包
    49. 2.49. 丢弃或接受来自 Mac 地址的流量
    50. 2.50. 阻止或允许 ICMP Ping 请求
    51. 2.51. 使用 multiport 指定多个端口
    52. 2.52. 使用 random* 或 nth* 进行负载平衡
    53. 2.53. 使用 limit 和 iplimit* 限制连接数
    54. 2.54. 维护要匹配的最近连接列表
    55. 2.55. 匹配数据包数据负载中的 “string*”
    56. 2.56. 带有“时间*”的基于时间的规则
    57. 2.57. 基于 TTL 值的数据包匹配
    58. 2.58. 防止端口扫描
    59. 2.59. SSH 暴力破解保护
    60. 2.60. 同步泛洪保护
    61. 2.61. 使用 SYNPROXY 缓解 SYN 泛洪
    62. 2.62. 阻止非 SYN 的新数据包
    63. 2.63. 强制碎片数据包检查
    64. 2.64. XMAS 包
    65. 2.65. 丢弃所有 NULL 数据包
    66. 2.66. 阻止不常见的 MSS 值
    67. 2.67. 阻止带有虚假 TCP 标志的数据包
    68. 2.68. 阻止来自私有子网的数据包(欺骗)
  3. 3. 另见
最新文章
网站资讯
文章数目 :
437
已运行时间 :
本站总字数 :
431.6k
本站访客数 :
本站总访问量 :
最后更新时间 :
文章归档文章分类文章标签复制本文标题复制本文地址
随便逛逛