iptables详解
iptables 概述
iptables是Linux斜体自带的防火墙,支持数据包过滤、数据包转发、地址转换、基于MAC地址的过滤、基于状态的过滤、包速率限制等安全功能。iptables可以用于构建Linux主机防火墙,也可以用于搭建网络防火墙。
iptables 结构
一、iptables的表tables与链chains
iptables有filter、nat、mangle、raw四种表,五链PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
1. Filter表
filter表:是iptables的默认表,用于过滤数据包,控制网络流量。它有以下三种内建链(chains)
- INPUT链:数据包进入本机之前进行处理。
- OUTPUT链:数据包从本机发出之前的操作。
- FORWARD链:数据包转发到其他主机之前进行处理。
2. NAT表
NAT表:用于等数据包进行地址转换,实现网络地址转换(NAT)功能。有三种内建链(chains)
- PREROUTING链:处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT。
- POSTROUTING链:处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
- OUTPUT链:数据包从本机发出之前进行处理。
3. Mangle表
Mangle表:用于修改数据包的头部信息,比如TTL、TOS等。它有5个内建链(chains)
- PREROUTING
- OUPPUT
- FORWARD
- INPUT
- POSTROUTING
4. Raw表
Raw表:用于处理数据包的链接状态,对于未建立连接的数据包进行处理。它有两个内建链
- PREROUTING
- OUTPUT
iptables 配置
规则包括一个条件和一个目标,如果满足条件,就执行目标中的规则或者特定值,如果不满足条件,就判断下一条规则。
iptables中需要用-t<表名>来查看指定表的规则,如果不指定默认是filter表的规则。
清除现有的规则
bash iptables -F
查看NAT表规则
bash iptables -t nat -L
端口转发
开启内核转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
本地端口转发
将外部访问本机的8080端口转发到本地的80端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 22
多主机端口转发
A的ip是192.168.1.2,B的ip是192.168.1.1,A和B是内网互通的,现在有一个外部ip(1.2.3.4)为C,C想通过访问B的2222端口从而访问到A的22端口。
#在B上执行
#将所有从A机器返回的TCP流量的源地址改为B机器的IP地址,不管单端口函数多端口转发都需要执行
iptables -t nat -A POSTROUTING -d 192.168.1.2 -p tcp --dport 22 -j SNAT --to-source 192.168.1.1
#单端口转发,将所有目的地址为1.2.3.4并且端口为2222的TCP流量重定向到A机器的22端口上。
iptables -t nat -A PREROUTING -s 1.2.3.4 -p tcp --dport 2222 -j DNAT to-destination 192.168.1.2:22
#多对一端口转发
#将B的50000到60000的端口全部转发到A的443端口
iptables -t nat -l PREROUTING -p tcp -m multiport --dport 50000:60000 -j DNAT --to-destination 192.168.1.2:443
多对多端口转发
例如将B的50000到60000的端口全部转发到A的50000到60000的端口,命令如下:
iptables -t nat -I PREROUTING -p tcp -m multiport --dport 50000:60000 -j DNAT --to-destination 192.168.1.2:50000-60000
当然多个端口也可以是不连续的,比如80、443、8080同端口转发,端口用逗号”,”隔开,–to-destination后面的ip不用再指定端口。
iptables -t nat -I PREROUTING -p tcp -m multiport --dport 80,443,8080 -j DNAT --to-destination 192.168.1.2
iptables增加、插入、删除规则
- -A 在最后一条规则后新增规则
- -I 默认将新规则插入到第一条
- -F 不指定<链名>,默认清空整个表的规则
- -D <链名> <规则编号> 删除指定编号的规则
iptables实例
1. Delete all existing rules
iptables -F
2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWAED DROP
iptables -P OUTPUT DROP
3. Block a specific ip-address
iptables -A INPUT -s 10.10.10.10 -j DROP
4. Allow ALL incoming SSH
iptable -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
5. Allow incoming SSH only from a sepcific network
iptables -A INPUT -i eth0 -p tcp -s X.Y.Z.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
6. Allow incoming HTTP
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
7. Allow incoming HTTPS
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
8. MultiPorts (Allow incoming SSH,HTTP,and HTTPS)
iptables -A INPUT -i eth0 -p tcp -m multiport --dport 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
9. Allow outgoning 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 -m state --state ESTABLISHED -j ACCEPT
10. Allow outgoing SSH only to a specific network
iptables -A OUTPUT -o eth0 -p tcp -d A.B.C.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
11. Allow outgoing 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
12. Ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
13. Ping from outside to inside
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
14. Allow outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
15. Allow MySQL connection only from a specific network
iptables -A INPUT -i eth0 -p tcp -s 192.168.Y.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
16. Port forwarding 442 to 22
iptables -t nat -A PREROUTING -p tcp -d 192.168.A.B --dport 422 -j DNAT --to 192.168.102.37:22
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 442 -m state --state ESTABLISHED -j ACCEPT