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

  

posted @ 2019-05-29 17:17  苦逼运维  阅读(981)  评论(0编辑  收藏  举报