Iptables

 

前言:公司网关为一台linux服务器,文中均为实例!

一、概述

1、Linux的防火墙体系工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。
2、种类:netfilter和iptables通常都可以用来指Linux防火墙,但二者区别如下:

 
  1. Netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”的防火墙功能体系,使用较少。 
  2. Iptables:指的是管理Linux防火墙的命令工具,程序通常位于/sbin/iptables,由用户直接使用,属于“用户态”的防火墙功能体系,通常使用的就是这个。 


3、规则表(见图1.1)

 
  1. Filter表:包含三个规则链:INPUT、FORWARD、OUTPUT 
  2. Filter表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包。 
  3. Filter表对应的内核模块为iptable_filter。 
 
  1. Nat表:包含三个规则链:PREROUTING、POSRTOUING、OUTPUT 
  2. Nat表主要用于修改数据包的IP地址,端口号等信息。 
  3. Nat表对应的内核模块为iptable_nat 
 
  1. Mangle表:包含五个规则链:、PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD 
  2. Mangle表主要用于修改数据包的TOS、TTL、以及为数据包设置Mark标记,以实现Qos调整及策略路由等应用。 
  3. Mangle表对应的内核模块为iptable_mangle 
 
  1. Raw表:包含两条规则链:OUTPUT、PREROUTING 
  2. Raw表是iptables新增加的表,主要用于决定数据包是否被状态跟踪机制处理。 
  3. Raw表对应的内核模块为iptable_raw 

4、规则链

  1. INPUT链:当接收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。 
  2. OUTPUT链:当防火墙向外发送数据包(出站)时,应用此链中的规则。 
  3. FORWARD链:当接受到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链接中的规则。 
  4. PREROUTING链:在对数据包作路由现在之前,应用此链中的规则。 
  5. POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则。 
  6. 注:其中INPUT、OUTPUT链更多应用在访问本机的进出数据的安全控制中,而FORWARD、PREROUTING、POSTROUING更多应用在当使用linux做网关的时候。 
 

 

二、工作原理首先我们需要了解当使用iptables作网关时,数据包的主要途径。Iptables的大体结构如下图1.2所示,这个图是数据包流经iptables的路径图。

 
  1. 假如数据包A流经这个网关,首先进入PREROUTING链,顺序匹配这里的规则(包括默认规则);
  2. 从这里开始需要分支: 
 
  1. 如果这个数据包A是发给LOCALHOST本机的(也就是网关本身),那么数据包A的下一站是INPUT链,
  2. 同样顺序匹配这里的规则(包括默认规则),然后进去LOCALHOST本地进程进行处理这个数据包A;
  3. 处理完成后需要回应数据包A,LOCALHOST发出的数据包B第一站是OUTPUT,然后进入POSTROUTING,
  4. 从而离开网关服务器。 
  1. 如果这个数据包A不是发给LOC ALHOST,那么数据包A的下一站是FORWARD,顺序匹配这里的规则;
  2. 然后数据包A的下一站是POSTROUTING,从而数据包A离开网关服务器; 
  3. 在这个过程中,数据包A每次经过一个链,都会顺序匹配这个链的规则,所以数据在每一个链中都有可能被丢掉。

三、管理设置iptables 1、基本语法

  
  1. Iptables  [-t 表命]  命令选项  [链名]  [匹配条件]  [-j 动作] 
  2. 表名、链名用于指定iptables命令所操作的表和链,没有指定的话,默认使用filter表; 
  3. 命令选项用于指定管理iptables规则的方式,比如插入,删除,增加,查看; 
  4. 条件匹配用于指定对符合什么样条件的数据包进行处理; 
  5. 动作指的就是对数据包的动作,如转发、丢弃、拒绝。 


2、命令选项

  1. -A  在指定链的末尾添加一条新的规则 
  2. -D  删除指定链中的某一条规则,按规则序号或内容确定要删除的规则 
  3. -I   在指定链中插入一条新的规则,若未指定插入位置,则默认在链的开头插入 
  4. -R  修改、替换指定链中的某一条规则,按规则序号或内容确定要替换的规则 
  5. -L  列出指定链中所有的规则进行查看,未指定链名,则列出表中所有的链 
  6. -F  清空指定链中的的所有规则,未指定链名,则清空表中所有链的规则 
  7. -N  新建一条用户自己定义的规则链 
  8. -X  删除指定表中用户自定义的规则链 
  9. -P  设置指定链的默认策略 
  10. -n  使用数字形式显示输出结果 
  11. -v  查看规则烈表示显示详细的信息 
  12. -V  查看iptables命令工具的版本信息 
  13. -h  查看命令帮助信息 
 
 

本文出自 “我的未来不是梦。” 博客,请务必保留此出处http://song49.blog.51cto.com/4480450/950276

<think>我们正在分析用户提供的iptables规则,并给出优化建议。用户当前的iptables规则如下:ChainINPUT(policyACCEPT3147packets,242Kbytes)pktsbytestargetprotoptinoutsourcedestination18984ACCEPTtcp--**192.168.163.1230.0.0.0/0tcpdpt:80352100DROPtcp--**0.0.0.0/00.0.0.0/0tcpdpt:80ChainFORWARD(policyACCEPT0packets,0bytes)pktsbytestargetprotoptinoutsourcedestinationChainOUTPUT(policyACCEPT3800packets,285Kbytes)pktsbytestargetprotoptinoutsourcedestination16960DROPtcp--**0.0.0.0/00.0.0.0/0tcpdpt:8000DROPtcp--**0.0.0.0/00.0.0.0/0tcpdpt:8000DROPtcp--**0.0.0.0/00.0.0.0/0tcpdpt:80从规则中我们可以观察到以下情况:1.在INPUT链中:-第一条规则:允许源IP为192.168.163.123访问本机的80端口(HTTP服务)。-第二条规则:拒绝所有其他IP访问本机的80端口。2.在OUTPUT链中:-有三条规则都是拒绝所有出站流量访问远程的80端口(即本机作为客户端去访问外部的HTTP服务)。注意,这三条规则重复了,而且由于OUTPUT链的默认策略是ACCEPT,这些规则实际上会阻止本机访问外部的80端口。问题分析:1.规则顺序问题:在INPUT链中,允许特定IP的规则在拒绝所有规则之前,这是正确的。因为规则是按顺序匹配的,先匹配允许的IP,然后拒绝其他所有IP。2.重复规则:在OUTPUT链中,有三条完全相同的DROP规则(目标端口80)。这可能是配置时多次执行了相同的命令导致的。虽然不影响功能,但会使得规则列表冗长,而且计数器分散。建议只保留一条。3.规则冗余:在OUTPUT链中,如果目的是阻止本机作为客户端访问外部的80端口,那么一条规则即可。另外,注意OUTPUT链的默认策略是ACCEPT,所以只有匹配到这条规则的流量才会被拒绝。4.规则范围:当前的规则只针对80端口,如果还有其他端口需要管理,需要添加相应规则。优化建议:1.清理重复规则:删除OUTPUT链中多余的两条DROP规则,只保留一条。2.考虑其他必要规则:通常,服务器需要允许SSH连接(默认22端口)以便远程管理。当前的规则中没有允许SSH的规则,这可能导致无法通过SSH连接(如果默认策略改为DROP的话)。但注意当前INPUT链的默认策略是ACCEPT,所以其他端口(包括SSH)都是开放的。如果是为了安全,建议将默认策略改为DROP,并显式允许需要的端口(如SSH、80等)以及允许特定IP访问80。3.允许已建立连接和回环接口:在设置默认策略为DROP时,需要添加以下规则:-允许回环接口(lo)的流量:`iptables-AINPUT-ilo-jACCEPT`-允许已建立连接和相关的流量:`iptables-AINPUT-mconntrack--ctstateESTABLISHED,RELATED-jACCEPT`4.如果服务器不需要访问外部的HTTP服务,那么OUTPUT链中阻止80端口是合理的。但通常服务器可能需要访问外部的HTTP服务(例如下载更新),所以需要谨慎。5.保存规则:优化后,使用`iptables-save`(或根据发行版使用持久化工具)保存规则,防止重启后丢失。具体优化步骤:假设我们想要实现:-允许特定IP(192.168.163.123)访问本机80端口。-允许所有IP访问本机SSH端口(22)?注意:这里需要明确,如果只允许特定IP访问SSH,那么需要添加规则。但当前规则中没有涉及SSH,所以默认是开放的。如果为了安全,建议限制SSH的访问IP。-拒绝其他所有访问本机80端口的流量。-允许本机访问外部的其他端口(如443),但阻止80(根据需求决定)。步骤:1.备份当前规则:`iptables-save>/root/iptables.bak`2.清除所有规则(注意:如果通过SSH连接,清除规则可能导致断开,所以先设置默认策略为ACCEPT):```iptables-PINPUTACCEPTiptables-PFORWARDACCEPTiptables-POUTPUTACCEPTiptables-Fiptables-X```3.设置默认策略(根据需求,我们设置INPUT为DROP,但注意先允许SSH和已有连接):```iptables-PINPUTDROPiptables-PFORWARDDROPiptables-POUTPUTACCEPT#或者DROP,但通常OUTPUT可以ACCEPT,再根据需求拒绝特定端口```4.添加必要的规则(按顺序):```#允许回环iptables-AINPUT-ilo-jACCEPT#允许已建立连接和相关的流量iptables-AINPUT-mconntrack--ctstateESTABLISHED,RELATED-jACCEPT#允许SSH(这里为了安全,建议只允许特定IP,比如192.168.163.123,如果用户需要)iptables-AINPUT-ptcp--dport22-jACCEPT#或者替换为-s192.168.163.123#允许特定IP访问80iptables-AINPUT-s192.168.163.123-ptcp--dport80-jACCEPT#拒绝其他所有访问80的流量(注意:因为默认策略是DROP,所以其实不需要单独拒绝80,但为了明确,可以添加一条日志记录再拒绝,或者直接由默认策略拒绝)#如果只拒绝80,而其他端口由默认策略拒绝,那么可以不用单独写拒绝80的规则。但如果想明确拒绝80并记录日志,可以:#iptables-AINPUT-ptcp--dport80-jLOG--log-prefix"IPTABLES-DROP:"#iptables-AINPUT-ptcp--dport80-jDROP#但注意,如果默认策略是DROP,那么所有没有匹配到ACCEPT规则的流量都会被丢弃,所以不需要为每个端口单独写DROP规则。#因此,上面的规则已经实现了:允许特定IP访问80,其他IP访问80会被默认策略丢弃(因为没有匹配到任何ACCEPT规则)。但是,这样也会丢弃其他所有端口的访问(除了22和已建立的连接)。所以,如果还有其他的服务端口需要开放,需要添加相应的规则。#另外,在OUTPUT链中,如果我们要阻止本机访问外部的80端口,添加:iptables-AOUTPUT-ptcp--dport80-jDROP#注意:只保留一条即可。```5.删除重复的OUTPUT规则(在优化过程中,我们只添加了一条)。6.保存规则(根据系统不同):-Ubuntu:安装`iptables-persistent`,然后`netfilter-persistentsave`-CentOS:`serviceiptablessave`或`iptables-save>/etc/sysconfig/iptables`注意:在修改规则时,如果通过SSH连接,一定要确保在设置默认策略为DROP之前,已经放行了SSH端口,否则会断开连接。根据用户当前的规则,他们可能只需要管理80端口,但忽略了SSH和其他端口。因此,在优化时要考虑全面。另外,用户可能没有意识到默认策略是ACCEPT,这样其他端口都是开放的,存在安全隐患。建议将默认策略改为DROP,并只开放必要的端口。最后,生成相关问题。</think>### iptables 规则解析与优化建议 #### 当前规则分析(基于 `iptables -L -v -n` 输出) ```mermaid graph TD A[INPUT链] --> B[允许192.168.163.123访问80端口] A --> C[拒绝所有其他IP访问80端口] D[OUTPUT链] --> E[重复3条拒绝所有出站80端口规则] F[FORWARD链] --> G[无规则] ``` 1. **INPUT 链(入站流量)**: - 允许特定 IP `192.168.163.123` 访问 TCP 80 端口(HTTP) - 拒绝其他所有 IP 访问 TCP 80 端口 - **问题**:未处理其他端口流量(默认策略 ACCEPT 存在安全风险) 2. **OUTPUT 链(出站流量)**: - 3条完全相同的规则拒绝所有出站 TCP 80 端口访问 - **问题**:规则重复(只需1条),且未考虑 HTTPS(443) 等必要端口 3. **FORWARD 链(转发流量)**: - 无任何规则(策略 ACCEPT) - **问题**:若启用转发功能存在安全风险 #### 优化建议 ##### 1. 修复规则顺序问题 ```bash # 正确顺序:先允许特定IP,再拒绝所有 sudo iptables -I INPUT 1 -s 192.168.163.123 -p tcp --dport 80 -j ACCEPT sudo iptables -I INPUT 2 -p tcp --dport 80 -j DROP ``` ##### 2. 清理冗余规则 ```bash # 删除重复的OUTPUT规则(保留第一条) sudo iptables -D OUTPUT 1 # 删除第一条DROP规则 sudo iptables -D OUTPUT 1 # 删除第二条(原第三条) sudo iptables -D OUTPUT 1 # 删除第三条(原第四条) # 添加单条有效规则 sudo iptables -A OUTPUT -p tcp --dport 80 -j DROP ``` ##### 3. 增强安全基线配置 ```bash # 设置默认拒绝策略 sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP # 允许已建立连接和回环接口 sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -i lo -j ACCEPT # 允许必要服务(SSH) sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许ICMP(ping) sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT ``` ##### 4. 优化OUTPUT链 ```bash # 允许访问外部HTTP/HTTPS sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT # 允许DNS解析 sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT ``` #### 最终优化后规则示例 ```bash Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 in: lo ACCEPT tcp -- 192.168.163.123 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ``` #### 规则验证命令 1. 检查规则顺序: ```bash sudo iptables -L -v -n --line-numbers ``` 2. 测试规则效果: ```bash # 测试允许IP访问80端口 curl -I http://your-server --interface 192.168.163.123 # 测试其他IP被拒绝 curl -I http://your-server ``` 3. 保存规则(Ubuntu): ```bash sudo netfilter-persistent save ``` #### 性能优化技巧 1. **使用IP集合** 处理多IP: ```bash sudo ipset create allowed_ips hash:ip sudo ipset add allowed_ips 192.168.163.123 sudo iptables -A INPUT -m set --match-set allowed_ips src -p tcp --dport 80 -j ACCEPT ``` 2. **连接跟踪优化**: ```bash sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP ``` 3. **限制访问频率**(防DDoS): ```bash sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT ``` > 建议操作前备份规则:`sudo iptables-save > iptables-backup.rules`[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值