Stay hungry,Stay foolish

0%

Linux下限制某进程/服务访问特定网段/网卡

环境背景:

某业务需复用物理主机资源,同时安全原因只允许其访问公网网段/网卡,另外最好能为其指定一些网络配置或安全策略(例如特定DNS服务器)

方案一

Iptables + 特定组/用户

创建一个新组

1
groupadd net-limit

Iptables 限制其访问特定网段

1
iptables -I OUTPUT -m owner --gid-owner net-limit -d 8.8.8.8 -j DROP

测试 sg - execute command as different group ID

1
2
sg net-limit 'ping -c 1 8.8.8.8'
sg net-limit 'ping -c 1 114.114.114.114'

劣势

  • 进程/服务可能需要root权限
  • 进一步的定制化配置实现复杂(例如DNS)

方案二

macvlan + netns

创建macvlan,按需指定物理网卡

1
ip link add mv1 link eth0 type macvlan mode bridge

创建netns

1
ip netns add ns1

mv1和ns1关联; 这时ip a会发现mv1看不到

1
ip link set mv1 netns ns1

查看 ip netns help

1
2
ip netns list
ip netns exec ns1 ip a

网络配置

1
2
ip netns exec ns1 ip addr add ...
ip netns exec ns1 ip route add default via ...

启动服务/进程

1
ip netns exec ns1  python /test/1.py

其它

  • namespace 配置文件会优先从/etc/netns/NAME/中寻找,其次/etc/;
    例如: 如果有/etc/netns/ns1/resolv.conf 配置文件, ns1将优先使用,
    其次才是系统默认的/etc/resolv.conf
  • 重启相关配置都会丢失, 建议Systemd管理
  • 更多man ip-netns

方案三

虚拟化/容器化