[Linux] iptables常用示例
Contents
Linux iptables常用示例
iptables简介
iptables是 Linux 内核集成的 IP 信息包过滤系统,用于对数据包的过滤和转发。
iptables的规则链分为三种:输入、转发、输出
输入:过滤目的地址是本机的连接
转发:过滤目的地址和源地址都不是本机的转发
输出:过滤源地址是本机的转发
iptables表详解
filter表:管理本机数据的进出
nat表:管理防火墙内部主机
mangle表:改变不同包及包头内容
raw表:用于处理异常
iptables常用表和相应的链详解
- filter表,iptables的默认表
INPUT:主要对外部数据包进入Linux系统进行信息过滤
OUTPUT:主要对内部Linux系统所要发送的数据包进行信息过滤
FORWARD:将外面过来的数据包传递到内部计算机中
- nat表用于网络地址转换
PREROUTING:在数据包刚刚到达防火墙时,根据需要改变它的目的地址。通过防火墙改变了访问的目的地址,以使数据包能重定向到指定的主机
POSTROUTING:在包就要离开防火墙之前改变其原地址,屏蔽本地局域网的信息,本地主机通过防火墙连接到互联网,在互联网上看到的本地主机的来源都是同一个IP
OUTPUT:改变本地产生的包的目的地址
iptables格式
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数
iptables[-t tables] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
- -P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
- -F 清空规则链
- -L 查看规则链
- -A 在规则链的末尾加入新规则
- -I num 在规则链的头部加入新规则
- -D num 删除某一条规则
- -s 匹配来源地址IP/MASK,加叹号”!“表示除这个IP外。
- -d 匹配目标地址
- -i 网卡名称 匹配从这块网卡流入的数据
- -o 网卡名称 匹配从这块网卡流出的数据
- -p 匹配协议,如tcp,udp,icmp
- –dport num 匹配目标端口号
- –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限制