第7章:网络---iptables命令与netfilter

iptables命令与netfilter https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables/page/2 ==================================================================================== netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。 iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。 netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。 Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能: 网络地址转换(Network Address Translate) 数据包内容修改 以及数据包过滤的防火墙功能
常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING

四表五链(filter表、nat表、mangle表、raw表)、(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING) filter表:负责过滤功能,防火墙;内核模块:iptables_filter nat表:network address translation,网络地址转换功能;内核模块:iptable_nat mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle raw表:关闭nat表上启用的连接追踪机制;iptable_raw 表(功能)<–> 链(钩子): raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有) filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT 优先级次序(由高而低): raw –> mangle –> nat –> filter 4张表中的规则处于同一条链的目前只有output链,它就是传说中海陆空都能防守的关卡。 PREROUTING 的规则可以存在于:raw表,mangle表,nat表。 INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。 FORWARD 的规则可以存在于:mangle表,filter表。 OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。 POSTROUTING 的规则可以存在于:mangle表,nat表。

iptables命令参数 -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter) -L选项,查看-t选项对应的表的规则 -v选项,查看出更多的、更详细的信息 详细信息的说明详见 https://www.zsythink.net/archives/1493 -n选项,表示不对IP地址进行名称反解,直接显示IP地址 –-line-numbers即可显示规则的编号 -x选项,表示显示精确的计数值(-v选项显示的详细信息,当数值较大时,可能会自动进行单位换算,使用-x则显示精确数值) -N选项可以创建自定义链 -I表示insert,表示在链的首部插入规则。 -A表示append,表示在链的尾部追加规则 -s为source之意,表示源地址。 -j选项,指明当”匹配条件”被满足时,所对应的动作 -D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则 -F选项为flush之意,即冲刷指定的链。此操作相当于删除操作,在没有保存iptables规则的情况下,请慎用。 -R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行) 使用-R选项修改规则时,必须指明规则原本的匹配条件,那么我们则可以理解为,只能通过-R选项修改规则对应的动作了,所以我觉得,如果你想要修改某条规则,还不如先将这条规则删除,然后在同样位置再插入一条新规则,这样更好,当然,如果你只是为了修改某条规则的动作,那么使用-R选项时,不要忘了指明规则原本对应的匹配条件。

iptables基本匹配条件;iptables扩展匹配条件(tcp扩展模块、multiport扩展模块、udp扩展模块、icmp扩展模块、iprange模块、string模块、time模块、connlimit模块、limit模块、state扩展模块) =================================================================================================== 基本匹配条件 -s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。 iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT -d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。 iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT -p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh) iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT -i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。 iptables -t filter -I INPUT -p icmp -i eth4 -j DROP iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP -o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。 iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP 扩展匹配条件 tcp扩展模块:当使用-p选项指定了报文的协议时,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件, iptables默认会调用与-p选项对应的协议名称相同的模块。所以-m有时是可以省略的。 –sport:用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围 #示例 iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT –dport:用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围 #示例 iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT –tcp-flags:用于匹配报文的tcp头的标志位 #示例 iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT –syn:用于匹配tcp新建连接的请求报文,相当于使用”–tcp-flags SYN,RST,ACK,FIN SYN” #示例 iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT multiport扩展模块:”–dports扩展条件”并不属于”tcp扩展模块”,而是属于”multiport扩展模块” -p tcp -m multiport –sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开 -p udp -m multiport –dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开 #示例 iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT udp扩展模块 –sport:匹配udp报文的源地址 –dport:匹配udp报文的目标地址 #示例 iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT #可以结合multiport模块指定多个离散的端口 icmp扩展模块 –icmp-type:匹配icmp报文的具体类型 #示例 iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT iprange模块:指定一段连续的IP地址范围 –src-range:指定连续的源地址范围 –dst-range:指定连续的目标地址范围 #示例 iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP string模块:指定要匹配的字符串 –algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。 –string:指定需要匹配的字符串 #示例 iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT time模块:根据时间段区匹配报文 –timestart:用于指定时间范围的开始时间,不可取反 –timestop:用于指定时间范围的结束时间,不可取反 –weekdays:用于指定”星期几”,可取反 –monthdays:用于指定”几号”,可取反 –datestart:用于指定日期范围的开始日期,不可取反 –datestop:用于指定日期范围的结束时间,不可取反 #示例 iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT connlimit 模块:限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。 –connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。 –connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制,如果不明白可以参考上文的详细解释。 #示例 iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT limit模块:对”报文到达速率”进行限制 –limit-burst:类比”令牌桶”算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了”令牌桶”的概念,方便回顾。 –limit:类比”令牌桶”算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。 #示例 #注意,如下两条规则需配合使用,具体原因上文已经解释过,忘记了可以回顾。 iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT iptables -t filter -A INPUT -p icmp -j REJECT state扩展模块 NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。 ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。 RELATED:从字面上理解RELATED译为关系 INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。 UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。 使用state扩展模块解决,我们只要放行状态为ESTABLISHED的报文即可,因为如果报文的状态为ESTABLISHED,那么报文肯定是之前发出的报文的回应,如果你还不放心,可以将状态为RELATED或ESTABLISHED的报文都放行,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙 iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables处理动作;iptables扩展动作 ======================================================================== 处理动作 处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。 ACCEPT:允许数据包通过。 DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。#不进行响应 REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。#即提示"端口不可达" SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。 MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。 DNAT:目标地址转换。 REDIRECT:在本机做端口映射。 LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。 ---------------------------------------------------------------------------- 扩展动作:扩展动作可以直接使用,不用像使用”扩展匹配条件”那样指定特定的模块。 REJECT动作 –reject-with:当没有明确设置–reject-with的值时,默认提示信息为icmp-port-unreachable,即端口不可达 iptables -I INPUT 2 -j REJECT --reject-with icmp-host-unreachable LOG动作 –log-level选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。 –log-prefix选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。 如果想要NAT功能能够正常使用,需要开启Linux主机的核心转发功能。 echo 1 > /proc/sys/net/ipv4/ip_forward SNAT相关操作 配置SNAT,可以隐藏网内主机的IP地址,也可以共享公网IP,访问互联网,如果只是共享IP的话,只配置如下SNAT规则即可。 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP 如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作,如下命令表示将10.1网段的报文的源IP修改为eth0网卡中可用的地址。 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE DNAT相关操作 配置DNAT,可以通过公网IP访问局域网内的服务。 注:理论上来说,只要配置DNAT规则,不需要对应的SNAT规则即可达到DNAT效果。 但是在测试DNAT时,对应SNAT规则也需要配置,才能正常DNAT,可以先尝试只配置DNAT规则,如果无法正常DNAT,再尝试添加对应的SNAT规则,SNAT规则配置一条即可,DNAT规则需要根据实际情况配置不同的DNAT规则。 iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 私网IP:端口号 iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 8080 -j DNAT --to-destination 10.1.0.1:80 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP 在本机进行目标端口映射时可以使用REDIRECT动作。 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 #配置完成上述规则后,其他机器访问本机的80端口时,会被映射到8080端口。

查看规则;插入规则;修改规则 =================================================================================== 查看规则 -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter) -L选项,查看-t选项对应的表的规则 -v选项,查看出更多的、更详细的信息 -n选项,表示不对IP地址进行名称反解,直接显示IP地址 –-line-numbers即可显示规则的编号 -x选项,表示显示精确的计数值(-v选项显示的详细信息,当数值较大时,可能会自动进行单位换算,使用-x则显示精确数值) sudo iptables -t filter -nvxL Forbidden_ssh_open_vpn --line-number 查看表 iptables -L #默认查看filter表 iptables -t raw -L iptables -t mangle -L iptables -t nat -L 查看表的某链 iptables -L INPUT #查看filter表的INPUT链 iptables -nvL INPUT #查看filter表的INPUT链,-v显示详细信息,-n不进行反向解析 示例: iptables -t 表名 -L #查看对应表的所有规则,-t选项指定要操作的表,省略”-t 表名”时,默认表示操作filter表,-L表示列出规则,即查看规则。 iptables -t 表名 -L 链名 #查看指定表的指定链中的规则。 iptables -t 表名 -v -L #查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出”计数器”的信息 iptables -t 表名 -vL iptables -t 表名 -n -L #表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。 iptables --line-numbers -t 表名 -L #表示查看表的所有规则,并且显示规则的序号,–line-numbers选项表示显示规则的序号 iptables -t 表名 -v -x -L #表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值 iptables --line -t filter -nvxL iptables --line -t filter -nvxL INPUT -------------------------------------------------------------------------------------- 插入规则 -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter) -I表示insert,表示在链的首部插入规则。 -A表示append,表示在链的尾部追加规则 -s为source之意,表示源地址。 -j选项,指明当”匹配条件”被满足时,所对应的动作 iptables -t 表名 -A 链名 匹配条件 -j 动作 #在指定表的指定链的尾部添加一条规则 iptables -t 表名 -I 链名 匹配条件 -j 动作 #在指定表的指定链的首部添加一条规则 iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作 #在指定表的指定链的指定位置添加一条规则 sudo iptables -t filter -I INPUT -s 192.168.254.6 -j ACCEPT sudo iptables -t filter -I INPUT 2 -s 192.168.254.6 -j ACCEPT #插入的规则为第二条 sudo iptables -t filter -A INPUT -s 192.168.254.6 -j ACCEPT sudo iptables -t filter -I Forbidden_ssh_open_vpn 2 -s 192.168.254.6 -j ACCEPT #插入规则时,可以在链后面指定数值,即将插入的规则放在第几条;例如此处为2,即新规则插入后为第2条 sudo iptables -t filter -I Forbidden_ssh_open_vpn -s 192.168.254.6 -j ACCEPT ---------------------------------------------------------------------------------------- 修改规则 -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter) -R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行) 使用-R选项修改规则时,必须指明规则原本的匹配条件,那么我们则可以理解为,只能通过-R选项修改规则对应的动作了,所以我觉得,如果你想要修改某条规则,还不如先将这条规则删除,然后在同样位置再插入一条新规则,这样更好,当然,如果你只是为了修改某条规则的动作,那么使用-R选项时,不要忘了指明规则原本对应的匹配条件。 -P选项指定要修改的链的默认策略 iptables -t 表名 -R INPUT 1 -s 192.168.254.6 -j ACCEPT iptables -t 表名 -P FORWARD DROP iptables -t 表名 -P 链名 动作 #设置指定表的指定链的默认策略(默认动作),并非添加规则。 iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作 #修改指定表中指定链的指定规则 若要设置黑名单,推荐将白名单的最后一条规则设置为所有都拒绝,而不建议将默认动作修改为DROP。此时操作了一次-F,清空了规则表,那么相当于坑了自己,所有IP都不能登录管理了。

删除规则;保存规则;重载规则 ========================================================================= 删除规则 -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter) -D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则 -F选项为flush之意,即冲刷指定的链。此操作相当于删除操作,在没有保存iptables规则的情况下,请慎用。 iptables -t 表名 -D 链名 规则序号 #按照规则序号删除规则,删除指定表的指定链的指定规则 iptables -t 表名 -D 链名 匹配条件 -j 动作 #按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。 iptables -t 表名 -F 链名 #删除指定表中对应链中的规则 iptables -t 表名 -F #删除指定表中的所有规则 方法1:根据规则的编号去删除规则 sudo iptables -t filter -D INPUT 3 方法2:根据具体的匹配条件与动作删除规则 sudo iptables -t filter -D Forbidden_ssh_open_vpn -s 192.168.254.6 -j ACCEPT 方法3:清空表的所有链规则,很危险。。。 iptables -t 表名 -F #清空整张表 iptables -t 表名 -F 链名 #清空指定表的某链 ------------------------------------------------------------------------ 保存规则(上面的修改方式都是临时的) centos6: service iptables save 使用”service iptables save”命令即可保存规则,规则默认保存在/etc/sysconfig/iptables文件中。当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样 centos7: 我们需要yum源安装iptables与iptables-services(iptables一般会被默认安装,但是iptables-services在centos7中一般不会被默认安装) 在centos7中安装完iptables-services后,即可像centos6中一样,通过service iptables save命令保存规则了,规则同样保存在/etc/sysconfig/iptables文件中。 centos7配置iptables-service的步骤: #配置好yum源以后安装iptables-service # yum install -y iptables-services #停止firewalld # systemctl stop firewalld #禁止firewalld自动启动 # systemctl disable firewalld #启动iptables # systemctl start iptables #将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务 # systemctl enable iptables 其他通用方法: iptables-save命令;使用iptables-save并不能保存当前的iptables规则,但是可以将当前的iptables规则以”保存后的格式”输出到屏幕上。所以,我们可以使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。 iptables-save > /etc/sysconfig/iptables -------------------------------------------------------------------------- 重载规则: 我们可以将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。 iptables-restore命令 iptables-restore < /etc/sysconfig/iptables #再次提醒:重载规则时,现有规则将会被覆盖。
#注意,这只是加载到临时iptables
iptables-save > iptables_20220224.bak #备份iptabes rules
iptables-restore < iptables_20220224.bak #恢复iptables rules

iptables自定义链;iptables作为网络防火墙 ===================================================================== iptables自定义链 当默认链中的规则非常多时,不方便我们管理。 想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。 -N选项可以创建自定义链 -E选项可以修改自定义链名 -X选项可以删除自定义链,但是删除自定义链时,需要满足两个条件: 1、自定义链没有被任何默认链引用,即自定义链的引用计数为0。 2、自定义链中没有任何规则,即自定义链为空。 创建自定义链 #示例:在filter表中创建IN_WEB自定义链 iptables -t filter -N IN_WEB 引用自定义链 #示例:在INPUT链中引用刚才创建的自定义链 iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB 重命名自定义链 #示例:将IN_WEB自定义链重命名为WEB iptables -E IN_WEB WEB 删除自定义链 删除自定义链需要满足两个条件 1、自定义链没有被引用 2、自定义链中没有任何规则 #示例:删除引用计数为0并且不包含任何规则的WEB链 iptables -X WEB -------------------------------------------------------------------------------------------------- iptables作为网络防火墙 #如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文。 #使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启 cat /proc/sys/net/ipv4/ip_forward #使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。 方法一:echo 1 > /proc/sys/net/ipv4/ip_forward 方法二:sysctl -w net.ipv4.ip_forward=1 #使用如下方法开启核心转发功能,重启网络服务后永久生效。 配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1 #由于iptables此时的角色为"网络防火墙",所以需要在filter表中的FORWARD链中设置规则。 #可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。 #配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。 #示例为允许网络内主机访问网络外主机的web服务与sshd服务。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT #可以使用state扩展模块,对上述规则进行优化,使用如下配置可以省略许多"回应报文放行规则"。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 一些注意点: 1、当测试网络防火墙时,默认前提为网络已经正确配置。 2、当测试网络防火墙时,如果出现问题,请先确定主机防火墙规则的配置没有问题。

iptables常用配置心得小结 1、规则的顺序非常重要。 如果报文已经被前面的规则匹配到,IPTABLES则会对报文执行对应的动作,通常是ACCEPT或者REJECT,报文被放行或拒绝以后,即使后面的规则也能匹配到刚才放行或拒绝的报文,也没有机会再对报文执行相应的动作了(前面规则的动作为LOG时除外),所以,针对相同服务的规则,更严格的规则应该放在前面。 2、当规则中有多个匹配条件时,条件之间默认存在”与”的关系。 如果一条规则中包含了多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。 3、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。 在没有顺序要求的情况下,不同类别的规则,被匹配次数多的、匹配频率高的规则应该放在前面。 4、当IPTABLES所在主机作为网络防火 墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。 5、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。
-m 使用iptables模块模块
-m comment #使用comment扩展模块,用于增加注释
-m tcp #使用tcp模块模块,例如 --dport 就需要用到tcp扩展模块
iptables扩展模块---帮助
iptables -m comment -h
iptables -m physdev -h
iptables -m tcp -h #并不是所有显示的内容都是扩展模块的帮助,只有后半段“match option”内容才是扩展模块的帮助内容
iptables匹配physdev
https://blog.csdn.net/sinat_20184565/article/details/124392500
physdev匹配帮助信息如下。
–physdev-in 匹配报文入方向虚拟网桥的物理接口名称,最后的字符+匹配随后的任何字符。
–physdev-out 匹配报文出方向虚拟网桥的物理接口名称。
–physdev-is-in 匹配由网桥接收到的报文,
–physdev-is-out 匹配由网桥发送的报文。
–physdev-is-bridged 匹配在网桥内部中转发的报文,仅在FORWARD和POSTROUTING点有效。
iptables nat的实现根基:conntrack
https://blog.csdn.net/qq_43684922/article/details/127346084
conntrack 是 Linux 下的一个内核模块,这个名字是 connection track 的缩写, 顾名思义,这个模块就是用来做连接跟踪的。
我们知道NAT是在连接跟踪的基础上实现的,所以连接跟踪肯定是在NAT之前建立的。从这里注册的钩子函数的优先级可以看到,NAT的优先级是NF_IP_PRI_NAT_SRC = -100而连接跟踪的优先级是NF_IP_PRI_CONNTRACK = -200,在Netfilter框架中优先级数值越小,优先级越高,越先被调用。所以可以看到NAT是在连接跟踪建立之后进行的。

如何追踪Iptables的规则 https://blog.csdn.net/joker_zhou/article/details/125653153 https://blog.csdn.net/qq_43684922/article/details/126815699 加载模块 modprobe nf_log_ipv4 打开IPV4的日志 sysctl net.netfilter.nf_log.2=nf_log_ipv4 修改/etc/rsyslog.conf的messages文件输出内容 cat /etc/rsyslog.conf | grep -e "^kern" kern.*;*.info;mail.none;authpriv.none;cron.none /var/log/messages 1 2 这里是指将/etc/rsyslog.conf的 /var/logs/messages 行增加 kern.*,将追踪的信息添加到/var/log/messages文件上 重启日志 systemctl restart rsyslog 1 增加Iptables的规则(例如) 插入 Trace动作, 该动作只能在 PREROUTING和OUTPUT的RAW表中插入, iptables -t raw -A PREROUTING -p icmp -j TRACE iptables -t raw -A OUTPUT -p icmp -j TRACE 1 2 查看/var/log/messages日志文件输出即可
参考文档:
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!