Iptables是Linux管理员用来设置IPv4包过滤条件和NAT的命令行工具。本文详细介绍了Linux的iptables命令,很不错,有一定的参考价值。有需要的请参考。
Iptables是Linux管理员用来设置IPv4包过滤条件和NAT的命令行工具。Iptables工具运行在用户模式,主要是设置各种规则。而netfilter运行在内核状态,执行那些设置好的规则。
查看 iptables 的链和规则
查看规则的命令格式为:
iptables [-t表] [-L] [-nv]
-t:后跟表,如nat或filter。如果省略此项,将使用默认过滤器。
-L:列出某个表的所有链或者某个链的规则。
-n:直接显示IP会快很多。
-v:列出更多信息,包括通过此规则的数据包总数、相关网络接口等。
列出过滤表输入链的规则:
$ sudo iptables -L输入
列出nat表的三个链的规则:
$ sudo iptables -t nat -L -n
列出过滤表的三个链的规则:
$ sudo iptables -L
红框中的内容是链的名称及其默认策略。过滤器表中所有链的默认策略是接受。红框下面的线代表什么?
目标:表示采取的行动。接受意味着释放,拒绝意味着拒绝,丢弃意味着丢弃数据包。
端口:代表使用的协议,主要包括tcp、udp、icmp。
Opt:附加选项说明。
Source:规则指向的源IP。
目标:规则的目标IP。
因为默认情况下没有添加自定义规则,所以上图中的所有行下面都是空的。
清除本机防火墙规则
清除规则的命令格式如下:
iptables [-t tables] [-FXZ]
-F:清除所有已建立的规则。
-X:删除所有用户定义链(表)
-Z:将所有链计数和流量统计清除为零。
如果我们想要制定一套防火墙规则,我们通常会先清除现有的规则,然后从头开始创建新的规则。让我们清除本机过滤器表中的所有规则:
$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -Z
定义默认策略(policy)
如果数据包与链中的任何规则都不匹配,将为该数据包实施链的默认策略,默认策略可以是ACCEPT或DROP。
链中默认策略的存在允许我们在设计防火墙时有两种选择:
将默认策略设置为丢弃所有数据包,然后添加一个规则来接受来自可信IP地址的数据包,或来自我们的服务侦听的端口(如bittorrent、FTP服务器、Web服务器、Samba文件服务器等)的数据包。
将默认策略设置为接受所有数据包,然后添加一个丢弃特定数据包的规则。比如来自一些恶意IP的数据包,或者访问一些我们不提供公共服务的端口的数据包。
通常,上面的第一个选项用于输入链,因为我们想要控制访问资源。而第二个选项经常用在输出链中,因为我们通常信任离开机器的数据包(数据包来自机器)。
设置默认策略的命令格式如下:
iptables[-t table]-P[输入,输出,转发][接受,丢弃]
P选项用于定义默认策略。注意这是大写字母p,ACCEPT表示接受数据包,DROP表示丢弃数据包。
一般来说,我们会把过滤表的输入链的默认策略做得更严格一些,比如设置为DROP。而转发和输出可以放松并设置为接受。例如,我们可以通过以下命令将过滤器表的输入链的默认策略设置为DROP:
$ sudo iptables -P输入下降
添加规则
我们可以通过规则匹配数据包,具体匹配条件包括IP、网段、网络接口、传输协议(tcp、udp等。).
添加规则的命令格式如下:
iptables[-ai chain][-io interface][-p协议] [-s源IP] [-d目标IP]-j[接受、丢弃、拒绝、记录]
-A:为一个规则链添加一个规则,新添加的规则排在已有规则之后。
-I:为一个规则链插入一个规则,可以指定链中新插入的规则的序号。如果不指定序号,新规则将成为第一个规则。
-i:指定数据包进入的网络接口,如eth0、lo等。需要和输入链配合使用。
-o:指定传出数据包的网络接口,它需要与输出链一起使用。
-p:指定此规则适用于哪个网络协议(常用的协议有tcp、udp、icmp和适用于所有协议的所有手段)。
-s:指定数据包的源IP/网段。您可以指定一个IP,如192.168.1.100,也可以指定一个网段,如192.168.1.0/24。还是可以通过的!表示没有,比如!192.168.1.0/24表示192.168.1.0/24以外的数据包。
-d:指定数据包的目的IP/网段,其他同-s选项。
-j:指定匹配成功后的行为,主要包括接受、丢弃、拒绝和日志。
我们来看几个例子。
打开本地接口lo:
$ sudo iptables -A输入-i lo -j接受
上述命令假设l0接口是一个可信设备,所有进出该接口的数据包都将被接受。
请注意,在上面的命令中没有设置-s和-d等参数。事实上,没有指定的参数表明可以接受该参数的任何值。
完全释放一个接口。
类似于lo接口,如果您完全信任一个接口,您可以像设置lo一样设置它:
$ sudo iptables -A输入-i eth1 -j接受
仅接受来自内部网网段的数据包:
$ sudo iptables -A输入-i eth2 -s 192.168.10.0/24 -j接受
接受/丢弃来自指定IP的数据包:
$ sudo iptables -A输入-i eth3 -s 192.168.100.5 -j接受
$ sudo iptables-A INPUT-I eth 3-s 192 . 168 . 100 . 6-j DROP
然后看看过滤表的规则:
$ sudo iptables -L -v
Iptables-save命令提供了另一种风格的输出:
$ sudo iptables-保存
在规则中使用端口号。
在我们添加的规则中,经常需要指定网络协议(tcp,udp等。)和相关的端口号。基本命令格式如下:
iptables[-ai chain][-io interface][-p TCP,UDP] [-s源IP] [ - sport端口范围] [-d目标IP][-d端口范围]-j[接受,丢弃,拒绝]
- sport:受限源的端口号,可以是单个端口,也可以是一个范围,比如1024:1050。
- dport:受限目标的端口号。
注意,因为只有 tcp 协议和 udp 协议使用了端口号,所以在使用 --sport 和 --dport 时,一定要指定协议的类型(-p tcp 或 -p udp)。
这里有几个例子。
丢弃所有通过tcp协议访问本机端口21的数据包:
$ sudo iptables-A INPUT-I eth 0-p TCP-dport 21-j DROP
从访问本地ssh端口的192.168.1.0/24的端口1024:65535丢弃数据包:
$ sudo iptables-A INPUT-I eth 0-p TCP-s 192 . 168 . 1 . 0/24-sport 1024:65535-d port ssh-j DROP
通用插件模块
在linux内核2.2之前,使用ipchains管理防火墙时,需要控制数据包的进出方向。
例如,当连接到远程主机的端口22时,必须设置两条规则:
本地端口1024:65535到远程端口22必须释放(输出链);
远程主机端口22到本地端口1024:65535必须释放(输入链);
这个很麻烦。例如,如果您想要连接10台远程主机的22个端口,即使您的本地输出设置为ACCEPT,
您仍然需要添加10个输入接受规则,以接受来自这10台远程主机的22端口数据包(输入的默认策略是DROP)。
Iptables解决了这个问题,它会通过一个状态模块对其进行分析:这个数据包是您想要输入的对您发送的请求的响应吗?如果判断是对自己请求的响应,就释放这个包。
使用状态模块的基本命令格式如下:
iptables-输入[-m状态] [ -状态无效、已建立、新、相关]
-m:指定iptables的插件模块。通用模块包括:
状态:状态模块
Mac:处理网卡硬件地址的模块。
- state:指定数据包的状态。常见的状态有:
无效:无效的数据包状态
已建立:成功连接的数据包状态。
NEW:要为其建立新连接的数据包的状态。
相关:这是最常用的一个。意味着该数据包与我们的主机发送的数据包相关。
这里有几个例子。
只要连接已经建立或相关数据包被接受:
$ sudo iptables -A输入-m状态-状态相关,ESTABLISHED -j接受
只要是非法数据包,就将其丢弃:
$ sudo iptables-A INPUT-m state-state无效-j DROP
保存iptables的配置
请注意,我们通过iptables命令设置的规则存储在内存中,这意味着当系统重新启动时,所有配置都将丢失。
我们可以通过iptables-save命令将iptables的配置保存到一个文件中:
$ sudo touch /etc/iptables.conf
$ sudo chmod 666/etc/iptables . conf
$ sudo iptables-save/etc/iptables . conf
必要时,通过iptables-restore命令导入文件中的配置信息:
$ sudo iptables-restore/etc/iptables . conf
总结
Iptables是一个复杂的命令,本文只介绍一些基本用法。接下来,我们将介绍如何通过iptables构建基本的防火墙配置和NAT服务器。
参考:
netfilter/iptables文档
iptables手册页
Ubuntu IptablesHowTo
Iptables教程
总结
以上是边肖为您介绍的Linux iptables命令。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!