Ubuntu iptables学习与进阶指南
学习iptables前,需掌握其核心逻辑:表(Table)、链(Chain)、规则(Rule)。
filter(默认表,负责包过滤,如允许/拒绝流量);nat(网络地址转换,如端口转发、IP伪装);mangle(修改数据包头部信息,如TTL、TOS);raw(连接跟踪前处理,如豁免某些连接)。INPUT(处理目标为本机的数据包);OUTPUT(处理本机发出的数据包);FORWARD(处理经过本机路由的数据包);PREROUTING(数据包到达时立即处理,如DNAT);POSTROUTING(数据包发送前处理,如SNAT)。sudo iptables -L -n -v # 列出所有链的规则(-n禁用DNS解析,-v显示详细信息)
sudo iptables -t nat -L -v # 查看nat表的规则
sudo iptables -F # 清空所有链的规则
sudo iptables -X # 清空所有自定义链
sudo iptables -Z # 将所有计数器归零
sudo iptables -P INPUT DROP # 默认拒绝所有入站流量(安全前提)
sudo iptables -P OUTPUT ACCEPT # 允许所有出站流量(本机发出的流量)
sudo iptables -P FORWARD DROP # 默认拒绝所有转发流量
sudo iptables -A INPUT -i lo -j ACCEPT # 允许本地回环接口(本机服务通信)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许已建立的连接(如SSH反向隧道)
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT # 允许特定IP(192.168.1.100)访问SSH
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP流量
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许HTTPS流量
sudo apt install iptables-persistent # 安装持久化工具
sudo netfilter-persistent save # 保存当前规则到/etc/iptables/rules.v4
安装时会提示是否保存现有规则,选择“是”即可自动写入。
sudo iptables -A INPUT -p tcp --dport 700:800 -j DROP # 拒绝700-800端口的所有流量
sudo iptables -I INPUT -s 11.129.35.45 -p tcp --dport 700:800 -j ACCEPT # 允许特定IP(11.129.35.45)访问该范围
sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j ACCEPT # IP1
sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.1.101 -j ACCEPT # IP2
sudo iptables -A INPUT -p tcp --dport 80 -j DROP # 拒绝其他IP
# 将外部8080端口转发到内网192.168.1.2的80端口(需开启IP转发)
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # 临时开启IP转发
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80 # PREROUTING链做目标地址转换
sudo iptables -t nat -A POSTROUTING -j MASQUERADE # POSTROUTING链做源地址伪装(隐藏内网IP)
# 持久化IP转发:编辑/etc/sysctl.conf,设置net.ipv4.ip_forward=1,然后执行sudo sysctl -p
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Attempt: " # 记录SSH尝试登录的日志(日志存放在/var/log/syslog)
sudo iptables -A INPUT -p icmp --j LOG --log-prefix "ICMP Packet: " # 记录ICMP流量(如ping)
通过tail -f /var/log/syslog实时查看日志。
sudo iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP # 限制单个IP最多3个SSH连接
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 5/min -j ACCEPT # 限制HTTP连接速率为每分钟5次
sudo iptables -A INPUT -p tcp --dport 80 -j DROP # 超过速率的连接丢弃
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立的连接
sudo iptables -A INPUT -p icmp --limit 1/s --limit-burst 3 -j ACCEPT # 允许每秒1个ping请求,突发3个
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT # 允许HTTP和HTTPS
sudo iptables -D INPUT -p tcp --dport 8080 -j DROP # 删除INPUT链中“拒绝8080端口”的规则
sudo iptables -L -n --line-numbers # 查看规则编号(如INPUT链第3条是“拒绝8080端口”)
sudo iptables -D INPUT 3 # 删除INPUT链的第3条规则
sudo iptables-save > ~/iptables-backup.rules备份,避免误操作导致无法访问。ping、curl等工具测试连通性,确保不影响正常业务。ufw(Uncomplicated Firewall)简化操作,但iptables更适合高级定制(如端口转发、DDoS防护)。iptables官方手册(man iptables)和Ubuntu Wiki,了解更多模块和参数。