Iptables 防火墙例子

本文仅针普通的服务器的防火墙配置,不适用于 docker 和 k8s 的防火墙配置。

关闭内置防火墙

先关闭 ufw 和 firewalld 服务。

配置 ipset

创建若干 ipset,你允许这些 ipset 来访问你的服务器。

如果就是 ip 地址,命令是这样:

1
2
ipset create <名字> hash:ip
ipset add <名字> <ip>

如果是子网,命令是这样:

1
2
ipset create <名字> hash:net
ipset add <名字> <ip/cidr>

后面假设 ipset 的名字叫做 allow-ips

得到网卡名字

1
2
3
4
5
6
7
ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether fe:fc:fe:ed:20:e7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.9.102/24 brd 172.17.9.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
...

上例中 eth0 就是网卡的名字。

添加 iptables 规则

先查看 iptables 的 filter 表里的 INPUT chain 里的规则情况,有没有自己设置的规则在里面:

1
2
3
4
5
6
7
iptables -t filter -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
3    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67

然后添加规则:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
iptables -t filter -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 allow-ips 访问 80,443 端口
iptables -t filter -A INPUT -i eth0 -p tcp --dport 80  -m set --match-set allow-ips src -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp --dport 443 -m set --match-set allow-ips src -j ACCEPT

# 22 端口是完全放开的
iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

# 兜底规则,拒绝其他情况的访问
iptables -t filter -A INPUT -i eth0 -j REJECT

再查看一下 iptables 的规则,应该是这样的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
iptables -t filter -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state ESTABLISHED,RELATED
2    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
4    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67
...
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80  match-set allow-ips src
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set allow-ips src
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

版权

评论