iptables的一些简单使用

查看现有的iptables规则 --line-numbers是查看行号

1
iptables -nL --line-numbers

可以使用 iptables 服务保存规则

1
2
service iptables save   
#规则将被保存至 /etc/sysconfig/iptables

使用 iptables-save 和 iptables-restore 来保存规则和还原规则

1
2
iptables-save > /etc/sysconfig/iptables.20150520
iptables-restore < /etc/sysconfig/iptables.20150520

删除iptables中INPUT表的第12条规则

1
iptables -D INPUT 12

清空所有iptables规则

1
iptables -F

开放80,22,10-21端口访问

1
2
3
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT

删除禁止80端口访问这条规则

1
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

开放icmp协议

1
iptables -I INPUT -p icmp -j ACCEPT

关闭icmp协议

1
2
iptables -I INPUT -p icmp -j DROP   #ping就会超时
iptables -I INPUT -p icmp -j REJECT #ping就会提示Destination Port Unreachable

默认禁止其他访问

1
iptables -A INPUT -j REJECT

上面配置存在的问题

  • 1.本机无法访问本机 telnet 127.0.0.1 22 有问题
  • 2.本机无法访问其他主机 curl -I http://www.baidu.com/ 有问题

允许本机访问本机

1
2
iptables -I INPUT -i lo -j ACCEPT
telnet 127.0.0.1 22 没问题了

如果主动访问外网 允许连接状态的数据回来
(允许任何 RELATED 和 ESTABLISHED 的报文访问本机)

1
2
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
curl -I http://www.baidu.com/ 没问题了
一些其他例子

只允许10.10.188.233访问80端口

1
iptables -I INPUT -p tcp -s 10.10.188.233 --dport 80 -j ACCEPT

屏蔽10.10.188.233的所有连接

1
iptables -A INPUT -s 10.10.188.233 -j DROP

禁止本机访问某些网站(使用场景:vps搭建了ss代理,禁止通过此代理访问某些网站)

1
iptables -I OUTPUT -d baidu.com -j DROP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建规则 (开放端口)
#允许本机访问
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
# 允许从22端口进入的包返回
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -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和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行

#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT

# 屏蔽ip
# 若需屏蔽整个ip段(123.0.0.1到123.255.255.254)则换为123.0.0.0/8
# 若需屏蔽ip段123.123.0.1到123.123.255.254,则换为124.123.0.0/16
# 若需屏蔽ip段123.123.123.1到123.123.123.254则换为123.123.123.0/24
# 屏蔽123.123.123.123的所有连接
iptables -I INPUT -s 123.123.123.123 -j DROP

链的基本操作


  1. 清除所有的规则。

    1. 清除预设表filter中所有规则链中的规则。
      # iptables -F

    2. 清除预设表filter中使用者自定链中的规则。
      #iptables -X
      #iptables -Z



  2. 设置链的默认策略。一般有两种方法。

    1. 首先允许所有的包,然后再禁止有危险的包通过放火墙。
      #iptables -P INPUT ACCEPT
      #iptables -P OUTPUT ACCEPT
      #iptables -P FORWARD ACCEPT

    2. 首先禁止所有的包,然后根据需要的服务允许特定的包通过防火墙。
      #iptables -P INPUT DROP
      #iptables -P OUTPUT DROP
      #iptables -P FORWARD DROP

    3. 列出表/链中的所有规则。默认只列出filter表。
      #iptables -L

    4. 向链中添加规则。下面的语句用于开放网络接口:
      #iptables -A INPUT -i lo -j ACCEPT
      #iptables -A OUTPUT -o lo -j ACCEPT
      #iptables -A INPUT -i eth0 -j ACEPT
      #iptables -A OUTPUT -o eth1 -j ACCEPT
      #iptables -A FORWARD -i eth1 -j ACCEPT
      #iptables -A FORWARD -0 eth1 -j ACCEPT
      注意:由于本地进程不会经过FORWARD链,因此回环接口lo只在INPUT和OUTPUT两个链上作用。

    5. 使用者自定义链。
      #iptables -N custom
      #iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP
      #iptables -A INPUT -s 0/0 -d 0/0 -j DROP



设置基本的规则匹配


  1. 指定协议匹配。

    1. 匹配指定协议。
      #iptables -A INPUT -p tcp

    2. 匹配指定协议之外的所有协议。
      #iptables -A INPUT -p !tcp



  2. 指定地址匹配。

    1. 指定匹配的主机。
      #iptables -A INPUT -s 192.168.0.18

    2. 指定匹配的网络。
      #iptables -A INPUT -s 192.168.2.0/24

    3. 匹配指定主机之外的地址。
      #iptables -A FORWARD -s !192.168.0.19

    4. 匹配指定网络之外的网络。
      #iptables -A FORWARD -s ! 192.168.3.0/24



  3. 指定网络接口匹配。

    1. 指定单一的网络接口匹配。
      #iptables -A INPUT -i eth0
      #iptables -A FORWARD -o eth0

    2. 指定同类型的网络接口匹配。
      #iptables -A FORWARD -o ppp+



  4. 指定端口匹配。

    1. 指定单一端口匹配。
      #iptables -A INPUT -p tcp —sport www
      #iptables -A INPUT -p udp –-dport 53

    2. 匹配指定端口之外的端口。
      #iptables -A INPUT -p tcp –-dport !22

    3. 匹配端口范围。
      #iptables -A INPUT -p tcp –-sport 22:80

    4. 匹配ICMP端口和ICMP类型。
      #iptables -A INPUT -p icmp –icimp-type 8

    5. 指定ip碎片。

      • 每个网络接口都有一个MTU(最大传输单元),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数据包(称为ip碎片)来传输,而接受方则对这些ip碎片再进行重组以还原整个包。这样会导致一个问题:当系统将大数据包划分成ip碎片传输时,第一个碎片含有完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地)。因此,检查后面的ip碎片的头部(象有TCP、UDP和ICMP一样)是不可能的。假如有这样的一条规则:

        #iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT

        并且这时的FORWARD的policy为DROP时,系统只会让第一个ip碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通过—fragment/-f 选项来指定第二个及以后的ip碎片解决上述问题。

        #iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT

        注意现在有许多进行ip碎片攻击的实例,如DoS攻击,因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。






Netfilter 与 iptables 的关系

Linux 系统在内核中提供了对报文数据包过滤和修改的官方项目名为 Netfilter,它指的是 Linux 内核中的一个框架,它可以用于在不同阶段将某些钩子函数(hook)作用域网络协议栈。Netfilter 本身并不对数据包进行过滤,它只是允许可以过滤数据包或修改数据包的函数挂接到内核网络协议栈中的适当位置。这些函数是可以自定义的。

iptables 是用户层的工具,它提供命令行接口,能够向 Netfilter 中添加规则策略,从而实现报文过滤,修改等功能。Linux 系统中并不止有 iptables 能够生成防火墙规则,其他的工具如 firewalld 等也能实现类似的功能。

使用 iptables 进行包过滤

iptables 策略是由一组有序的规则建立的,它告诉内核应该如何处理某些类别的数据包。每一个 iptables 规则应用于一个表中的一个链。一个 iptables 链就是一个规则集,这些规则按序与包含某种特征的数据包进行比较匹配。

iptables 根据功能分类,iptables 的内建有多个表,如包过滤(filter)或者网络地址转换(NAT)。iptables 中共有 4 个表:filter,nat,mangle 和 raw。filter 表主要实现过滤功能,nat 表实现 NAT 功能,mangle 表用于修改分组数据,raw 表用于修改俩节追踪的功能。

每个表都有一组内置链,用户还可以添加自定义的链。最重要的内置链是 filter 表中的 INPUT、OUTPUT 和 FORWARD 链。

1
2
3
4
5
INPUT 链:发往本机的报文
OUTPUT 链:由本机发出的报文
FORWARD 链:经由本机转发的报文
PREROUTING 链:报文到达本机,进行路由决策之前
POSTROUTING 链:报文由本机发出,进行路由决策之后

下图展现了一个数据包是如何通过内核中的 net 和 filter 表的:


下面的图来自慕课网视频截图

1
2
iptables规则组成
4


参考:
http://www.imooc.com/learn/389
https://www.91yun.org/archives/1690
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
http://jpstone.bokee.com/3630237.html
http://man.linuxde.net/iptables
https://jalena.bcsytv.com/archives/1608
http://liaoph.com/iptables/