Linux命令之iptables
从CentOS7开始,系统自带的防火墙更改为firewalld,但同样支持iptables,不过只有iptables命令,如果想要使用iptables服务需要自行安装iptables-server。
iptables是netfilter/iptables的简称,IP信息包过滤系统。netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
(1).iptables的四表五链
四表:指的是raw、mangle、nat和filter;五链:指的是INPUT、OUTPUT、FORWARD、PREROUTING和POSTROUTING
1)四表介绍
raw表用于处理异常,包括的规则链有PREROUTING、OUTPUT。一般使用不到,raw表在整个防火墙体系中优先级最高,如果启用raw表数据将会跳过conntrack(连接跟踪机制)。
mangle表主要应用在修改数据包内容上,用来做流量整形,给数据包打上标识,包含所有规则链。
nat表涉及网络地址转换,包含的规则链有PREROUTING、POSTROUTING和OUTPUT。
filter表负责过滤数据包,包含的规则链有INPUT、OUTPUT和FORWARD。
表间优先级:raw>mangle>nat>filter
2)五链介绍
INPUT匹配目标IP是本机的数据包。
OUTPUT出口数据包,一般不在此规则链上做配置。
FORWARD匹配流经本机的数据包。
PREROUTING用来修改目的地址,可以用来做DNAT,常见的用法就是内网端口映射到外网端口。
POSTROUTING用来修改源地址用来做SNAT,常见的用法就是内网主机通过路由NAT转换功能访问外网
链间匹配顺序:入站数据PREROUTING-->INPUT;出站数据OUTPUT-->POSTROUTING;转发数据PREROUTING-->FORWARD-->POSTROUTING。
链内规则匹配顺序:自上而下依次进行匹配,直到找到相匹配的规则为止。如果在链内找不到匹配的规则,那么将按照该链的默认规则处理(未修改默认规则情况下,都是允许)。
3)iptables过滤流程
表-->链-->规则
(2).iptables语法
iptables [-t 表名] [操作命令] [链名] [规则号码] [匹配条件] [-j 匹配到之后的动作]
注意:如果不指定表明,则默认为filter
注意:使用命令的都是临时添加规则,一旦重启规则还原。如果想永久添加请将命令写入/etc/sysconfig/iptables配置文件(一条命令一行)。另外还可以在调试完iptables后使用service iptables save来保存临时规则,使其永久生效。
1)常用的操作命令
-A <链名> [具体规则内容] 在链最后追加一条规则 -D <链名> [规则号码|具体规则内容] 删除一条指定规则 -F <链名> 清空某个链的规则,除默认规则 -I <链名> [规则号码] [具体规则内容] 插入一条指定规则号码的规则,规则号码默认为1 -R <链名> [规则号码] [具体规则内容] 替换或修改指定规则号码的规则 -P <链名> [匹配到之后的动作] 设置某个链的默认规则 -L <链名> 列出某个链的所有规则 -S <链名> 以命令的形式显示规则(看不惯-L的可以使用此命令)
[具体规则内容]=[匹配条件] [-j 匹配到之后的动作]
注意:-P后面的匹配动作没有-j
2)常用的匹配条件
-p <协议> 匹配协议类型,可以是tcp,udp,udplite,icmp,esp,ah,sctp或 all -s <地址>[/掩码] 匹配来源地址,可以是IP,网段,域名,主机名或空(任何地址) -d <地址>[/掩码] 匹配目的地址,可以是IP,网段,域名,主机名或空(任何地址) -i <网络接口> 匹配数据包进入的网络接口,此参数主要用于nat表 -o <网络接口> 匹配数据包流出的接口 --sport <端口> 匹配数据包来源端口,可以是单个,也可以是范围 --dport <端口> 匹配数据包目的端口,可以是单个,也可以是范围
3)常用的动作
-j ACCEPT 允许数据包通过此链 -j DORP 阻止数据包通过此链,丢弃数据包
-j REJECT 拒绝数据包通过此链,会有回执 -j SNAT --to IP[-IP][:PORT[-PORT]] 源地址转换,支持但IP,也支持IP池 -j DNAT --to IP[-IP][:PORT[-PORT]] 目的地址转换,支持单IP,也支持IP池 -j MASQUERADE 伪装,动态源地址转换
注意:DROP直接丢弃,没有回执。REJECT拒绝通过,有回执。
4)附加
-m state --state <状态> 匹配包的状态,状态可以是NEW、RELATED、ESTABLISHED、INVALID -m mac --mac-source <MAC> 匹配数据包的来源MAC地址 -m limit --limit <速率> [--burst 缓冲数量] 按一定的速率去匹配数据包,但不会限制,除非加上动作DROP。速率的单位可以是/s、/m、/h、/d -m multiport <--sports|--dports|--ports> <端口1>[,端口2,端口3...] 一次性匹配多个端口,可以区分源端口,目的端口和普通端口
四种状态说明:
State(状态) | Explanation(注释) |
NEW | NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。 |
ESTABLISHED | ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。 |
RELATED | RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。 |
INVALID | INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。 |
这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打 开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭,这样就安全多了。
(3).实例
1)查看指定表的详细规则
[root@youxi1 ~]# iptables -t filter -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 531 39448 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 2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 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 39 packets, 6995 bytes) pkts bytes target prot opt in out source destination [root@youxi1 ~]# iptables -t filter -nvL --line Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 547 40556 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 2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 49 packets, 9019 bytes) num pkts bytes target prot opt in out source destination
加上--line可以查看规则在规则链内的编号,这样有助于插入、删除和替换的使用。
2)在指定表的指定规则链追加一条规则
[root@youxi1 ~]# iptables -t filter -A INPUT -j DROP //如果在INPUT规则链内没有符合的规则,则丢弃所有数据包,谨慎使用 [root@youxi1 ~]# iptables -t filter -nvL --line Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 653 48060 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 2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 //tcp、dpt端口为22的NEW数据包允许通过,保证ssh可以建立连接 5 1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 6 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 9 packets, 924 bytes) num pkts bytes target prot opt in out source destination
filter表中的INPUT规则链第1条和第4条保证了即使最后一条规则是抛弃,ssh也可以正常使用,当然ssh的端口得是22。如果DROP规则在第4条规则前,那么ssh就不能建立新的连接;如果DROP规则在第1条前,那么已经建立的连接也会被抛弃。这就是链内规则从上到下依次匹配,直到找到匹配的为止。
3)在指定表的指定链的指定位置插入一条规则
[root@youxi1 ~]# iptables -t filter -I INPUT 6 -j REJECT [root@youxi1 ~]# iptables -t filter -nvL --line Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 779 59067 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 4 208 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 2 458 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 6 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 7 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 6 packets, 664 bytes) num pkts bytes target prot opt in out source destination
4)删除指定表的指定链的指定位置的一条规则
[root@youxi1 ~]# iptables -t filter -D INPUT 6 [root@youxi1 ~]# iptables -t filter -nvL --line Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 877 65731 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 4 208 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 2 458 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 6 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 7 packets, 692 bytes) num pkts bytes target prot opt in out source destination
5)替换指定表的指定链的指定位置的一条规则
[root@youxi1 ~]# iptables -t filter -R INPUT 6 -j REJECT [root@youxi1 ~]# iptables -t filter -nvL --line Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 938 69875 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 4 208 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 3 687 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 6 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 4 packets, 448 bytes) num pkts bytes target prot opt in out source destination
6)修改指定表的指定链的默认规则
[root@youxi1 ~]# iptables -t filter -P INPUT DROP [root@youxi1 ~]# iptables -t filter -nvL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 1106 82675 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 5 260 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 4 916 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 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 25 packets, 2428 bytes) pkts bytes target prot opt in out source destination
7)清空指定表的所有规则
[root@youxi1 ~]# iptables -t filter -P INPUT ACCEPT [root@youxi1 ~]# iptables -t filter -F [root@youxi1 ~]# iptables -t filter -nvL Chain INPUT (policy ACCEPT 12 packets, 792 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 7 packets, 676 bytes) pkts bytes target prot opt in out source destination
上面改变了默认规则,所以,需要先改回来,否则一旦清空规则,那么会直接使用默认规则,导致无法登录。
8)使用SNAT动作,让内网主机可以上外网
环境:youxi1 外网192.168.5.101 内网192.168.6.1
youxi2 内网192.168.6.2
首先配置两台主机的内网IP,并重启network服务
这里需要注意的地方有youxi1上的内网网关和DNS不要配置,IP设置192.168.6.1,子网掩码255.255.255.0。youxi2上内网IP设置192.168.6.2,子网掩码255.255.255.0,网关设置为192.168.6.1(指向youxi1的内网IP),DNS设置一个外网可用的(114.114.114.114)。
接着在youxi1上启用路由转发功能
[root@youxi1 network-scripts]# echo "1" > /proc/sys/net/ipv4/ip_forward //临时生效 [root@youxi1 network-scripts]# vim /etc/sysctl.conf //永久生效 net.ipv4.ip_forward = 1 //添加
如果配置的永久生效还需使用如下命令,使配置生效
[root@youxi1 ~]# sysctl -p net.ipv4.ip_forward = 1
然后最好清空防火墙规则iptables -F,当然实际是FORWARD这个规则链里默认设置了一个拒绝,可以将这个拒绝规则删除。否则只能访问IP,不能访问域名
其次在youxi1上配置SNAT
[root@youxi1 ~]# iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -j SNAT --to 192.168.5.101 [root@youxi1 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all -- * * 192.168.6.0/24 0.0.0.0/0 to:192.168.5.101
当然命令还可以是iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -o ens33 -j MASQUERADE
最后,可以ping一下进行测试
注意:如果filter表中的FORWARD链中的默认拒绝规则没有清理,或youxi2上的DNS不对,那么域名是无法ping通的,但IP可以
9)使用DNAT动作,让内网端口映射到外网
环境:youxi1 外网192.168.5.101 内网192.168.6.1
youxi2 内网192.168.6.2
物理机 192.168.5.2
网络配置、路由转发、防火墙规则清理和上面一样
在youxi1上配置DNAT
[root@youxi1 ~]# iptables -t nat -A PREROUTING -d 192.168.5.101 -p tcp --dport 23 -j DNAT --to 192.168.6.2:22 [root@youxi1 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 1 packets, 229 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- 192.168.5.101 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:23 to:192.168.6.2:22 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 304 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 4 packets, 304 bytes) pkts bytes target prot opt in out source destination
命令也可以是iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 23 -j DNAT --to 192.168.6.2:22
最后测试:
(4).常用的配置文件内命令
写在配置文件/etc/sysconfig/iptables内,除ssh的端口可能有时候需要改,其他基本可以无脑加。
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -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 COMMIT