iptables 脚本阻止除所需应用程序之外的所有互联网访问

2023-12-14

CONTEXT:

我想要一个 shell 脚本来阻止所有到我的计算机的入站/出站流量,除非我决定要使用浏览器或其他应用程序,在这种情况下,我会调用它并且只有这些应用程序会运行。

我研究了以前由聪明人制作的脚本(最后有源链接),并投入时间自己学习使用 iptables(仍在这方面工作)。

这是完成工作的结果:

RESULTS:

在运行 shell 脚本之前,有一个名为internet被建造:

sudo groupadd internet

外壳脚本:

#!/bin/sh
#only allow apps run from "internet" group to run

# clear previous rules
sudo iptables -F

# accept packets for internet group
sudo iptables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo iptables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT

# also allow local connections
sudo iptables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT

# reject packets for other users
sudo iptables -A OUTPUT -j REJECT

# same process for IPv6:
sudo ip6tables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT
sudo ip6tables -A OUTPUT -j REJECT

这是我目前正在开发的 shell 的另一部分,但我对此并没有 100% 的信心:

#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP

#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#SAME REPEATED FOR IPv6
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

执行上面的整个脚本后,以下命令将打开一个终端,该终端将成为internet组,因此该终端打开的任何应用程序(例如 Firefox)都可以访问互联网,而所有其他输入/输出都将停止

sudo -g internet -s

问题:

前面的逻辑是否合理?目前我正在努力测试所有功能,通过安装网络监控软件(nethogs),测试每一行代码并查看结果是否符合预期,BUT同时,我两天前才开始学习 iptables,所以尽管原始代码的来源是由经验丰富的编码人员完成的,但我对自己将它们组合在一起以产生所需结果的能力没有 100% 的信心。Thanks致所有花时间阅读本文并参与讨论的人!!!

sources:

https://plus.google.com/+TobyKurien/posts/YZhZJCZmGgm https://serverfault.com/questions/429400/iptables-rule-to-allow-all-outbound-locally-originating-traffic

P.S.:感谢@dirkt 之前帮助我理解了 iptables 的很​​多基本概念,并回答了我关于源代码的一些问题。


UPDATE:

所以运行代码后,似乎出现了问题。发生的情况如下。我运行 shell 脚本:

bash myscript

我收到 2 个错误,如下所示:

ip6tables v1.6.0:主机/网络127.0.0.1未找到 尝试“ip6tables -h”或“ip6tables --help”以获取更多信息。

ip6tables v1.6.0:主机/网络198.168.0.1未找到 尝试“ip6tables -h”或“ip6tables --help”以获取更多信息。

但其他一切都运行良好,并且当做时sudo iptables -L我确实确认所有其他规则均已到位。AFTER那,我尝试了以下方法:

  • 通过手动双击图标来运行 Firefox。结果果然如我所料,立刻就得到了找不到服务器错误,这是一个好兆头
  • 之后我运行了命令sudo -g internet -s在终端中,然后firefox. NOW...当我尝试加载网站时,它没有显示找不到服务器,但它会持续加载很长一段时间,非常长。这让我相信输出响应可能已发送,但输入被阻止。

如果有人知道为什么会发生这种情况,我很想知道您的反馈!


我两天前才开始学习 iptables,所以尽管原始代码的来源是由经验丰富的编码人员完成的,但我对自己将它们组合在一起以产生所需结果的能力没有 100% 的信心。

巧合的是,我在同一时间寻找相同的解决方案并看到了您的帖子。只需注册即可,希望这可以帮助您和其他人。我仍在学习并愿意接受建议和意见:)

对代码进行了一些更改。我需要打开本地连接的所有端口才能使其正常工作。 也将 192.168.0.1/24 更改为 192.168.0.0/16。此范围允许包含 wifi/usb 系绳。

# also allow local connections
#TODO. Use log to see which port are actually needed.
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT

前面的逻辑是否合理?

更改此代码的顺序。

#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#DROPS ALL INPUT and FORWARD 
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP

还要将此代码添加到之前的代码之上。这些是从默认防火墙中获取的。最初它包含特定的接口。

sudo iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT

我收到 2 个错误,如下所示:

ip6tables v1.6.0:找不到主机/网络 127.0.0.1 尝试“ip6tables -h”或“ip6tables --help”以获取更多信息。

ip6tables v1.6.0:找不到主机/网络 198.168.0.1 尝试“ip6tables -h”或“ip6tables --help”以获取更多信息。

可能是因为您使用的是 IP4 地址。 将 127.0.0.1 更改为 ::1/128,将 198.168.0.1 更改为 fe80::/10。 对 IPv6 帮助不大。我不知道它是如何工作的,而且我认为我的根本没有使用 IPv6。

完整脚本:

#!/bin/sh
#only allow apps run from "internet" group to run

# clear previous rules
sudo iptables -F

# accept packets for internet group
sudo iptables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo iptables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
#Some application need more port. Such as ping.
sudo iptables -A OUTPUT -p icmp -m owner --gid-owner internet -j ACCEPT
#Less secure. Open all port.
#sudo iptables -A OUTPUT -m owner --gid-owner internet -j ACCEPT

# also allow local connections
#TODO. Use log to see which port are actually needed.
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT

# reject packets for other users
sudo iptables -A OUTPUT -j REJECT

#Taken from default rules.
sudo iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT

#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP


#IPv6 Section

# Flush ip6tables too
sudo ip6tables -F

# same process for IPv6:
sudo ip6tables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -d ::1/128 -j ACCEPT
sudo ip6tables -A OUTPUT -d fe80::/10 -j ACCEPT
sudo ip6tables -A OUTPUT -j REJECT

sudo ip6tables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo ip6tables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iptables 脚本阻止除所需应用程序之外的所有互联网访问 的相关文章

  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • Symfony 2:如果用户具有特定角色,则将用户重定向到页面

    我有一个小问题 我希望无论用户在我的网站上哪里 如果他具有 ROLE DEGRADE 角色 他就会被重定向到特定页面 我该怎么做 我必须使用防火墙 我不想将用户重定向到表单登录 而只是重定向到一个简单的页面 我希望在我的网站上随处可见 而不
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • Opencv:您的设备似乎不支持相机(或者已锁定)

    我在 Android 4 0 4 的三星平板电脑上使用 opencv 2 4 5 的 Face Detection 和 Android 4 2 2 该应用程序可以使用前置摄像头来校准我的脸部 但是 当我使用此应用程序同时播放视频和面部检测时
  • 应用程序启动时导航抽屉始终处于膨胀状态

    我正在尝试将导航抽屉添加到我的主要活动中 在 Activity main xml 的设计视图中 它应该作为阴影动画在活动布局的左侧可见 我不知道我应该在这里使用什么术语 向右拖动 滑动时应该可见 但就我而言 它默认覆盖整个活动 并且不显示活
  • 获取 Dynamics 365 的身份验证令牌时出现错误 AADSTS90002

    我在尝试从 Net 客户端使用 Dynamics 365 进行身份验证时遇到以下错误 AADSTS90002 Tenant authorize not found This may happen if there are no active
  • 无法在带有 Xcode 4.3.1 和 IOS 的 iPhone 4.2.1 上运行应用程序

    我希望有人可以提供帮助 这个问题已经困扰我一段时间了 我正在运行 Xcode 4 3 1 和基本 SDK iOS 5 1 iPhone版本是4 2 1 我相信是旧的3S型号 当点击 运行 时 Xcode 编译正常 并表示它正在手机上运行我的
  • 将 unicode 转换为 char

    如何将 Unicode 字符串转换为char or char const in 内河码头 c String text Hello world char txt AnsiString text c str Older text t str i
  • 如何在 C# 中监控剪贴板内容变化? [复制]

    这个问题在这里已经有答案了 I want to have this feature in my C program When the user do Ctrl C or Copy anywhere i e when the clipboar
  • 在matlab中找到峰值

    假设我们确定向量中的峰值如下 我们有长度为 m 的实数值一维向量 或者 x 1 x 2 x 米 如果 x 1 gt x 2 则显然对于第一个点 Peak 1 x 1 否则我们将 x 3 与 x 2 进行比较 如果 x 3 indexes p
  • 如何将工具提示添加到 JavaFX Canvas 的矩形区域

    在我的 JavaFX 应用程序中 我有一个TableView具有多个列 其中一列以图形形式显示数据 为此 我创建了一个CanvasCell创建并管理自己的对象Canvas来处理绘图 绘图部分工作得很好 我现在想把Tooltips范围内的一些
  • 我怎样才能得出这个观点?

    List gt l user我有一个List具有用户引用字段的节点 l user Story gt s user然后我有Story也有用户引用字段的节点 s user 之间没有直接联系List and Story 我想添加一个视图List列
  • GWT 在 CloseHandler 中检测浏览器刷新

    我有一个 GWT 应用程序 我想在用户离开应用程序时运行一些代码以强制注销并删除任何数据等 为此 我使用 CloseHandler 并使用 Window addCloseHandler 注册它 我注意到 当单击刷新按钮时 会运行 onClo
  • dalvikvm:找不到类“android.*”

    在此输入图像描述开发时 应用程序在Android 5 0系统上可以正常使用 但是在5 0以下的系统中会出现应用程序无响应的情况 但不知道是什么原因 错误日志如下 E dalvikvm Could not find class android
  • 如何限制使用 argparse 解析的值(例如,将整数限制为正值)?

    到目前为止我有这个代码 import argparse parser argparse ArgumentParser parser add argument g games type int default 162 help The num
  • 如何在 C# 中重置计时器?

    有三种Timer我所知道的课程 System Threading Timer System Timers Timer and System Windows Forms Timer 但这些都没有 Reset 函数会将当前经过的时间重置为 0
  • C# 将 PDF 文件上传到 Firebase 项目存储?

    你们知道如何将 PDF 文件直接上传到 Firebase 项目存储吗 我在互联网上搜索了很多 但一无所获 有一些 C 的库吗 或者有 C 和 Firebase 的文档吗 请大家帮忙 谢谢 EDIT 好的 我找到了一个库 FirebaseSh
  • 由于异步,在 WebApi 中使用 HttpContext.Current 是危险的

    我的问题与此有点相关 WebApi 相当于具有依赖注入的 HttpContext Items 我们想使用 Ninject 在 WebApi 区域中使用 HttpContext Current 注入一个类 我担心的是 这可能是非常危险 如 W
  • 使用 Path.Combine 时出现路径遍历警告

    我目前正在使用 NewtonJSON 从 JSON 文件加载一些 UI 数据 但是 有一个警告说我有路径遍历 情况如下 有办法消除这个安全漏洞吗 当用户或其他不可信源提供的路径未经检查而与父路径组合时 路径遍历漏洞就可能发生 问题在于路径的
  • 如何以编程方式访问 Maximo 列表 where 子句

    在 Maximo 的 WOTRACK 应用程序中 我需要找到某种方法以编程方式访问当前窗口查询的 where 子句 很明显 它存在于 Maximo 中的某个位置 因为您可以在 UI 中的 高级搜索 gt Where 子句 下访问它 我需要找
  • 如何在HSQLDB和C#.net之间建立连接?

    如何在HSQLDB和C net之间建立连接 我已经看过 SharpHSQL 和 H2Sharp 但无法连接 HSQLDB 尝试这样 确保您已添加 hsqldb dll IKVM OpenJDK Core dll IKVM OpenJDK J
  • 仅使用 C 从 STDIN 读取一行以提取数字标记

    问题陈述 需要处理从 STDIN 接受的输入字符串 并仅查找字符串中存在的所有数字标记 将标记视为由空格分隔的可打印字符序列 在数字标记中 所有字符都是数字 您需要构建一个新字符串 其形式为 numeric token1 numeric t
  • iptables 脚本阻止除所需应用程序之外的所有互联网访问

    CONTEXT 我想要一个 shell 脚本来阻止所有到我的计算机的入站 出站流量 除非我决定要使用浏览器或其他应用程序 在这种情况下 我会调用它并且只有这些应用程序会运行 我研究了以前由聪明人制作的脚本 最后有源链接 并投入时间自己学习使