当前位置:首页 > 前端开发 > 正文

iptables怎么禁止转发和复制,怎么设置?

iptables中禁止转发和复制,核心操作集中在FORWARD链的策略控制上——把默认策略设为DROP,再按需放行特定流量,同时配合端口限制阻断数据复制通道。这是防火墙最基础的隔离手段,也是内网安全的第一道闸门,下面直接进入正题,把命令、场景和坑一次说清楚。

iptables禁止转发怎么设置:FORWARD链的默认策略是核心

很多人以为iptables禁用转发就是改一个开关,实际上要动的是FORWARD链,这条链管的是“路过本机但不属于本机的数据包”,也就是路由器转发功能,默认情况下,Linux的FORWARD链是ACCEPT,意味着只要开了IP转发,机器就是一台无差别路由器。

先把FORWARD链默认策略改成DROP

执行下面这条命令,让所有未经明确允许的转发行为直接丢弃:

iptables -P FORWARD DROP

这条命令只改默认策略,不影响已经存在的规则,改完之后,所有转发数据包默认被拦下,除非有显式规则放行,这也是行业共识里最稳妥的起步方式:先全部禁止,再逐个白名单

按需放行:只允许指定源和目标地址转发

默认策略改完,需要手动放行哪些流量呢?假设内网有台代理服务器,只允许它访问外网,其他机器一律禁止:

iptables -A FORWARD -s 192.168.1.100 -j ACCEPT

这条规则放行源地址为192.168.1.100的所有转发流量,如果还想限制目标端口,比如只允许访问443端口:

iptables -A FORWARD -s 192.168.1.100 -p tcp --dport 443 -j ACCEPT

规则按顺序匹配,先放行特定流量,最后落到默认DROP。顺序不对,规则就废了,这一点后面专门讲。

验证规则是否生效

配置完别急着走,用两个命令确认状态:

  • iptables -L FORWARD -n -v:查看FORWARD链的规则和计数器,看有没有数据包被丢弃。
  • sysctl net.ipv4.ip_forward:确认IP转发开关状态,取值为1才代表转发功能开启。

如果计数器显示DROP的数字不断增长,说明规则正在起作用,如果数字一直为零,要么是流量没走到这台机器,要么是规则顺序把流量提前放行了。

iptables禁止复制:从端口和内网隔离两个层面堵住数据外流

“禁止复制”这个说法稍微有点抽象,防火墙层面禁的不是文件系统里的copy命令,而是阻断承载复制行为的网络通道,比如通过SCP、FTP、SMB把文件从内网复制到外网,本质上都是走特定端口的数据转发,把端口堵死,数据就复制不出去。

iptables怎么禁止转发和复制,怎么设置? 第1张

禁止复制不等于禁止一切流量,先想清楚要堵哪些通道

常见的文件传输和数据复制通道有以下几条,需要逐一评估:

  • SSH文件传输(SCP/SFTP):走22端口,是Linux环境最常见的文件复制方式。
  • FTP:控制端口21,数据端口20,明文传输,老系统还在用。
  • SMB/CIFS:走445端口,Windows共享复制查资料主要靠它。
  • rsync:走873端口,常用于服务器之间的数据同步。
  • HTTP/HTTPS上传接口:走80/443端口,Web上传、API推送都算。

把该封的端口封掉,复制行为就没了载体,比如禁止内网机器通过SCP把数据复制到外网:

iptables -A FORWARD -p tcp --dport 22 -j DROP

同理,禁止FTP复制就封21和20端口,禁止SMB复制就封445端口,如果想做得更精细,可以在封禁前先放行特定IP的访问,比如只允许备份服务器走22端口:

iptables -A FORWARD -s 192.168.1.50 -p tcp --dport 22 -j ACCEPT iptables -A FORWARD -p tcp --dport 22 -j DROP

从源头隔离:内网按区域禁止互通

端口封禁解决的是“用什么方式复制”的问题,但还有一种场景更棘手:内网不同区域之间互相复制数据,比如研发区想从生产库把数据拖走,这时候端口只是表象,本质是区域之间不应该互通

做法是给每个区域划分网段,然后用FORWARD链做区域隔离:

iptables -A FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24 -j DROP

这条规则禁止研发网段(192.168.10.0/24)访问生产网段(192.168.20.0/24),如果业务上确实需要部分访问,就单独放行特定IP和端口,而不是放开整个网段。

iptables怎么禁止转发和复制,怎么设置? 第2张

这个思路也适用于多租户环境,比如云服务器上跑了多个客户的实例,底层宿主机本身就是一个潜在的复制跳板,利用iptables禁止内网转发能有效降低横向移动风险。

两个真实场景:内网隔离和服务器加固的配置示范

空谈命令不好理解,直接套两个具体场景,照着改就能用。

研发区与办公区完全隔离

公司有研发区(192.168.1.0/24)和办公区(192.168.2.0/24),要求两块区域互不访问,但都能上外网,配置顺序如下:

iptables -P FORWARD DROP iptables -A FORWARD -s 192.168.1.0/24 -o eth0 -j ACCEPT iptables -A FORWARD -s 192.168.2.0/24 -o eth0 -j ACCEPT iptables -A FORWARD -d 192.168.1.0/24 -i eth0 -j ACCEPT iptables -A FORWARD -d 192.168.2.0/24 -i eth0 -j ACCEPT

前两条放行办公区访问外网,后两条放行外网返回的响应数据,两条网段之间没有对应方向的规则,加上默认DROP,互访直接被切断。

数据库服务器只允许应用服务器访问

有一台数据库服务器(192.168.3.10),只允许应用服务器(192.168.3.20)通过3306端口访问:

iptables -P FORWARD DROP iptables -A FORWARD -s 192.168.3.20 -d 192.168.3.10 -p tcp --dport 3306 -j ACCEPT

这样配完之后,其他机器想从应用服务器跳板转发到数据库,也会被FORWARD链拦下。禁止转发直接把“跳板机”这条路也堵死了,这是很多人在用防火墙时忽略的细节。

配置iptables规则最容易踩的三个坑

规则写错、顺序颠倒、忘记保存,这三大问题基本覆盖了90%的踩坑现场。

规则顺序决定生死

iptables规则从上到下匹配,命中即停止,如果把DROP规则放在ACCEPT规则前面,后面的放行规则就等于白写,一个典型的错误示范:

iptables怎么禁止转发和复制,怎么设置? 第3张

iptables -A FORWARD -p tcp --dport 22 -j DROP iptables -A FORWARD -s 192.168.1.50 -p tcp --dport 22 -j ACCEPT

这条配置想让192.168.1.50能走SSH转发,但先DROP后ACCEPT的结果是,所有SSH转发流量都被丢弃了,正确做法是把放行规则放在封禁规则前面。

忘了保存配置,重启就失效

iptables规则默认是临时的,重启后全部清空,配置完测试没问题,记得保存:

  • Debian/Ubuntu:apt install iptables-persistent,然后执行netfilter-persistent save
  • CentOS/RHEL:service iptables save

保存后,规则会持久化到配置文件里,重启自动加载。不保存等于白配,这是新手最容易忽略的一步。

云平台安全组和iptables是两层门

不少云服务器厂商要求同时配置安全组和系统防火墙,安全组在虚拟机外面,iptables在系统里面,两层都要放行流量才能通,如果安全组已经放行了某个端口,但iptables的FORWARD链DROP掉转发流量,数据照样过不来,据阿里云官方文档说明,安全组和iptables属于叠加关系,排查网络问题时两层都要检查。

关于iptables禁止转发和复制的常见问题

问:iptables -P FORWARD DROP之后,本机还能正常访问外网吗?

能,本机访问外网走的是OUTPUT链和INPUT链,跟FORWARD链没有关系,FORWARD只处理经过本机转发的数据包,禁掉它只是禁用了路由转发功能,不影响本机自身的网络访问。

问:禁止了22端口的转发,会不会影响本机SSH登录?

不会,本机SSH登录走的是INPUT链(入站连接),转发规则影响的是别的机器“借道”本机转发SSH流量,如果想限制外部SSH登录本机,需要单独配置INPUT链的规则,比如iptables -A INPUT -p tcp --dport 22 -s 允许的IP -j ACCEPT,再设置INPUT默认策略为DROP。

问:用iptables禁止内网转发后,Docker容器还能正常工作吗?

不一定,Docker会在FORWARD链里插入自己的规则,如果默认策略改成DROP,Docker的跨容器通信和端口映射可能受影响,业内专家指出,遇到这种情况需要在FORWARD链的开始位置放行Docker的网络接口,比如iptables -I FORWARD -i docker0 -j ACCEPT,或者把Docker自定义链的引用规则放在默认DROP之前,具体操作取决于Docker版本和网络模式,建议改动前先备份当前iptables规则:iptables-save > /root/iptables-backup.txt。

0