IPtables基础
简介
iptables命令可用于配置Linux的包过滤规则,常用于实现防火墙、NAT。
iptables里面有4张表,分别是filter,NAT,mangle,raw表。运维人员的话主要关注的是filter和NAT表。
- filter:主要是过滤包的,内建三个链INPUT、OUTPUT以及FORWARD。INPUT作用于进入本机的包;OUTPUT作用于本机送出的包;FORWARD作用于那些跟本机无关的包。
- NAT:主要用户地址转换和端口映射,内建三个链,分别是PREOUTING、OUTPUT、POSTROUTING。
iptables命令基本结构
iptables
[-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
iptables [ –t 表名 ]命令选项 [ 链名 ] [ 条件匹配 ] [ –j 目标动作或跳转 ]
注:如果-t默认表是filter表。
Command(命令)
-F:flush, 清空规则链; 省略链, 表示清空指定表上的所有的链;
-N: new, 创建新的自定义规则连;
-X: delete/drop, 删除用户自定义的空的规则链;
-Z: zero, 清零, 置零规则计数器
-P: Policy, 为指定链设置默认策略,未符合过滤条件之封包,预设的处理方式;
对filter表中的链而言, 默认策略通常有ACCEPT(允许,放行), DROP(丢弃), REJECT(拒绝);
-E: rEname, 重命名自定义链; 引用计数不为0的自定义链, 无法改名, 也无法删除;
-L, --list:列出某规则链中的所有规则。
规则管理:
-A: append, 将新规则追加于指定链的尾部;
-I: insert, 将新规则插入至指定链的指定位置; //不指明插入的行数时默认插入到第一行.
-D: delete, 删除指定链上的指定规则;
有两种指定方式:
(1) 指定匹配条件;
(2) 指定规则编号;
-R: replace, 替换指定链上的指定规则;
查看:
-L: list, 列出指定链上的所有规则;
-n: numberic, 以数字格式显示地址和端口号;
-v: verbose, 显示详细信息;
-vv, -vvv:详细更详细信息.
--line-numbers: 显示规则编号;
-x: exactly, 显示计数器计数结果的精确值;
Parameter(参数)
[!] -s IP|Netaddr: 检查报文中的源IP地址是否符合此处指定的地址范围;
[!] -d IP|Netaddr: 检查报文中的目标IP地址是否符合此处指定的地址范围;
-p {tcp|udp|icmp}: 检查报文中的协议, 即ip首部中的protocols所标识的协议;
-i IFACE: 数据报文的流入接口; 仅能用于PREROUTING, INPUT及FORWARD链上;
-o IFACE: 数据报文的流出接口; 仅能用于FORWARD, OUTPUT及POSTROUTING链上;
Target:
ACCEPT: 接收
DROP: 丢弃
REJECT: 拒绝
LOG: 记录日志
MARK: 做防火墙标记
DNAT: 目标地址转换
SNAT: 原地址转换
MASQUERADE: 地址伪装
基础命令
- iptables -nvL //iptables -nvL 查看规则
[[email protected] ~]# iptables -nvL Chain INPUT (policy ACCEPT 45 packets, 8317 bytes) pkts bytes target prot opt in out source destination 1284 149K ACCEPT tcp -- * * 172.31.11.189 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 152 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 916 packets, 230K bytes) pkts bytes target prot opt in out source destination
- iptables -t filter -A INPUT -p tcp --dport 80 -s X.X.X.X -j DROP //-A 表示插入到最后一行
- iptables -t filter -I INPUT -p tcp --dport 80 -s X.X.X.X -j DROP //-A 表示插入到最后一行
[[email protected] ~]# iptables -t filter -A INPUT -p tcp --dport 80 -s 172.31.24.150 -j DROP [[email protected] ~]# iptables -t filter -I INPUT -p tcp --dport 80 -s 172.31.24.151 -j DROP [[email protected] ~]# iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DROP tcp -- * * 172.31.24.151 0.0.0.0/0 tcp dpt:80 466 41872 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 2 473 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 0 0 DROP tcp -- * * 172.31.24.150 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 10 packets, 1888 bytes) pkts bytes target prot opt in out source destination
- iptables -nvL --line-numbers //查看规则带有id号
- iptables -D INPUT 6 //根据规则的id号删除对应规则
[[email protected] ~]# iptables -nvL --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 311 27704 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 4 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 2 473 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 6 0 0 ACCEPT tcp -- * * 172.31.24.150 0.0.0.0/0 tcp dpt:80
- service iptables save //iptables如果不保存的话重启服务就会丢失,所以配置好之后一定要保存下,保存的路径在/etc/sysconfig/iptables
[[email protected] ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
- iptables-save > X.bak //可以指定文件进行保存。
- iptables-restore <3.bak //可以将备份的文件导入。
[[email protected] ~]# iptables-save > 3.bak //将iptables配置文件导出 [[email protected] ~]# cat 3.bak # Generated by iptables-save v1.4.7 on Thu Dec 29 10:38:16 2016 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [108:16105] -A INPUT -s 172.31.24.151/32 -p tcp -m tcp --dport 80 -j DROP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A INPUT -s 172.31.24.150/32 -p tcp -m tcp --dport 80 -j DROP -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Thu Dec 29 10:38:16 2016 # Generated by iptables-save v1.4.7 on Thu Dec 29 10:38:16 2016 *nat :PREROUTING ACCEPT [833:120780] :POSTROUTING ACCEPT [11:681] :OUTPUT ACCEPT [11:681] COMMIT # Completed on Thu Dec 29 10:38:16 2016 [[email protected] ~]# iptables-restore <3.bak //将备份的文件导入
- iptables -Z //-Z: zero, 清零, 置零规则计数器
案例
针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对172.31.24.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。写脚本执行是为了方便。:
#!/bin/bash ips="/sbin/iptables" $ips -F //对iptables配置进行清空下 $ips -P INPUT DROP //请谨慎使用,执行后就会断开一切INPUT连接,所以这里用脚本导入。 $ips -P OUTPUT ACCEPT $ips -P FORWARD ACCEPT $ips -A INPUT -s 172.31.24.0/24 -p tcp --dport 22 -j ACCEPT $ips -A INPUT -s 172.31.11.189 -p tcp --dport 22 -j ACCEPT $ips -A INPUT -p tcp --dport 80 -j ACCEPT $ips -A INPUT -p tcp --dport 22 -j DROP