iptables

流程

流程图

从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处)。

【入站数据】进行路由选择时如果数据包的目标地址是本机,内核就将其传给INPUT链处理,通过以后再交给本机上层的应用程序进行响应。

【出站数据】本机响应完成后如果需要发出数据包(即数据的源地址是路由器本机地址),就交给OUTPUT规则链,验证通过之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

【转发】进行路由选择时如果数据包的源地址和目标地址都不是路由器本机地址,则内核将其传递给FORWARD链进行处理,然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

参数解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
iptables [选项 参数] ...
可选的选项如下:
-t <表>:指定要操纵的表;
-A <链>:向规则链中添加条目;首
-D <链>:从规则链中删除条目;尾
-I <链>:向规则链中插入条目;
-R <链>:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型,icmp,tcp,udp等
-s:指定要匹配的数据包源ip地址;
-j <动作>:指定要进行的动作行为;
-i <网络接口>:指定数据包进入本机的网络接口;
-o <网络接口>:指定数据包要离开本机所使用的网络接口。
--dport <端口>:匹配目标端口号。
--sport <端口>:匹配来源端口号。

一般来说,一条iptables规则由四个部分组成:iptables -t 表 -A 链 匹配条件 处理动作

  1. 通过 -t 选项来指定操作的表,如 filter、nat、mangle

  2. 通过 -A, -D, -I , -R 选项来指定操作的链,如 INPUT, OUTPUT, FORWARD, PREROUTING , POSTOUTING

  3. 设置规则的匹配条件

    来源IP和目标IP,来源端口和目标端口

  4. 设置规则匹配成功后进行的动作

    ACCEPT:允许数据包通过。
    DROP:直接丢弃数据包,不给任何回应信息。
    REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
    SNAT:来源IP地址转换。
    MASQUERADE:是SNAT的一种特殊形式,适用于动态IP上。
    DNAT:目标IP地址转换。
    REDIRECT:在本机做端口映射。
    LOG:记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

例子

默认规则

1
2
3
4
iptables -P INPUT DROP #将输入流量的默认政策设置为拒绝
iptables -P FORWARD DROP #将转发流量的默认政策设置为拒绝
iptables -P OUTPUT ACCEPT #将输出流量的默认政策设置为允许
#数据包从上到下匹配规则,未匹配到规则将采用默认规则

端口

1
2
3
4
5
6
7
8
9
10
11
#开启tcp、udp端口
iptables -I INPUT -p TCP --dport 80 -j ACCEPT
iptables -I INPUT -p UDP --dport 80 -j ACCEPT
#开启范围端口
iptables -A INPUT -p tcp --dport 7000:7010 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 20,22,25,110 -j ACCEPT
#转发
iptables -I FORWARD -p tcp --sport 443 -j ACCEPT
iptables -I FORWARD -p tcp --dport 443 -j ACCEPT
iptables -I FORWARD -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -p tcp --sport 80 -j ACCEPT

ip

1
2
3
4
5
6
7
8
#入站ip
iptables -A INPUT -s 1.2.3.4 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
#屏蔽出站ip
iptables -A OUTPUT -d 1.2.3.4 -j DROP
iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
#屏蔽范围ip
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP #“-m –iprange –src-range”指定IP范围

域名

1
2
3
4
5
6
# 配合ddns
iptables -I FORWARD -d 域名 -j ACCEPT
iptables -I FORWARD -s 域名 -j ACCEPT
# 只转发指定端口
iptables -I FORWARD -p udp --dport 8090 -d 域名 -j ACCEPT
iptables -A FORWARD -p tcp -m multiport --dport 21,9090,10000 -d 域名 -j ACCEPT

mac地址

1
2
拒绝来源mac地址
iptables -A INPUT -m mac --mac-source 00:9F:EA:23:42:08 -j DROP

连接状态

1
2
3
4
5
6
7
#允许已建立的连接的数据包通过防火墙,阻止未经验证的连接
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

NEW:表示数据包是一个新的连接请求,尚未建立连接。
ESTABLISHED:表示数据包属于一个已建立的连接,即连接已经建立并且数据包是该连接的一部分。
RELATED:表示数据包与已建立的连接相关联,但不属于该连接的一部分。通常用于处理与已建立连接相关的特残数据包,如 ICMP 错误消息等。
INVALID:表示数据包无效,不符合协议规范或与现有连接不匹配。

删除规则

1
2
iptables -L FORWARD --line-numbers #列出规则并编号
iptables -D FORWARD 1 #删除第一条

ip6tables

结合EUI-64

1
ip6tables -I FORWARD -d ::021A:2BFF:FE3C:4D5E/::ffff:ffff:ffff:ffff -j ACCEPT

其中:aaaa:bbbb:cccc:dddd是 EUI-64 后缀,可以通过客户端 MAC 地址计算得到,是固定的

路由器ipv6防火墙推荐配置

查看接口

使用 ip route 命令查看路由表,判断哪个接口用于连接到互联网:

1
2
3
4
/ # ip route
default via 10.106.0.1 dev ppp0
10.106.0.1 dev ppp0 proto kernel scope link src 10.106.14.99
192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.1

在这个示例中,default via 10.106.0.1 dev ppp0 表示 ppp0 是连接到互联网的接口(外部接口),而 br0 是连接到内部网络的接口。

配置

允许内部设备通过ipv6访问互联网

允许从内部网络转发到外部网络:

1
2
3
ip6tables -A FORWARD -i <内部接口> -o <外部接口> -j ACCEPT
在此例中:
ip6tables -A FORWARD -i br0 -o ppp0 -j ACCEPT

允许已建立的连接的外部接口数据包通过防火墙,阻止未经验证的连接,以便内部设备可以访问互联网:

1
ip6tables -A FORWARD -i <外部接口> -m state --state ESTABLISHED,RELATED -j ACCEPT

开放某设备上的服务

利用EUI-64

1
2
# 开放443/tcp
ip6tables -I FORWARD -p tcp --dport 443 -d ::021A:2BFF:FE3C:4D5E/::ffff:ffff:ffff:ffff -j ACCEPT

利用ddns:

1
2
# 开放443/tcp
ip6tables -I FORWARD -p tcp --dport 443 -d 域名 -j ACCEPT