iptables使用详解

如题所述

第1个回答  2024-04-04

在为VPS部署Docker并配置MySQL时,网络安全是关键环节,这时iptables防火墙就派上了用场。虽然CentOS和Ubuntu的防火墙工具各有特色,但它们都基于iptables的核心功能。在启动前,确保先停用可能冲突的服务,如:



    在CentOS上,停止Firewalld: `sudo systemctl stop firewalld` 和 `sudo systemctl disable firewalld`
    在Ubuntu上,停用ufw: `sudo ufw disable`

iptables是Linux系统的核心防火墙,它通过一组精细的规则来控制网络流量,支持协议、IP地址和端口的访问控制。iptables有四大工作表:filter(处理到达目标端口的包)、mangle(修改包)、nat(转换IP地址进行路由)和raw(基于包状态定制规则)。



    filter表包含INPUT(处理到达目标前的包)、FORWARD(路由转发)和OUTPUT(返回包)三个链。
    mangle表的链有PREROUTING(在包到达网口前)、INPUT、FORWARD和OUTPUT(离开网口)。
    nat表与mangle表结构相似。
    raw表的链也与mangle表一致,但用于基于包状态的高级规则。

理解iptables的包转发规则至关重要:



    当数据包在PREROUTING链中,目标地址被修改后,会转到FORWARD链处理;否则,会进入INPUT链。
    FORWARD链遵循mangle(FORWARD) > filter(FORWARD)的顺序,INPUT链遵循mangle(INPUT) > filter(INPUT)。
    OUTPUT链则执行raw(OUTPUT) > mangle(OUTPUT) > nat(OUTPUT) > filter(OUTPUT)的顺序。
    规则结构清晰:匹配条件(如IP地址)+ 动作(ACCEPT、DROP、REJECT等)。
    查看规则时,使用`iptables -t nat -nvL --line-numbers`显示详细信息。
    添加规则如:`-A INPUT -s 59.45.175.62 -j REJECT`,拒绝特定IP访问。
    规则顺序可通过`-I`调整优先级,如`-I INPUT -s 59.45.175.62 -j REJECT`将规则置于链首。
    删除规则则使用`-D INPUT -s 59.45.175.62 -j REJECT`,指定条件的规则将被移除。

规则的设定基于数据包的属性,并遵循链首规则优先原则。掌握了这些,我们就能灵活运用iptables来定制网络策略。例如:



    使用`-d`指定目的地:`iptables -A OUTPUT -d 31.13.78.35 -j DROP`,丢弃返回给特定IP的数据包。
    清空链:`iptables -t filter -F INPUT`,丢弃所有TCP协议的数据包。
    匹配多个端口:`iptables -A INPUT -p tcp -m multiport --dports 22,5901 -j DROP`。
    利用`m conntrack`或`m state`模块进行链接状态匹配:如`iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT`,允许已建立连接和相关连接。

请注意,不同Linux发行版可能需要调整模块参数,比如默认策略可设为DROP,如`iptables -t filter -P INPUT DROP`。回环地址通信默认允许,`iptables -A INPUT -i lo -j ACCEPT`。对于频繁的请求响应,可以限制输出网络,如`iptables -A OUTPUT -o wlan0 -d 121.18.238.0/29 -j DROP`。


规则的执行逻辑可以进行逆向操作,如`iptables -A INPUT -p tcp -m multiport ! --dports 22,80,443 -j DROP`,允许除了指定端口外的所有连接。


为了使iptables配置持久,可以将其导出到`/etc/iptables.conf`,然后使用`iptables-save`和`iptables-restore`确保重启后的规则生效。在Ubuntu上,可以考虑安装iptables-persistent扩展,以自动加载配置。


特别关注docker环境下的规则管理,比如在iptables中为docker容器的ssh访问创建自定义链`ssh-rules`。完成后,要记得在INPUT链中添加它,如`iptables -I INPUT -j ssh-rules`,并删除不再需要的链:`iptables -X ssh-rules`。


对于docker容器的网络限制,因为docker内部网络的隔离特性,iptables可能无法直接控制docker暴露的端口。然而,可以在宿主机的FORWARD链(如DOCKER-USER链)添加规则来阻止外网访问docker,如`iptables -I DOCKER-USER -i enp0s3 -j DROP`。


更深入的技术内容和最佳实践,可以参考公众号"西北偏北UP"的分享。掌握iptables,为你的网络安全保驾护航。

相似回答