ip6tables 有没有办法禁止外网访问内部 ipv6 服务,并保证内网访问正常

在 ubuntu 中, 设置

ip6tables -P INPUT DROP

将外界所有ipv6流量拦截,目的是外网无法访问内网中的服务
但是这样的话设备也无法访问纯ipv6网站,如:

curl http://[2402:4e00:1013:e500:0:940e:29d7:3443]/

猜测是回来的流量被DROP了?

  1. 请问有没有办法让外网(公网)无法访问内部的ipv6服务,但是内部可以正常用ipv6访问公网?
  2. 如果以后需要暴露部分端口,比如80或443,此时应该如何添加例外规则?

netfilter-persistent文件
image.png

阅读 6.1k
2 个回答

应该可以通过tcp状态来实现你的要求,如下示例,在你的基础上再添加一条记录,这将保证tcp第二次握手的时候不会被iptables拦截掉。

ip6tables -A INPUT -d 192.168.206.163 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

思路我简单讲下:iptables提供一个conntrack的链接状态跟踪模块,它能针对具体的链接状态进行处理。以tcp链接为例,tcp三次握手后,这个链接就是ESTABLISHED的状态了,后续交互的数据包不需要重新握手识别。

我们可以不过滤本机出去的包(iptables默认逻辑),并基于上面提到的模块,对进来的数据包(input)进行识别。如果是某个应用先主动出去的包对应的交互数据包,那么他的链接状态是经过识别的,不会是新握手的,基于这个原因,可以过滤出来。

比如,针对你的第一个问题,下面的规则可以实现

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

后续如果需要暴露部分端口,则在上面的规则下面增加对应的放通规则

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题