Linux iptables常用示例

iptables简介

iptables是 Linux 内核集成的 IP 信息包过滤系统,用于对数据包的过滤和转发。

iptables的规则链分为三种:输入、转发、输出

输入:过滤目的地址是本机的连接

转发:过滤目的地址和源地址都不是本机的转发

输出:过滤源地址是本机的转发

iptables表详解

filter表:管理本机数据的进出

nat表:管理防火墙内部主机

mangle表:改变不同包及包头内容

raw表:用于处理异常

iptables常用表和相应的链详解

  1. filter表,iptables的默认表

INPUT:主要对外部数据包进入Linux系统进行信息过滤

OUTPUT:主要对内部Linux系统所要发送的数据包进行信息过滤

FORWARD:将外面过来的数据包传递到内部计算机中

  1. nat表用于网络地址转换

PREROUTING:在数据包刚刚到达防火墙时,根据需要改变它的目的地址。通过防火墙改变了访问的目的地址,以使数据包能重定向到指定的主机

POSTROUTING:在包就要离开防火墙之前改变其原地址,屏蔽本地局域网的信息,本地主机通过防火墙连接到互联网,在互联网上看到的本地主机的来源都是同一个IP

OUTPUT:改变本地产生的包的目的地址

iptables格式

iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数
iptables[-t tables] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
  1. -P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
  2. -F 清空规则链
  3. -L 查看规则链
  4. -A 在规则链的末尾加入新规则
  5. -I num 在规则链的头部加入新规则
  6. -D num 删除某一条规则
  7. -s 匹配来源地址IP/MASK,加叹号”!“表示除这个IP外。
  8. -d 匹配目标地址
  9. -i 网卡名称 匹配从这块网卡流入的数据
  10. -o 网卡名称 匹配从这块网卡流出的数据
  11. -p 匹配协议,如tcp,udp,icmp
  12. –dport num 匹配目标端口号
  13. –sport num 匹配来源端口号

查看当前规则

iptables -L

查看当前所有规则

iptables -L INPUT --line-numbers

显示所有规则和对应的编号

删除已有规则

iptables -F

或者

iptables -flush

增/删/改 规则

iptables –A INPUT -s 192.168.1.0/24 -p tcp--dport 8080 -j ACCEPT

-A增加一条规则

iptables –I INPUT 6 -s 192.168.1.0/24 -p tcp--dport 8080 -j ACCEPT

-I指定编号插入一条规则

iptables -R INPUT 2 -i eth0 -s 192.168.2.1 -j ACCEPT

-R指定编号修改一条规则

iptables -D INPUT 2

-D删除指定编号规则

设置链的默认策略

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

将INPUT,FORWARD,OUTPUT链设置成DROP(拒绝),ACCEPT(接受)

开启指定端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

开启80端口

重定向端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

将80端口重定向到8080端口

端口转发

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.13:8080
iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 8080 -j SNAT --to-source 192.168.1.12

将本机192.168.1.12:8080端口转发至192.168.1.13:8080端口

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p /etc/sysctl.conf

修改/etc/sysctl.conf文件net.ipv4.ip_forward = 1,并生效开启转发。

设置TCP、UDP协议过滤规则

iptables [-t tables] [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源IP/网络] [--sport 端口范围] [-d 目标IP/网络] [--dport 端口范围] -j [ACCEPT|DROP|REJECT|REDIRECT]

阻止指定IP地址

丢弃来自IP地址x.x.x.x的包

iptables -A INPUT -s x.x.x.x -j DROP

阻止来自IP地址x.x.x.x eth0 tcp的包

iptables -A INPUT -i eth0 -s x.x.x.x -j DROP
iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP

允许所有SSH的连接请求

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

仅允许来自指定网络的SSH连接请求

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

仅允许来自于192.168.100.0/24域的用户的ssh连接请求

允许http和https的连接请求

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

允许所有来http的连接请求

iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

允许所有来https的连接请求

使用multiport 将多个规则结合在一起

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

允许所有ssh,http,https的流量访问

允许从本地发起的SSH

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

OUTPUT链上,允许NEW和ESTABLISHED状态。INPUT链上,只允许ESTABLISHED状态。与ssh连入的规则相反

仅允许从本地发起到一个指定的网络域的SSH请求

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

仅允许从内部连接到网域192.168.100.0/24

允许从本地发起的HTTPS连接请求

iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

允许输出安全的网络流量,允许访问互联网。

负载均衡传入的网络流量

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

iptables nth将HTTPS流量负载均衡至三个不同的ip地址

允许外部主机ping内部主机

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

允许内部主机ping外部主机

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

允许回环访问

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

在服务器上允许127.0.0.1回环访问

允许内部网络域外部网络的通信

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用该规则允许内部网络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。

允许出站的DNS连接

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

允许来自指定网络的MySQL连接请求

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

从内部网络(192.168.100.0/24)直接登录数据库

防止DoS攻击

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

-m limit: 启用limit扩展

–limit 25/minute: 允许最多每分钟25个连接(根据需求更改)

–limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制

参考