Linux iptables
[四表五链]
四表:raw, mangle, nat, filter
五链:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
filter表(默认):
INPUT #处理目标地址是本机的数据包
OUTPUT #处理源地址是本机的数据包
FORWARD #处理转发的数据流,需要ip_forward=1
nat表:
PREROUTING #处理路由前的数据包,修改目的IP,与DNAT一起使用
POSTROUTING #处理路由后的数据包,修改源IP,与SNAT一起使用
OUTPUT #处理本机产生的数据包
mangle表:负责修改数据包中特殊的路由标记,如TTL,TOS,MARK等
INPUT
OUTPUT
PREROUTING
POSTROUTING
FORWARD
raw表:设置raw表一般是不再让iptables做数据包的链接跟踪处理,提高性能
PREROUTING
OUTPUT
eg:
iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
*优先级是raw -> mangle -> nat -> filter
[操作]
1.规则查看
-t #选择表
-L #显示所选链的所有规则,如果没指定链,则显示所有链的所有规则
-n #数字输出,IP和port会以数字的形式打印
-h #显示帮助信息
-V #显示版本信息
-v #显示详细信息
-x #扩展数字,显示包和字节计数器的精确值
--line-numbers #显示规则的行号
2.规则清除
-F #默认清除filter表中所有链的所有规则,可以指定表,指定链
-X #默认删除filter中所有自定义链(必须没被规则引用),可以指定表,指定链
-Z #默认清零filter中所有链的计数器,可以指定表,指定链
3.规则管理
-A #追加一条规则,用法:iptables -t $table -A $chain $rule
-I #插入一条规则,用法:iptables -t $table -I $chain $number $rule,默认number为1,插入头部
-R #替换一条规则,用法:iptables -t $table -R $chain $number $new_rule
-D #删除一条规则,用法:iptables -t $table -D $chain $number;iptables -t $table -D $chain $rule
-P #定义默认规则,用法:iptables -t $table -P
4.规则参数
-p #指定协议,tcp/udp/icmp等
--sport #源端口
--dport #目的端口
-i #接收接口
-o #发送接口
-j #动作,ACCEPT/DROP/REJECT
-m #匹配扩展模块
--syn #tcp新建连接的请求报文
--tcp-flags mask comp #mask表示检查范围,comp表示匹配
*有效值:SYN,ACK,FIN,RST,URG,PSH
*可以指定多个有效值,用逗号分割
*可以用ALL或者NONE
例如:
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT #匹配SYN,ACK标记为1,其它标记为0的数据包
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT #匹配SYN标记为1,ACK,FIN,RST标记为0的数据包
--syn 等同于 --tcp-flags ALL SYN 都是去匹配tcp新建连接请求报文
--icmp-type #icmp类型,8:请求 0:应答
5.扩展模块
1)state 状态检查
NEW: 新建会话
ESTABLISHED: 已经建立的会话
RELATED: 有关联关系的连接,例如ftp
INVALID: 无法识别的连接
UNPACKED: 未被追踪的数据包
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
2)limit 速率限制
--limit:最大平均匹配速率,取值有/second,/minute,/hour,/day;默认3/hour
--limit-burst:设置阈值,默认是5
iptables -A INPUT -p icmp -m limit --limit 20/minute --limit-burst 10 -j ACCEPT #一开始给的阈值是10个数据包,每匹配到一个,limit-burst的值减1,当匹配到10个,limit-burst的值为0,以后每经过5秒,limit-burst的值加1,又能匹配到一个包
3)mac 用于MAC地址匹配
iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
4)multiport 用于匹配非连续的多个端口,做多指定15个
iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT #非连续端口匹配
iptables -A INPUT -p tcp --dport 20:100 -j ACCEPT #连续端口匹配
5)iprange 匹配一段IP,而非整个网段
iptables -A INPUT -p tcp -m iprange -s 10.10.10.1-10.10.10.5 --dport 22 -j ACCEPT
6)string 字符串匹配
iptables -A INPUT -p tcp --dport 80 -m string --string "sex" -j DROP
7)connlimit 连接数限制
--connlimit-upto n #当 连接数 <= n 时匹配
--connlimit-above n #当连接数 >n 时匹配
--connlimit-mask n #使用前缀长度对主机进行分组
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 100 -j REJECT #限制同一IP连接数,以IP位单位
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT #限制每组c类IP的连接数,以组位单位
8)time 用于时间匹配
--timestart 09:00:00
--timestop 18:00:00
--weekdays 1,2,3,4,5,6,7
--monthdays 1,2,3..
--datestart 2019-01-01
--datestop 2019-12-31
6.Nat
echo 1 > /proc/sys/net/ipv4/ip_forward #开启主机路由功能
SNAT源地址映射方式,一般用在固定外网的环境下
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 10.10.10.10 #将源地址为192.168.10.0网段的ip地址映射到外网接口eth0的ip 10.10.10.10
MASQUERADE源地址伪装的方式,一般用在动态外网IP的环境下,当然也可用在固定外网IP环境下
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
DNAT方式,相当于SNAT的反向代理,用在外网需要主动方位内网某个IP的环境下
iptables -t nat -A PREROUTING -d 10.10.10.10 -j DNAT --to-destination 192.168.10.1
REDRECT 重定向,本地使用 8080 这个 port 来启动 WWW ,但是别人都以80来访问,这时候需要重定向80->8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080