iptables详解

发布时间 2023-04-16 20:03:01作者: kalixcn

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端口。

img

#在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