iptables限制宿主机跟Docker IP和端口访问的方法

2024-11-16 2

一、常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
查看版本:
[root@iptables-server ~]# iptables -V
iptables v1.4.21
配置文件:
 /etc/sysconfig/iptables-config
 /etc/sysconfig/iptables   #记录规则文件 
 
#查看防火墙规则,显示规则行号
[root@iptables-server ~]# iptables -nL --line-number 
##指定行号删除,需要注意删除第一条规则后原来的第二条规则行号就会变成1,多次执行切勿删错
[root@iptables-server ~]# iptables -D INPUT 1  
# 规则保存
[root@iptables-server ~]# iptables-save
# service iptables save
# iptables-save > /etc/sysconfig/iptables
# iptables-restore < /etc/sysconfig/iptables
--参数解释
-L:列出一个链或所有链中的规则信息
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1
-F:清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号)
-D:删除链内指定序号(或内容)的一条规则
-P:为指定的链设置默认规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
-t: 指定表名,默认filter表
.... 更多参数可通过--help查看

二、宿主机网络限制

背景:

漏洞扫描发现任意用户对目标服务通过访问URL获取内容或者单纯的想要限制/允许某个Ip或者某个网段进行访问

1、任意用户对目标服务通过访问URL获取内容

1
2
3
4
目标服务存在未授权访问漏洞,通过访问URL:http://192.168.180.140:8081/swagger-resources,获取内容如下
[root@xiaoliu ~]# curl -iv http://192.168.180.140:8081/swagger-resources
[root@xiaoliu ~]# curl -I 192.168.180.140:8081
:[{"name":"default","location":"/v2/api-docs","swaggerVersion":"2.0"}]

整改:对端口做限制,只允许平台服务器的网段对该端口进行访问,其余都拒绝

#注意拒绝其他所有IP地址进行访问,此规则因该在其他规则之前执行,以确保其生效

1
2
3
4
5
#192.168.180.140
[root@xiaoliu ~]# iptables -I INPUT -p tcp --dport 8081 -j DROP   #这种规则需要先执行
[root@xiaoliu ~]# iptables -I INPUT -s 10.146.57.0/24 -p tcp --dport 8081 -j ACCEPT
[root@xiaoliu ~]# iptables -I INPUT -s 10.146.60.0/24 -p tcp --dport 8081 -j ACCEPT
[root@xiaoliu ~]# iptables -I INPUT -s 10.146.119.0/24 -p tcp --dport 8081 -j ACCEPT

2、允许某个Ip或者某个网段进行访问

1
2
[root@xiaoliu ~]# iptables -I INPUT -p tcp --dport 2375 -j DROP
[root@xiaoliu ~]# iptables -I INPUT -s 10.146.119.0/24 -p tcp --dport 2375 -j ACCEPT

三、限制Docker 网络IP和端口访问

背景:

整改安全加固时,使用iptabels限制docker端口不生效,限制非docker容器端口可生效。

经查阅大量资料,发现Docker容器创建时会自动创建iptables策略,Docker使用的i规则链是DOCKER-USER,所以需使用iptables对DOCKER-USER链做限制。

1、同网段只允许负载均衡机器跟控制主机机器访问算法服务器

1
2
3
4
5
6
7
8
9
iptables -I INPUT -p tcp --dport 48002 -j DROP
iptables -I INPUT -s 192.168.180.204 -p tcp --dport 48002 -j ACCEPT
iptables -I INPUT -s 192.168.180.215 -p tcp --dport 48002 -j ACCEPT
##此刻只执行上面命令发现同网段其余机器还是可以访问该算法的调用端口,此时需要对容器做限制
iptables -I INPUT -s 192.168.180.0/24 -j DROP
iptables -I INPUT -s 192.168.180.215 -j ACCEPT
iptables -I INPUT -s 192.168.180.204 -j ACCEPT
iptables -I DOCKER-USER -i eno1 -s 192.168.180.215 -p tcp  --dport  48002 -j ACCEPT
iptables -I DOCKER-USER -i eno1 -s 192.168.180.204 -p tcp  --dport  48002 -j ACCEPT

2、限制与Docker主机的连接

默认情况下,允许所有外部源IP连接到Docker主机。

要仅允许特定的IP或网络访问容器,请在DOCKER-USER过滤器链的顶部插入一个否定的规则。

1
2
#限制除192.168.1.1地址外的其他地址访问
$ iptables -I DOCKER-USER -i eno1 ! -s 192.168.1.1 -j DROP

#注意:eno1网卡需要按照你的实际情况填写

1
2
#限制除192.168.1.0/24网段外的其他地址访问
$ iptables -I DOCKER-USER -i eno1 ! -s 192.168.1.0/24 -j DROP

最后,您可以指定要接受的IP地址范围--src-range (请记住-m iprange在使用--src-range或时也要添加--dst-range):

1
2
#限制除192.168.1.1-192.168.1.3外的其他地址访问
$ iptables -I DOCKER-USER -m iprange -i eno1 ! --src-range 192.168.1.1-192.168.1.3 -j DROP

您可以结合使用-s或--src-range与-d或--dst-range一起控制连续源地址和连续目标地址。

例如,如果Docker守护程序同时监听 192.168.1.99和10.1.2.3,则可以制定特定于10.1.2.3并保持 192.168.1.99打开的规则。

3、限制docker指定端口访问策略

1
2
3
4
禁止所有IP访问docker的389端口
iptables -I DOCKER-USER -i eth0 -p tcp --dport 389 -j DROP
允许172.27.30.92地址访问docker的389端口
iptables -I DOCKER-USER -i eth0  -s 172.27.30.92 -p tcp --dport 389 -j ACCEPT

4、DOCKER-USER常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查询DOCKER-USER策略
[root@test ~]# iptables --line -nvL  DOCKER-USER
Chain DOCKER-USER (1 references)
num   pkts bytes target     prot opt in     out     source               destination        
1        8   432 ACCEPT     tcp  --  eth0   *       172.27.30.92         0.0.0.0/0            tcp dpt:389
2       13   740 DROP       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:389
3      188 12524 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0 
 
# 删除DOCKER-USER策略
# 删除DOCKER-USER链第一条(num)规则
[root@test ~]# iptables -D DOCKER-USER 1
 
# 保存DOCKER-USER策略,默认临时生效
[root@test ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  确定  ]
 
telnet访问测试:
[root@zabbix_server ~]# telnet 127.0.0.1 8075
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection timed out

总结

以上为个人经验,希望能给大家一个参考。