macOS下磁盘管理diskutil命令详解

本文参考diskutil 的 man 手册进行创作!

macOS 提供了一个搭配有GUI界面的磁盘管理工具,同时还提供了一个命令行的磁盘管理命令,那就是 diskutil 。

使用命令 diskutil 可以进行在GUI界面的无法进行的更多操作,例如进行抹掉(也就是Windows下的格式化)硬盘时可选的格式少。

GUI界面的磁盘工具可选抹盘格式

如果需要抹成其他格式的磁盘,这时就需要使用到命令 diskutil 。

在接下来的篇幅中将详细介绍 diskutil 的用法。

直接在命令行输入 diskutil 会显示一个简略的介绍。

简略的介绍

这其中包括 diskutil 的基本用法和一份对磁盘不同操作的速查表。

接下来将介绍大部分操作。如现在来说APFS格式逐渐成为主流,使用APFS格式的硬盘后就没有了日志式这个说法,所以 diskutil 中 enableJournal,disableJournal,moveJournal 这些操作都是针对HFS+格式的不做介绍。

为了更好的阅读以下部分内容,现在先明晰下文所说名词:

  • 设备:下文所说的设备可以是固态硬盘,机械硬盘,U盘,内存卡
  • 文件系统:指磁盘文件系统,即格式化时使用的格式(如 FAT32、ExFAT、APFS)
  • 物理磁盘:硬盘下有文件系统的分区
  • 虚拟磁盘:使用物理磁盘的一部分虚拟成的一个磁盘
  • 设备ID:如 disk0 就是一个设备ID
  • 磁盘ID:如 disk0s1 就是一个磁盘ID

大部分的操作都需要 root 权限,所以执行命令应在前加上 sudo 。

命令中带 [ ] 的部分在执行命令时可以加上,不带 [ ] 的执行命令时必须带上。

打印磁盘列表

diskutil list [-plist] [internal | external] [physical | virtual] [device]

可选项说明:

  • -plist:以源格式打印,效果如下:

    源格式打印

    磁盘有物理磁盘和虚拟磁盘之分,我们说磁盘时默认是说物理磁盘,物理磁盘就是硬盘里有文件系统的分区。

  • internal:只打印内置磁盘
  • external:只打印外置磁盘

    内置磁盘就直接连接在主板的设备里的磁盘,而通过USB接口连接的设备里的磁盘就是外置磁盘。

  • physical:只打印物理磁盘
  • virtual:只打印虚拟磁盘

    物理磁盘就是设备里有文件系统的分区,如Windows下的C盘和D盘。而在一个磁盘中虚拟出一个磁盘,虚拟出来的磁盘就是虚拟磁盘。如你想安装一个虚拟系统进行一些测试时,没有权限更改硬盘的分区数量,这个硬盘的每个分区都非常的大,全部给虚拟系统又过于浪费,这时可以在一个物理磁盘中虚拟一个适合自己大小的磁盘来装虚拟系统,剩下的用来保存数据。

  • device:设备ID

注意:上面的命令中颇有正则表达式的风格,internal 与 external 是一组,physical 与 virtual 是另外一组,使用时只能取每组的一个两两配合使用,也可以取其中一组的一个使用,后面的 device 是可以搭配上面的情况使用的。以下是一些例子:

diskutil list #打印所有磁盘
diskutil list internal # 打印所有内置磁盘
diskutil list disk2 # 打印指定设备disk2
diskutil list internal virtual # 打印所有内置磁盘里所有的虚拟磁盘
diskutil list external physical disk2 # 打印外置设备disk2里所有的物理磁盘
  • 1
  • 2
  • 3
  • 4
  • 5

打印磁盘信息

diskutil info | information [-plist] device | -all

可选项说明:

  • -plist:以源格式打印
  • device:设备ID或磁盘ID
  • -all:打印所有设备和磁盘,包括没有挂载的

注意:info 和 information 只能选其一。device 和 -all 也只能选其一。

显示设备或磁盘的操作活动

diskutil activity

所谓的操作活动并不是指磁盘的读取与写入,操作活动指的是设备的插入、拔出、装载、挂载与推出,磁盘的重命名等( 装载指系统识别硬盘,挂载指在操作系统中的某个文件夹指向磁盘所在位置。即装载只是识别,需要访问磁盘需要进行挂载操作)。

打印支持的文件系统

diskutil listFilesystems [-plist]

可选项说明:

  • -plist:以源格式打印

以下是 macOS 支持的文件系统:

image

取消挂载某一个磁盘

diskutil umount | unmount [force] device

可选项说明:

  • force:强制取消挂载
  • device:磁盘ID

注意:umount 和 unmount 只能选其中一个,这两个是等价的。

取消挂载指定设备的全部磁盘

diskutil umountDisk | unmountDisk [force] device

可选项说明:

  • force:强制取消挂载
  • device:设备ID

注意:umountDisk 和 unmountDisk 只能选其中一个,这两个是等价的。如果 device 指定的是磁盘ID,系统也会推出这个磁盘ID所属的设备。

推出设备

diskutil eject device

可选项说明:

  • device:设备ID

挂载磁盘

diskutil mount [readOnly] [-mountPoint path] device

可选项说明:

  • readOnly:以只读的方式挂载磁盘
  • -mountPoint:选择挂载到指定的路径,路径必须是存在的
  • path:指定路径
  • device:磁盘ID

挂载设备下的全部磁盘

diskutil mountDisk device

可选项说明:

  • device:设备ID

此命令会挂载设备ID对应设备下所有的磁盘。如果 device 指定的是磁盘ID,系统也会挂载这个设备所有的磁盘。

重命名磁盘

diskutil rename | renameVolume device name

可选项说明:

  • device:磁盘ID

注意:rename 和 renameVolume 只能选其中一个,这两个是等价的。

启用磁盘所有权

diskutil enableOwnership device

可选项说明:

  • device:磁盘ID

关闭磁盘所有权

diskutil disableOwnership device

可选项说明:

  • device:磁盘ID

检查磁盘状况

diskutil verifyVolume device

可选项说明:

  • device:磁盘ID

执行fack程序检测磁盘状况,会尝试保持命令执行前磁盘的挂载或推出状态。如果一切正常会显示 “The xxxxxx appears to be OK ” ,需要拥有操作磁盘的所有权。

修复磁盘

diskutil repairVolume device

可选项说明:

  • device:磁盘ID

执行fack程序修复磁盘的数据结构。需要拥有操作磁盘的所有权。

检查设备状况

diskutil verifyDisk device

可选项说明:

  • device:设备ID

执行fack程序检测设备的状况。如果一切正常会显示 “The xxxxxx appears to be OK ” ,需要拥有操作磁盘的所有权。

修复设备

diskutil repairDisk device

可选项说明:

  • device:设备ID

执行fack程序修复设备的数据结构。需要拥有操作磁盘的所有权。

抹掉整个设备

diskutil eraseDisk format name [APM | MBR | GPT] device

可选项说明:

  • format:指定抹掉后的文件系统(只能指定支持的文件系统
  • name:抹掉后磁盘的名称
  • APM|MBR|GPT:磁盘的类型
  • device:设备ID

此命令会抹掉设备里的所有内容,并将所有分区整合为一个分区。如果不指定磁盘的类型,系统默认选择适合设备的类型。需要拥有操作设备的所有权。

抹掉某个磁盘

diskutil eraseVolume format name device

可选项说明:

  • format:指定抹掉后的文件系统(只能指定支持的文件系统
  • name:抹掉后磁盘的名称
  • device:磁盘ID

注意:需要拥有操作磁盘的所有权。

重新格式化磁盘

diskutil reformat device

可选项说明:

  • device:磁盘ID

用磁盘ID的格式和名字重新格式化磁盘。需要拥有操作磁盘的所有权。

格式化光学介质(如CD、DVD等)

diskutil eraseOptical [quick] device

可选项说明:

  • quick:快速格式化
  • device:光学介质ID

注意:需要拥有操作磁盘的所有权。

格式化磁盘并向磁盘写0

diskutil zeroDisk [force] [short] device

可选项说明:

  • force:强制执行
  • short:向device写入最少数量的0
  • device:磁盘ID或者设备ID

这种方式格式化的磁盘,系统将无法识别,如果想恢复使用,需要使用其他格式化命令如 eraseDisk 、eraseVolume 、partitionDisk 。这种格式化的意义在于增加恢复已删除数据的难度。通常操作写0需要大量的时间,通过 short 选项可以防止磁盘被其他软件意外识别,使用short选项并不能增加恢复删除数据的难度。需要拥有操作磁盘的所有权。

格式化磁盘并向磁盘随机写入数据

diskutil randomDisk [times] device

可选项说明:

  • times:写入的次数,默认为1
  • device:磁盘ID或者设备ID

这种方式格式化的磁盘,系统将无法识别,如果想恢复使用,需要使用其他格式化命令如 eraseDisk 、eraseVolume、partitionDisk 。这种格式化的意义在于增加恢复已删除数据的难度。需要拥有操作磁盘的所有权。

安全格式化设备

diskutil secureErase [freespace] level device

可选项说明:

  • freespace:只格式化未使用的磁盘空间。如32G的磁盘用了22G,带上这个选项则只格式化剩下的10G空间。
  • level:需要安全格式化的级别。提供以下几种级别,使用时输入前面的数字即可:
  • 0 :抹掉内容后向磁盘填充0并擦除,执行一次。
  • 1 :抹掉内容后向磁盘填充随机数据并擦除,执行一次。
  • 2 :抹掉内容后使用美国国防部的 5220-22 M标准改写数据并擦除,执行七次。
  • 3 :抹掉内容后使用 Gutmann 算法进行擦除,执行35次。
  • 4 :抹掉内容后使用 DOE 的三次擦除,前两次写入随机数据,最后一次写入已知数据并擦除。共三次。
  • device:磁盘ID或设备ID

来自苹果的忠告:现在这种安全格式化磁盘的方式被认为不再安全。最安全的格式化方式是对所有的数据进行强加密,然后使用以上的方式进行格式化,即使他人可以恢复所有的数据,此时的数据也没有实际的用处。需要拥有操作磁盘的所有权。

对磁盘进行分区

diskutil partitionDisk device [numberOfPartitinos] [APM | MBR | GPT] [part1Format part1Name part1Size part2Format part2Name part2Size ...]

可选项说明:

  • device:设备ID
  • numberOfPartitions:分区数量
  • APM|MBR|GPT:磁盘格式
  • part1Format:第一个分区的文件系统
  • part1Name:第一个分区的名字
  • prit1Size:第一个分区的大小

注意:numberOfPartitions 填了多少,后面都要有对应的分区文件系统、名字、大小。需要拥有操作磁盘的所有权。其中大小可以使用以下格式:165536000, 55.3T, 678M, 75%, R(R 代表让系统自动选择空闲的空间,一般用于最后一个分区的大小指定。

调节磁盘的空间

diskutil resizeVolume device limits | mapsize [-plist] | R | size [numberOfPartitions] [part1Format part1Name Part1Size...]

可选项说明:

  • device:磁盘ID
  • limits:带上这个选项则不会继续任何调节操作,只打印磁盘的有效范围
  • mapsize:带上这个选项不进行调节操作而是打印整个硬盘的大小
  • -plist:以源格式打印
  • R:自动使用所有的未格式化的空间
  • size:调整后的大小
  • numberOfPartitions:分区数量
  • part1Format:分区一的文件系统
  • part1Name:分区一的名字
  • part1Size:分区一的大小

注意:numberOfPartitions 填了多少,后面都要有对应的分区文件系统、名字、大小,调节磁盘空间有这可选项是因为需要把磁盘的空间调小时,下一个的磁盘会占用这个磁盘调小后多出的空闲的空间,到时候想把这个磁盘调回原来的大小会报错(尝试将分区扩展到另一个分区的开头或分区映射的结尾之外),这时给空闲的空间指定一个 Free Space 文件系统,便于这个磁盘下次能正常恢复调节前的大小。需要拥有操作磁盘的所有权。

分割磁盘

diskutil splitPartition device [numberOfPartitions] [part1Format part1Name part1Size ...]

可选项说明:

  • device:磁盘ID
  • numberOfPartitions:分割出来的数量
  • part1Format:第一个分区文件系统
  • partName:第一个分区名字
  • part1Size:第一个分区的大小

注意:numberOfPartitions 指定了分割数量,后面都要有对应的文件系统,名字,大小。被分割的磁盘里所有的数据将会丢失。需要拥有操作磁盘的所有权。

合并磁盘

diskutil mergePartitions [force] format name fromDevice toDevice

可选项说明:

  • force:强制执行
  • format:合并后的文件系统
  • name:合并后磁盘的显示名称
  • fromDevice:开始磁盘的ID
  • toDevice:结束磁盘的ID

注意:开始磁盘ID和结束磁盘ID之间所有的分区都会被合并,两者的ID必须是按照从小到大的顺序,且不在开始磁盘的数据都会丢失。如果不带上 force 选项,且 开始磁盘是一个可以调节大小的磁盘,系统将会忽视 format 和 name 参数,使用开始磁盘的文件系统和名字;还有如果开始磁盘是一个不可调节大小的磁盘,系统将会要求你确认是否继续。需要拥有操作磁盘的所有权。

苹果Mac专用WinClone系统镜像Windows7旗舰版最新通用版

苹果Mac专用Winclone系统镜像Windows7旗舰版最新通用版

采用Windows7 64位旗舰版,适用于2015年之前的全系列Mac。安装方法:使用磁盘工具分割Fat32分区,之后用WinlCone将镜像恢复进该分区,重启电脑,重启后会全自动部署系统。首次进桌面后请联网,联网后会自动下载并安装BootCamp驱动。如需要查看详细安装教程请点击:WinClone快速安装Mac双系统教程

系统主要特点

  1. 无人值守自动安装,自动创建User用户,并加入管理员,密码为空,密码永不过期。
  2. 整合补丁243个,目前最新版。
  3. 升级IE浏览器至IE11。
  4. 整合苹果电脑关键驱动,如网卡键盘触控板等。
  5. 首次进桌面联网后,自动下载并安装BootCamp驱动程序。
  6. 整合.Net4.7.2。
  7. 整合.Net4.7.2中文语言包。
  8. 整合VC++运行库最新版。
  9. 整合Dx9运行库最终版。
  10. 更多优化项目请看后面的优化列表。

WinClone版本与MacOS版本对照表

其他优化

  • ***桌面图标,任务栏,以及开始菜单优化***
  • 在桌面显示计算机
  • 当任务栏被占满时始终合并
  • 语言栏隐藏到任务拦
  • 取消语言栏上的帮助按钮
  • 开启Win7Aero主题
  • 开启DWM中的透明果
  • 关闭开始菜单”突出显示新安装的程序”
  • 开始菜单显示运行
  • 取消游戏里”下载有关已安装游戏的技巧和信息”和”收集最近玩过的游戏信息”
  • ***资源管理器优化***
  • 显示所有文件扩展名
  • 隐藏快捷方式小箭头
  • 隐藏可执行文件小盾牌
  • 隐藏NTFS蓝色双箭头压缩标识
  • 创建快捷方式时不添快捷方式文字
  • 禁止自动播放
  • 在单独的进程中打开文件夹窗口
  • 资源管理器窗口最小化时显示完整路径
  • 关闭视频文件预览,提高资源管理器响应速度
  • 关闭音乐文件图片预览,提高资源管理器响应速度
  • 资源管理器快速访问不显示常用文件夹
  • 资源管理器快速访问不显示最近使用的文件
  • ***安全设置优化***
  • 将用户账号控制程序(UAC)调整为从不通知
  • 开启用于内置管理员帐户的管理员批准模式
  • 关闭打开程序的安全警告
  • 禁用WindowsDefender
  • ***浏览器优化***
  • IE浏览器,关闭多个选项卡时不发出警告
  • IE浏览器,当创建新选项卡时,始终切换到新选项卡
  • IE浏览器,其他程序从当前窗口的新选项卡打开连接
  • IE浏览器,以兼容性视图中显示所有网站
  • IE浏览器,启用表单的自动完成功能
  • IE浏览器,关闭建议的网站
  • IE浏览器,跳过IE首次运行自定义设置
  • IE浏览器,不保存附件的区域信息
  • IE浏览器,启用InternetExplorer增强保护模式
  • IE浏览器,针对增强保护模式启用64位进程
  • IE浏览器,锁定InternetExplorer工具栏
  • IE浏览器,将同时可用下载数目调整到10
  • IE浏览器,遇到弹出窗口时始终在新选项卡中打开弹出窗口
  • IE浏览器,关闭IE自动更新
  • ***服务优化***
  • 关闭程序兼容性助手
  • 禁用错误报告
  • 禁用家庭组
  • 禁用客户体验改善计划
  • ***系统性能优化***
  • 优化硬盘数据存储-
  • 加快AeroSnap显示速度,更快的看到窗口缩略图
  • 加快AeroPeek透视桌面功能的显示速度
  • 提高前台程序的响应速度
  • 加快系统各内存命令的显示反应速度
  • 优化程序的反应时间,加快系统处理速度。
  • 缩短因错误程序导致鼠标键盘无反应的等待时间
  • 自动关闭无反应的程序,避免系统的”死机”隐患
  • 优化内存配置,加速游戏等软件的运行速度
  • 优化处理器的资源分配,看电影视频更流畅
  • 禁止远程修改注册表
  • ***界面效果优化***
  • 优化程序进程,独立进程优先级,避免系统”死机”
  • 优化用户界面组件,当发生异常后自动刷新,防止系统”死机”-
  • 加快任务栏窗口预览显示速度
  • ***文件系统优化***
  • 优化Windows文件列表刷新策略
  • 优化磁盘访问性能,提升磁盘数据的读写能力
  • 优化文件系统(NTFS)的管理,缩短打开文件的反应时间-
  • 关闭系统自动调试功能,提高系统运行速度-
  • 加大系统的图标缓冲,提高系统开机速度-
  • 禁止系统自动生成错误报告,加快系统反应速度-
  • 禁止U盘等移动设备的自动播放,防止被病毒感染-
  • 自动优化启动分区,加快启动速度-
  • ***网络优化***
  • 关闭默认共享
  • 关闭防火墙
  • 关闭远程协助
  • 启用最大传输单元大小自动探测、黑洞路由器探测,提高网速
  • 优化默认分组报文寿命,避免浪费流量,提高网速
  • 优化网卡性能,提升网络效率
  • 优化网络WINS名称查询时间,增强网络数据传输能力,提高网速
  • 优化网络参数设置,提高网络连接稳定性
  • 优化网络快速转发机制,提高上网速度
  • 优化局域网连接
  • 优化DNS,加快DNS的解析速度
  • 启动传输单元缓冲区自动调整,减少网络反应时间。电脑管家
  • ***Windows Update更新优化***
  • 更新挂起时如果有用户登录不自动重启计算机
  • 将Windows更新调整为-从不仅检查更新
  • ***其他优化***
  • 关闭允许网站通过访问我的语言列表来提供本地相关内容
  • 关闭反馈和诊断
  • 关闭收集语言和书写习惯
  • 关闭windows跟踪应用启动
  • 反馈频率改为”从不”
  • 关闭传递优化
  • 右键添加管理员取得所有权
  • 去掉WinRAR在右键菜单中添加的”压缩…并E-Mail”
  • 记事本自动换行
  • 记事本始终显示状态栏
  • 用记事本打开NFO文件
  • WindowsMediaPlayer不显示首次使用对话框
  • 启用Windows照片查看器
  • VHD启动时不要将VHD动态文件扩展到最大(以节省空间)
  • 禁止蓝屏时自动重启
  • 禁用系统日志
  • 禁用组件堆栈(ComponentBasedServicing)文件备份
  • 禁用WfpDiag.ETL日志

下载地址

如何把可引导的U盘做成ISO镜像文件

下面我们就来学习一下,如何把可引导U盘制作成ISO文件.

首先,咱们得准备UltraISO软件. 链接:http://pan.baidu.com/s/1YjnXW 密码:fm7k
简体中文版专用:
注册名:Guanjiu
注册码:A06C-83A7-701D-6CFC

多国语言版专用:
注册名: Home
注册码: 4BA9-0D54-214A-C938

1. 插入可引导U盘到电脑上.并打开UltraISO软件.如下图所示,选择“启动”菜单下的“从软盘/硬盘驱动器提取引导扇区…”,制作引导文件。
01

2.    弹出“制作软盘映像”窗口。“软驱”选择U盘位置,我这里是J:盘符。再选择“输出映像文件”的路径。然后点击“制作”。

2

3. 很快,大约1秒.提示:软盘映像制作完成!“确定”。

3

4. 我们把刚导出的boot.bsf改为boot.bin.

4

5.  在UltraISO软件“本地目录”打开U盘,将U盘里的所有文件全选中并拖拽至虚拟区域,如下图所示。准备制作ISO文件。

5

6

6. 接下来,选择“启动”菜单下的“加载引导文件…”

7

7. 把我们刚刚改后缀的bin文件打开加载进来。

8

现在,你会看到在软件界面左上方的“光盘目录”右边显示为“可引导光盘”。现在引导和启动文件都准备好了。

8. 选择“文件”菜单下的“保存”,保存提取出来的镜像文件。设置文件名称,选择输出路径,保存类型为*.iso,“保存”。

9

10

11

大功告成,最终在指定的目录上就能看到提取出来的ISO镜像文件了。

 制作Legacy BIOS/UEFI双引导多Win10 FE 和 安装Mac OS的多合一U盘

自 威锋网页版

2.7w
40
只看楼主
本帖最后由 czczyx 于 2018-3-27 10:18 编辑

制作Legacy BIOS/UEFI双引导Win10 FE 和
安装Mac OS的多合一U盘
本文根据jftpc的帖子:
以及他的高清视频教程:
《如何用FbinstToolv1.7制作干净的UD格式(五分区)WinPE启动盘》实践后编写。
由于jftpc提供的视频教程大小接近3G,下载不便,
而且我在同一U盘中加上了视频中没有的Mac OS安装U盘,
特发布这个图文教程供有兴趣的网友制作参考——其中PE部分,可以视为jftpc视频教程的图文版。
感谢jftpc大大提供的视频教程和PE等资料!
特别感谢jianliulin大大为我们创作了FbinstTool v1.701.2017.0318这个超级牛掰的启动盘制作工具
——只用这一个工具,就可完成所有工作!!
一、 U盘功能
1、 Legacy BIOS/UEFI双引导Win10 FE(UEFI Win10 PE可随时更换);
2、 安装Mac OS;
3、 U盘数据分区。
二、 操作环境及工具、设备、原料
1、 Mac OS(可以是虚拟机)
2、 Windows 7 x64或以上(可以是虚拟机)
3、 Qemu启动测试器 v3.14.7.31
4、 FbinstToolv1.701.2017.0318
5、 至少16G USB 3.0 U盘(16G U盘建立的data数据分区比较小,不够放入Windows的ISO安装镜像,除非你减少WinPE的种类。我用的是USB 3.0 SanDisk Extreme CZ80 64GB)。
6、 支持UEFI启动的WinPE ISO镜像:
(1)女娲工坊 Win10 PE (32位/64位):WinlOPE2inl.2Ol8.2.iso
(2)Win10网络版:Win10_16299_PE_x86&x64_10.31.iso
(3)杏雨梨云USB维护系统戊戌版.ISO
7、 Mac OS安装包(自选)。我用的是macOS High Sierra 10.13.3 (Install macOSHigh Sierra.app)。
三、 制作过程
(一) 进入Windows环境,插入U盘,备份好U盘上的重要资料。
以管理员身份运行FbinstTool v1.701.2017.0318。
确保“选择磁盘”中是你的目标U盘:

image

(二)回收U盘
制作前的U盘上有许多乱七八糟的文件,也可能有几个分区,先把U盘回收一下吧!
1、点击主菜单【启动设置-格式化】:
image

2、勾选“重置磁盘”和“强行格式”,点击“格式化”:
image

3、出现提示信息,点击两次“是”确认。最后提示格式化成功,点击“确定”:
image

(三)将U盘格成UD扩展区
1、点击主菜单【启动设置-格式化】。
2、勾选“强行格式”和“UD扩展区”,双击“UD扩展区”右边的空格,自动获取并填入U盘的总容量。点击“格式化”:
image

按提示确认格式化。
“磁盘管理”中的U盘变成了RAW(未格式化)分区:
image

3、使文件列表看起来清爽一点。
右键点击FbinstTool窗口中的文件“mbr.pt”,点击【删除文件】:
image

4、执行“碎片整理”(重要!)—— 在UD扩展区删除文件后一定要进行碎片整理,否则Legacy BIOS引导PE会出错!
点击主菜单【数据管理-执行碎片整理】,很快提示“碎片整理完成”:
image

(四)导入mbr、message两个文件到主分区
1、在FbinstTool列表空白处点击右键,点击右键菜单第一项【导入文件】:
image

2、选择引导文件grldr后点击“打开”:
image

成功导入引导文件:
image

3、再次在FbinstTool列表空白处点击右键,点击右键菜单第一项【导入文件】。
4、选择多PE引导菜单管理文件message后,点击“打开”:
image

(五)创建分区镜像文件
1、创建用于Legacy BIOS PE引导的img镜像文件(空盒子),给以后即将导入的PE iso占个位。
1.1右键点击FbinstTool列表空白处,点击右键菜单【新建文件】:
image

1.2 “文件名”可以取便于记忆理解的,例如mbrpeiso.img。
“文件大小”要大于你想在这个空盒子中封装的PE iso镜像文件的总和。
比如你要在这个空盒子中写入3个PE iso镜像,那么这个空盒子的大小可取3G=3072M。
设置后点击“确定”:
image

2、用同样的方法,再创建一个数据分区的镜像img文件(空盒子)。文件名可以为data.img。
文件大小计算方法:
目前,FbinstTool窗口底部显示扩展分区剩余空间:56756MB。
还要准备创建三个分区的img文件:
第一个供写入UEFI引导的PE用,大小为1G=1024M;
第二个供写入UEFI Clover引导的EFI文件夹用,也可以以后封装另一个UEFI引导的PE,所以,大小也为1G=1024M;
第三个供写入Mac OS安装包用,大小设为7G=7168M(留有余地,方便以后系统安装包升级)。
这样,data.img文件大小为:56756M-2×1024M-7168M=47540M。
如下图所示:
image

3、如法炮制,依次建立以下三个分区的img文件:
(1)供写入UEFI引导的PE用,文件名为uefi1.img,文件大小为1024M。
(2)供写入UEFI Clover引导的EFI文件夹用,文件名为uefi2.img,文件大小为1024M。
(3)供写入Mac OS安装包用,文件名为macos.img,文件大小为7168M。
这时,FbinstTool窗口底部显示扩展分区剩余空间:0.00 MB。
(六)把img镜像文件转为分区
1、mbrpeiso.img是用来占位用的,不用转换为分区。
2、右键点击data.img,点击【加入到分区表】
image

这时,data.img改变为分区图标:
image

3、用同样的方法,依次分别将uefi1.img、uefi2.img、macos.img三个img转变为分区。
4、删除占位文件——右键mbrpeiso.img,点击【删除文件】并确认:
image

img转为分区完成后的文件列表:
image

(七)导入3个PE iso文件到扩展分区
右键点击FbinstTool列表空白处,点击【导入文件(扩展分区)】,依次分别导入三个PE iso:
1、WinlOPE2inl.2Ol8.2.iso

image

image

如法炮制,再导入
2、Win10_16299_PE_x86&x64_10.31.iso
3、杏雨梨云USB维护系统戊戌版.ISO
导入PE iso文件后的文件列表:

image

(八)加入“多PE豪华grldr菜单”
1、打开“多PE豪华grldr菜单.txt”

2检查确认其中每一个map (bd)/后面的iso文件名与刚才导入的三个PE iso文件名完全相同。如果不同,请修改后保存。

image

3、选中全部文本,按Ctrl+c键拷贝。
4、点击FbinstTool窗口的【Grldr菜单】

5、全部选中FbinstTool窗口中的Grldr菜单文本,按Ctrl+v,将“多PE豪华grldr菜单.txt”中的文本全部粘贴到Grldr菜单中。

image

6重要!FbinstTool窗口的空白处点击右键,点击【保存(UTF-8)】。

image

(九)在“文件资源管理器”或“磁盘管理”中将data分区格式化为exFAT格式,以便WindowsMacOS系统共享数据。(如果有什么问题,可以拔、插一下U盘试试)


至此,Legacy BIOS 引导的Win10 PE U盘制作完成,可以运行Qemu启动测试器测试一下。
 
(十)导入UEFI引导的PE
1、在FbinstTool中将uef1.img转变为可见分区
1.1 点击菜单【启动设置-分区表】:

image

1.2 用鼠标将uef1.img拖到分区表最上面,其序号自动变为0,则该分区在Windows下可见。
点击“保存“:
image
2、打开“文件资源管理器”,找到一个支持UEFI的PE(例如:女娲工坊PE:WinlOPE2inl.2Ol8.2.iso,也可自己选用支持UEFI引导的其它PE iso),双击加载到虚拟光驱,将其中的全部文件拖曳(即复制粘贴)到uef1.img对应的可见分区(本例是F:)。
image

如法炮制,再次点击FbinstTool菜单【启动设置-分区表】,把uef2.img拖到分区表最上面后保存,uef2.img就转变为可见分区了。
将另一个支持UEFI引导的WinPE ISO(例如:杏雨梨云USB维护系统戊戌版.ISO)加载到虚拟光驱,将其中的全部文件拖曳到uef2.img对应的可见分区(本例是G:)。
第二个UEFI 引导的Win PE分区制作完成。


(十一)重要!重新排列各分区顺序
在FbinstTool中点击菜单【启动设置-分区表】,拖曳各img文件按正确的顺序排列好。
排列正确的标准,是各img文件的“起始扇区号”自上而下一定要按从小到大的顺序排列。
排列好后,点击“保存”:
image

 
(十二)制作Mac OS安装U盘


1、进入Mac OS环境,插上U盘。
2、运行“磁盘工具”,对U盘上大小为7G的分区抹盘,名称取“USB01”(不含引号),格式为:Mac OS扩展(日志式)。确保USB01宗卷图标显示在桌面上。
image

3、确保下载的Mac OS 系统安装包(例如:Install macOS HighSierra.app)在“应用程序”中。
4、运行“终端”,输入代码(可复制、粘贴):
sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia –volume /Volumes/USB01 –applicationpath /Applications/Install\ macOS\ High\ Sierra.app –nointeraction
根据提示键入系统密码(键入时看不见密码,键入密码完成后按回车键即可),等待十几分钟(有的U盘可能要更长时间),直到提示:
……
Making disk bootable…
Copying boot filrs…
Copy complete.
Done.
至此,Mac OS安装U盘制作完成。


四、使用和维护
(一)使用
1、若将PC电脑的BIOS设置为Legacy BIOS引导,开机选择U盘启动,将出现启动菜单:
image

选择其中一项即可进入PE或本机硬盘引导。
2、若将PC电脑的BIOS设置为UEFI引导,以我的GAZ77P-D3主板为例,开机按F12(其它牌号的主板根据主板说明书选择),将出现启动设备选单:
image

按上下方向键即可选择UEFI Win PE1(例如:女娲工坊PE)或UEFI Win PE2(例如:杏雨梨云PE)启动。
当你选择UEFI PE1启动后,会进入UEFI PE选单,选择其中一项后回车,即可进入对应版本的PE:
image

3、安装白苹果系统
在Mac上插上U盘,开机时按住option键,将出现引导设备选单:
image

选择“Intall macOS High Sierra”后回车,即可启动macOS High Sierra系统安装:
image

 
(二)维护
1、如果要更换Legacy BIOS 引导的其它Win PE,请以管理员身份运行FbinstTool v1.701.2017.0318,在FbinstTool中先删除被替换的原来的Win PE,然后点击菜单【数据管理-执行碎片整理】。最好先删除全部已经导入的Win PE,执行碎片整理后再导入需要的Win PE。更换后请按步骤(八)修改菜单。
2、如果要更换UEFI引导的Win PE,可直接删除对应UEFI Win PE分区中的所有文件,考入新的UEFI Win PE文件。
3、安装Mac OS可以自选其它版本的Mac OS安装包用终端或其它方法制作安装U盘。可参考:
《【授人于渔——扫盲贴】制作OS X安装U盘,其实你有多种方法可选择》


最后给出创建多合一启动U盘资源下载链接:
密码:vl33
 
图文教程到此结束。祝大家依样画葫芦成功并有所创新!

打造openwrt路由固件for acrh17

一、概述

最近刷了几个openwrt固件都不是特别满意,所以准备试着做一个自己的路由固件。

二、环境描述

操作系统:ubuntu-19.10-desktop-amd64 openwrt:最新版 路由器:ASUS-ACRH17

三、安装步骤

首先安装Ubuntu系统,安装步骤一直下一步即可,非常简单,此处略过。 其次Ubuntu默认没有启用ssh,所以要先安装ssh服务。硬盘空间分配100G

3.1 安装ssh服务

  1. 输入命令sudo apt-get install openssh-server,输入管理员密码

  2. 输入命令’ps -e |grep ssh’看到如下图所示,即安装成功。 file

3.2 基础环境

  1. 分别输入命令

    sudo apt-get update

    sudo apt-get upgrade

    进行更新。

    闲国外站点慢的话,可以更换国内站点。

  2. 安装基础环境 输入命令sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev file

  3. 下载

    openwrt

    mkdir lede             #新建一个目录
    sudo chmod 777 lede        #修改权限(重要)
    cd lede                #进入目录
    git clone  https://git.openwrt.org/openwrt/openwrt.git #openwet最新源码包地址

    这里需要梯子

  4. 更新源码中的软件。

    cd lede/openwrt
    ./scripts/feeds update -a      #下载最新软件
    ./scripts/feeds install -a     #把下载完的新软件进行安装

3.3 编译openwrt

  1. 输入命令make menuconfig进入编辑界面 file

  2. 选择路由器对应的CPU类型。照着图选CPU类型 file

  3. 添加需要的功能

    file

    file

    3.1 第一个选项是UI主题 file 3.2 选择web界面语言 file 3.3 添加功能模块,根据自己需求自定义。 file

  4. 编译安装

    选完自己需要的功能后,开始编译安装

    最后生成刷机用的BIN固件(三选一)

    make V=99          #生成固件并显示成生的每一个步奏及正确性。速度最慢,建议首次生成时使用(3小时左右)。
    make V=s           #生成固件忽略不影响固件主功能的错误
    make -j4 V=s       #调用CPU全部性能来生成固件,相对速度最快,但首次生成时不建议使用。

等完成后,会在openwrt源码主目录下有一个BIN目录,在BIN目录下边多级目录下找你的BIN刷机文件吧。详细的就不叙述了。

OPKG 软件包管理

常用命令
opkg update 更新可以获取的软件包列表
opkg upgrade 对已经安装的软件包升级
opkg list 获取软件列表
opkg install 安装指定的软件包
opkg remove 卸载已经安装的指定的软件包

opkg 工具 (一个 ipkg 变种) 是一个用来从本地软件仓库或互联网软件仓库上下载并安装 OpenWrt 软件包的轻量型软件包管理器。

GNU/Linux 用户可能会对 apt-getaptitudepacmanyum 等比较熟悉,也会看出其相似之处。它与 NSLU2 上同样用于嵌入式设备的 Optware 也有相似之处。OPKG 没有仅仅将软件安装到一个单独的路径(如:/opt),而是根文件系统上的一个完整的包管理器。它也包含了增加内核模块与驱动的可能性。OPKG 有时被称为 Entware ,但这主要是针对为嵌入式设备准备的 Entware 仓库。

opkg 试图在软件包仓库内来解决依赖关系。如果失败了,它将会报告一个错误并停止安装该软件包。

如果丢失第三方包的依赖关系,源码包依然可用的话,为了忽略依赖关系的错误可以使用 –force-depends 选项。

:!: 请注意: 如果你在使用一个 snapshot 、trunk 或 bleeding edge 版本,在仓库中的软件包适用内核版本比你的 Flash 上的内核更高,opkg install <pkg> 可能会失败。这种情况下,会报错『Cannot satisfy the following dependencies for…』。参见OpenWrt FAQ

调用

opkg 必须有一个子命令参数:

用法: opkg [选项…] 子命令 [参数]

其中的子命令可以是:

可以使用  glob 模式.

软件包管理

update 更新可用软件包列表
此命令直接为你安装的 OpenWrt 获取一个类似样例的文件,保存到内存分区的 /tmp/opkg-lists/snapshots 中。现在大约占用 1.3MB 空间。OPKG 需要它的内容才能安装、升级软件包或打印软件包信息。此文件内容须体现软件仓库中当前的可用软件包。为释放内存空间,你可以安全地删除这个文件,但不要忘记在安装软件前重新获取一个。
upgrade <pkgs> 升级软件包
要升级一组软件包,运行 opkg upgrade软件包名1 软件包名2 即可。
命令 opkg list-upgradable 可以获取一个可升级软件包的列表。
通常我们不推荐普通用户去升级软件包,因为一个典型的 OpenWrt 系统是存储在只读的 SquashFS 文件系统中。同时当升级工作做完后,使用了远超出在 SquashFS 文件系统或 JFFS2 文件系统默认安装基本软件包的容量。
因此,推荐用刷一个更新的 OpenWrt 固件来代替升级软件包。当然,升级已安装的软件包没有这种问题。Keep in mind though that for OpenWrt releases upgrading is for the most part not possible, since there is nothing to upgrade without changing the package repository. This is because the package repositories for OpenWrt’s releases are generally not updated. However, the package repository in the trunk snapshots are updated by the build bots to new versions very often, as this is where the packages are updated, like the OpenWrt builds themselves. Note however that for kernel packages updating can be a risky business as it may brick the device if the trunk build kernel is incompatible with the new upgraded kernel package. You should therefore only upgrade non-kernel packages.
install <pkgs|FQDN> 安装一个或多个软件包
例如:

opkg install hiawatha
opkg install http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/hiawatha_7.7-2_ar71xx.ipk
opkg install /tmp/hiawatha_7.7-2_ar71xx.ipk
configure <pkgs> 配置一个或多个未安装的包
remove <pkgs|globp> 移除一个或多个软件包
flag <flag> <pkgs> 标记一个或多个软件包
每次调用仅允许一个标记。可用标记有:
hold • noprune • user • ok • installed • unpacked

阅读有关 正则表达式http://en.wikipedia.org/wiki/Regular_expression

信息命令

list [pkg|globp] 列出可用软件包

Package name - Version - Description

描述信息 (Description) 可能包含换行,so using merely grep is inapt since grep is line-based.

list-installed 列出已安装软件包
list-upgradable 列出可升级的已安装软件包
list-changed-conffiles 列出用户修改过的配置文件
files <pkg> 列出属于软件包 <pkg> 的文件
仅适用于已安装的软件包。例如:

opkg files asterisk18
Package asterisk18 (1.8.4.4-1) is installed on root and has the following files:
/usr/lib/asterisk/modules/res_rtp_multicast.so
/usr/lib/asterisk/modules/codec_ulaw.so
/etc/asterisk/features.conf
/usr/lib/asterisk/modules/format_wav_gsm.so
/usr/lib/asterisk/modules/app_macro.so
/usr/lib/asterisk/modules/chan_sip.so
/usr/lib/asterisk/modules/app_dial.so
/usr/lib/asterisk/modules/app_playback.so
/usr/lib/asterisk/modules/format_gsm.so
/usr/lib/asterisk/modules/func_callerid.so
/usr/lib/asterisk/modules/func_timeout.so
/etc/asterisk/asterisk.conf
/etc/asterisk/modules.conf
/usr/lib/asterisk/modules/format_wav.so
/etc/asterisk/extensions.conf
/etc/init.d/asterisk
/etc/asterisk/manager.conf
/usr/lib/asterisk/modules/res_rtp_asterisk.so
/etc/asterisk/logger.conf
/etc/asterisk/rtp.conf
/usr/lib/asterisk/modules/codec_gsm.so
/etc/asterisk/indications.conf
/usr/lib/asterisk/modules/func_strings.so
/usr/lib/asterisk/modules/app_echo.so
/usr/lib/asterisk/modules/format_pcm.so
/etc/asterisk/sip_notify.conf
/etc/asterisk/sip.conf
/etc/default/asterisk
/usr/sbin/asterisk
/usr/lib/asterisk/modules/pbx_config.so
/usr/lib/asterisk/modules/func_logic.so
search <file|globp> 列出包含 <file>
info [pkg|globp] 显示软件包 <pkg> 的所有信息

Package: horst
Version: 2.0-rc1-2
Depends: libncurses
Provides:
Status: install user installed
Section: net
Architecture: ar71xx
Maintainer: Bruno Randolf <br1@einfach.org>
MD5Sum: 378cea9894ec971c419876e822666a6a
Size: 19224
Filename: horst_2.0-rc1-2_ar71xx.ipk
Source: feeds/packages/net/horst
Description: [horst] is a scanning and analysis tool for 802.11 wireless networks and
 especially IBSS (ad-hoc) mode and mesh networks (OLSR).

注1: size 是 gzip 压缩后的 tar 包尺寸。安装阶段,软件包会被展开解压缩,JFFS2 会再次将之压缩。
注2: 因 JFFS2 压缩是『透明』的,像 ls 之类的命令仍会返回未压缩的文件尺寸。

status [pkg|globp] 显示软件包 <pkg> 的状态
download <pkg> 下载软件包 <pkg> 到当前目录
compare-versions <v1> <op> <v2> 使用关系符 <=<>>==<< 或 >> 来比较两个版本 v1 和 v2 。
print-architecture 列出可安装软件包的结构
whatdepends [-A] [pkgname|pat]+ 仅适用于已安装的软件包。所以如果你想知道一个软件包及其所有依赖占用的空间,你只能将这个选项的输出分拆后传给 info 选项来计算。
whatdependsrec [-A] [pkgname|pat]+ 仅适用于已安装的软件包。所以所以如果你想知道一个软件包及其所有依赖占用的空间,你只能将这个选项的输出分拆后传给 info 选项来计算。
whatprovides [-A] [pkgname|pat]+
whatconflicts [-A] [pkgname|pat]+
whatreplaces [-A] [pkgname|pat]+

选项

短选项 长选项 描述
-A 查询全部软件包(不仅是已安装的)
-V[<level>] --verbosity[=<level>] 设置『唠叨』级别为 <level> 。
可用的级别有:
0 仅错误
1 普通消息(缺省情况)
2 有用的消息
3 调试
4 调试等级2
-f <conf_file> --conf <conf_file> 设置 opkg 配置文件为 <conf_file> 。缺省为 /etc/opkg.conf
--cache <directory> 指定包缓存
-d <dest_name> --dest <dest_name> 设置软件包安装、删除、升级的根目录为 <dest_name> 。
<dest_name> 应为已在配置文件中定义的目的名称(but can also be a directory name in a pinch)。
-o <dir> --offline-root <dir> 指定离线安装软件包的根目录。
--add-arch <arch>:<prio> 注册架构及其优先级
--add-dest <name>:<path> 注册目的名及其路径
强制性选项
--force-depends 在安装、删除软件包时无视失败的依赖
--force-maintainer 覆盖已经存在的配置文件
--force-reinstall 重安装软件包
--force-overwrite 覆盖其它软件包的文件
--force-downgrade 允许 opkg 降级软件包
--force-space 禁用可用空间检查
--force-checksum 忽略校验和失配
--force-postinstall 离线模式下仍运行安装后脚本
--noaction 无操作 – 仅测试
--download-only 无操作 – 仅下载
--nodeps 不跟踪依赖
--force-removal-of-dependent-packages 移除软件包的同时,移除其所有依赖软件包
--autoremove 移除自动安装以满足依赖的软件包
-t --tmp-dir 指定临时目录

举例

安装

要安装软件包,执行下列命令。注意重启设备会使可用软件包列表丢失,所以在试图安装软件包之前务必更新列表。

opkg update
opkg install <package>

搜索

  • opkg list 仅会显示  包名 — 版本 — 描述
  • opkg info 会显示全部可用信息

你可以直接使用 glob 模式,或者写个小的 Shell 脚本来使用正则表达式或进一步的进程信息。使用管道(|)以及 grep 、awk 或 sed 指令来过滤输出:

  • opkg list | grep pattern
  • opkg list | awk '/pattern/ {print $0}
  • opkg info kmod-ipt-* | awk '/length/ {print $0}
  • opkg list-installed | awk '{print $1}' | sed ':M;N;$!bM;s#\n# #g
  • var="packagename1 packagename2 packagename2"; for i in $var; do opkg info $i; done;
  • opkg depends dropbear 并不会起作用。

配置

调整仓库

唯一的配置文件是 /etc/opkg.conf ,它可能看起来是这样:

src/gz snapshots http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay

本地仓库

你可以配置 opkg 从本地获取软件包:

src/gz local file:///path/to/packagesDirectory

Barrier_breaker 使用多个仓库,每个参考需要个唯一的标识符。逻辑上使用仓库原始的名称。如:

...
src/gz base file:///path/to/packages/directory/packages/base
src/gz luci file:///path/to/packages/directory/packages/luci
src/gz packages file:///path/to/packages/directory/packages/packages
src/gz oldpackages file:///path/to/packages/directory/packages/oldpackages
... etc ...
实例
r=44685
search="http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic"
replace="file:///mnt/sdcard/shared/users/www/r$r"
sed -i -e "s!$search!$replace!" /etc/opkg.conf

共享给第二个路由器:

ln -s /mnt/sdcard/shared/users/www /www/pendrive

在第二个路由器上:

r=44685
search="downloads.openwrt.org/snapshots/trunk/ar71xx/generic"
replace="192.168.1.1/pendrive/r$r"
sed -i -e "s!$search!$replace!" /etc/opkg.conf

修改处理器架构

缺省情况下,opkg 仅操作标记架构为 all(即架构无关)或与目标平台相同的软件包。要从外引入兼容目标平台的软件包,可以在 opkg.conf 中使用 arch 选项追加可用的架构。

arch all 100
arch brcm4716 200
arch brcm47xx 300

上面的例子将允许将 brcm47xx(即 SoC 系列)软件包安装到 brcm4716(某特定的 SoC)平台。行尾的数字向 opkg 指定了优先级索引,以便在有多个可用包时选择最合适的那个。

代理支持

要透过代理使用 opkg,在 /etc/opkg.conf 中添加:

option http_proxy http://proxy.example.org:8080/
option ftp_proxy ftp://proxy.example.org:2121/

使用以下设置来进行代理服务器的认证:

option proxy_username xxxx
option proxy_password xxxx

有时,因为 busybox 中 wget 的限制,代理服务器的认证可能失败。这时,可以尝试在代理服务器的 URL 中传入用户名和密码:

option http_proxy http://username:password@proxy.example.org:8080/
option ftp_proxy http://username:password@proxy.example.org:2121/

安装目标

Extroot

使用 extroot 就足够了,无需进一步配置。

挂载点

opkg 有个不为那些 apt 系工具使用者熟悉的有用特性,它可以为任一软件包指定安装目的位置。

:!: 许多软件包不可重新定位,且可能无法干净地安装到非根目录下!像 LuCI 就会找不到它的模块,且若不手动修复就不能工作!使用 Extroot 吧!
:!: 别指望这个办法能『拆箱即用』,大多软件包需要额外的符号链接或 hack 才能在改变的路径下正常工作!

事实上,默认的 opkg.conf 包含三个目的位置:

dest root /
dest ram /tmp
dest mnt /mnt

目的位置行的格式很简单,关键字 dest 跟着目的位置名称(可以随便起),然后就是文件系统位置。任一如上配置好的目的位置都可以在 opkg 命令行中使用,如:

opkg install somepackage -d destination_name

dest 参数必须为 /etc/opkg.conf 中定义的目的位置名。如:-d ram 会将软件包安装到 /tmp/ 下。

若要在非根的目的位置安装内核模块,你可能要先读下<red>这个</red>。

详细说明

首先 mount 到外部文件系统,操作帮助见 Mounting Filesystems 。然后编辑 /etc/opkg.conf :

  • 在文件末尾加一行  dest usb /opt
  • 执行命令(假定你将外部文件系统挂载到了  /mnt/sda1 ):

    ln -s /mnt/sda1 /opt
  • 若你已通过  opkg -d ram 将软件包安装到了  tmp 文件夹,你需要加个新的 bin 和 lib 路径:

    export PATH=$PATH:/tmp/usr/bin/
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/usr/lib/
  • 编辑  /etc/profile ,为你的  PATH 变量追加挂载点:

    export PATH=<current default path>:/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin
    export LD_LIBRARY_PATH=<current default LD library path>:/opt/lib:/opt/usr/lib
  • 到此,你应可向挂载点安装新软件包了:

    opkg update
    opkg -dest usb install asterisk14  # or whatever else you want…
  • 若你向外部文件系统安装软件包,而该文件系统的  /etc/init.d 及(若启用) /etc/rc.d 下已有启动脚本,你需要设置个符号链接到  /etc/init.d 。如:

     ln -s /usb/etc/init.d/openvpn /etc/init.d/openvpn
  • 跟随软件包安装的库也会被安装到外部文件系统。这使得程序不会在引导时启动。你需要在每个启动脚本中手动设置  LD_LIBRARY_PATH :

     export LD_LIBRARY_PATH=/lib:/usr/lib:/tmp/lib:/tmp/usr/lib:/usb/lib:/usb/usr/lib
其它说明
  1. 挂载外部分区,见  Mounting Filesystems
  2. 修改  /etc/opkg.conf ,为预期的挂载点加入个新的目的位置或:
    1. 修改目的位置的根目录,指向你的 USB 磁盘。
    2. 将  /usr/lib/opkg 目录的内容复制到你的挂载点。比如 USB 磁盘。
    3. map directories where it is likely that they’ll receive lots of files to your usb drive, for example with mount –bind during startup.  /etc/rc.local could be one place where to map the directories.

example:

mount --bind /mnt/usb/root /root
mount --bind /mnt/usb/usr/local /usr/local
mount --bind /mnt/usb/home  /home

对于包含库的软件包,若安装到了外部磁盘,需要配置才能找到。 安装 ldconfig 并在 /etc/ld.so.conf 中列出附加库路径会解决这个问题。在新库安装后,必须执行过 ldconfig。它可以被安装到外部磁盘。在启动时执行一次它也许是个好主意。也许是在 /etc/rc.local 中。

内核模块

安装到非标准位置的内核模块有可能不会自动加载,这时就需要手动插入内核。例如,在把 libdevmapper 安装到 /mnt 下面后,插入此模块:

insmod /mnt/lib/modules/2.6.36.4/dm-mod.ko

你可以把守护进程和『内核』服务安装到内部 Flash 中,把可选的软件包安装到外部挂载点。启动过程中,若外部磁盘被挂载,外部目录的可执行文件(<挂载点>/[bin,sbin,usr/bin,usr/sbin])会被加进 PATH 变量。路由器通过这种方式继续提供相关服务,即使外部存储已经离线。

软件包若安装到外部驱动器中,可能引发下列问题:

  • file
    It installs its dependency libmagic to external drive too, but looks for that lib on root device.
    Fix: a script with be name “file” in a directory in PATH which is searched before the directory which contains the executable “file”, which calls file (full path) with option -m and path to the libmagic:

    #!/bin/sh
    /mnt/usb/usr/bin/file -m /mnt/usb/usr/share/file/magic "$@"

    after saving the script, and making it executable (chmod +x /path/of/script/file), executing once “hash -r” may or may not be needed.

  • netcat
    Not really a problem, but the link nc (busybox?) was still pointing to a file with wrong location.
    Moving the nc link to external drive (to the dir containing netcat) fixes that.
  • nfsd
    /etc/init.d/nfsd contains hardcoded paths to executables on  /usr/sbin
    Fix: edit  /etc/init.d/nfsd, by changing those paths to updated location.
  • lvm2
    /etc/init.d/lvm2 contains hardcoded paths to executables on  /sbin
    Fix: edit  /etc/init.d/lvm2, by changing these paths to updated location.

More information on installing and using ldconfig can be found in this article.

Some programs need additional config files to run, and you will have to create soft links between the root filesystem and the external storage one (e.g. USB). As an example, to successfully run Midnight Commander after installing it on a USB stick, you must run:

ln -s $USB/usr/share/terminfo/ /usb/share/
ln -s $USB/etc/mc /etc/mc

Troubleshooting

磁盘空间耗尽

若 opkg 耗尽了存储空间,它通常会报告个 Could not obtain administrative lock 错误,表示没有干净地恢复孤悬的文件锁。可以调用 rm /usr/lib/opkg/lock 命令来删除这个文件锁。

除此之外,opkg 可能不会删除之前安装的文件。
处理此事的一种办法是获取一个之前安装的文件的列表,然后删除它们。

将 URL 替换为相应的包:

(cd /; \
 wget -qO- http://downloads.openwrt.org/snapshots/trunk/ar7/packages/6in4_10-1_all.ipk | \
 tar -Oxz ./data.tar.gz | tar -tz | xargs rm)

然而,上述代码并没有可靠地删除那些伴随软件包安装进去的依赖软件包。它也遗留下了那些空目录。这个脚本尝试修正这些问题:

#!/bin/sh
#takes one argument/parameter: the name of the package which didn't install correctly and should be removed along with its dependencies
#do opkg update first
#example: ./opkgremovepartlyinstalledpackage.sh pulseaudio-daemon

#get list of all packages that would be installed along with package x
opkg update
PACKAGES=`opkg --force-space --noaction install $1 | grep "http:" | cut -f 2 -d ' ' | sed 's/.$//'`
for i in $PACKAGES
do
        LIST=`wget -qO- $i | tar -Oxz ./data.tar.gz | tar -tz | sort -r | sed 's/^./\/overlay/'`
        for f in $LIST
        do
                if [ -f $f ]
                then
                        echo "Removing file $f"
                        rm -f $f
                fi
                if [ -d $f ]
                then
                        echo "Try to remove directory $f (will only work on empty directories)"
                        rmdir $f
                fi
        done
done
echo "You may need to reboot for the free space to become visible"

将之保存在你的 OpenWrt 设备上,命名为 opkgclean.sh ,设置为可执行 chmod +x ./opkgclean.sh ,然后你可以这样执行它 ./opkgclean.sh <package-name> 。

其它

要使 opkg 的输出有颜色,可以用 http://pastie.org/5464938.

命令

To find installed pkgs of a specific install target (ex. USB) (DRAWBACK!!! if any update availlable, it will update the package, just be warned!!!):

for pkg in `opkg list-installed | sed -e "s/^([0-9A-Za-z\-]+) - .*$/\1/p" -n`; do opkg install $pkg; done | grep -i installed\ in\ <TARGET>

[UEFI启动U盘]三种UEFI启动U盘制作方法

来源:http://www.tudoupe.com时间:2016-06-27

三种UEFI启动U盘制作方法

UEFI启动U盘的制作很多网友都在咨询小篇,而且因为个人的喜好不同,所有制作软件也不尽相同。下面小篇就经常用到的三种UEFI启动U盘制作方法和大家说明一下。
一、使用土豆PE制作UEFI启动U盘,这是小篇比较主张的一种方法。具体的操作方法:
1、准备一个空U盘,应该大于4G。下载可制作UEFI启动的系统,可以是本站win7 64位安装版系统(点击进入下载页面,其他下载站的win7 64位安装版系统是不带UEFI启动的),也可以是win8 64位系统,或win10 32位,64位系统,都要原版系统,不能是GHOST版系统。最后下载土豆PE制作工具(点击进入下载页面
2、先把下载的土豆PE制作工具安装后运行打开,按下图设置进行制作(土豆PE制作UEFI启动U盘五步图)
三种UEFI启动U盘制作方法
二、ultraiso制作UEFI启动U盘
1、同样不小于4G的空U盘,下载本站win7 64位安装版系统(点击进入下载页面),也可以是win8 64位系统,或win10 32位,64位系统,都要原版系统,不能是GHOST版系统。然后再下载ultraiso软件,点击进入ultraiso下载页面
2、制作图解,打开运行ultraiso,并按下图设置进行操作。
三种UEFI启动U盘制作方法

通过上面的图中步骤,就可以用ultraiso制作UEFI启动U盘,说明一下,步骤的关键是系统的选择,土豆win7 64位内置了UEFI启动文件,所以可以直接制作,对于其它网站的系统小篇就不敢保证了。
三、RUFUS制作UEFI启动U盘
1、同样不小于4G的空U盘,下载本站win7 64位安装版系统(点击进入下载页面),也可以是win8 64位系统,或win10 32位,64位系统,都要原版系统,不能是GHOST版系统。然后再下载RUFUS软件,点击下载RUFUS软件
2、RUFUS制作UEFI启动U盘图解
三种UEFI启动U盘制作方法
RUFUS制作UEFI启动U盘制作方式最简单,但选择比较多,容易选错,同时,在选择的时候,要确定的硬盘的分区表格式,这是难点,大家在使用过种中可以按小篇上图的图解进行操作就可以了。
三种制作UEFI启动U盘启动的方法小篇就和大家介绍到这,希望对大家有用。

黑群晖安装和使用FFMPEG

黑群晖有很多地方没有办法使用,因为没有洗白,使用moments时,上传的视频没有缩略图,还有使用video station时没有办法转码,我想是不是可以通过其他的手段来解决这些呢?后来我在网上看到,可以使用ffmpeg来解决转码的问题,因为官方本来就自带ffmpeg,在官方提供的套件上找不到ffmpeg这个套件,只有通过第三方的套件中心来解决。

当然我也不知道通过自己安装ffmpeg是否能够解决转码或缩略图的问题,不过今天我打算试上一试,那么我先来安装ffmpeg这个套件,我先在自己的黑群晖添加第三方套件Synocommunity,这个比较简单就是添加一个网址。

Synocommunity

https://packages.synocommunity.com/

黑群晖安装和使用FFMPEG

选择任何发行者

黑群晖安装和使用FFMPEG

增加Synocommunity

设置完成之后选择左下角的社群后,在套件中心里找到ffmpeg安装即可,这里同时可以找到python3并且安装,作为中级电脑低手的我对于其作用并不明确,但是因为代码是拿python3写的,所以我装了。

让ffmpeg正常工作

由于需要用到ssh,在浏览器界面找到SSH并打开,windows用户下载putty,linux和osx可以直接用命令行连接服务器,我用的是osx所以无法在这里演示putty的使用方法,所以请自行百度一下;osx的用户打开终端之后输入ssh root@192.168.1.x(NAS的局域网ip地址)之后输入管理员密码即可。

登陆NAS之后,输入ffmpeg -version即可查看当前ffmpeg的版本号,如果和你在套件中心安装的ffmpeg版本号不同那么执行如下操作:

mv /usr/bin/ffmpeg /usr/bin/ffmpeg_bak

cp -r /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg

安装python3:

mv /usr/bin/python /usr/bin/python_bak

cp -r /usr/local/python3/bin/python3  /usr/bin/python

python –version

如果显示python 版本为3.5即表明完成

再次执行ffmpeg -version查看ffmpeg的版本号

黑群晖安装和使用FFMPEG

显示版本号为4.1,与套件中心显示的4.1-11一致

将脚本复制到NAS

脚本下载链接

建议创建一个新的共享文件夹作为测试,里面拷贝一些测试的视频。

通过网页登陆DSM将代码上传的共享文件夹根目录后,执行:

python /volume1/xxx/photo_thumb.py(这里的路径就是上传代码的文件路径)

黑群晖安装和使用FFMPEG

中文字似乎会乱码但是生成的缩略图正常

默认会生成mp4、avi、wmv、mkv、flv文件的缩略图,其他格式的如有需要,在代码types的中括号里添加文件格式并用英文逗号隔开,外面添加英文单引号即可。

ffmpeg默认不能生成rmvb和rm的缩略图,由于我这里测试发现VideoStation自己会生成rmvb的缩略图,所以并不提供解决办法。

最后在任务计划里添加把之前python运行的命令添加进去设置每天运行就可以了,如果添加了新的共享文件夹需要增加对应的命令,脚本会对文件夹进行遍历,所以有子文件夹时只需要在根目录运行脚本就可以。

黑群晖通过DDSM半洗白后,正常使用video staton转码功能

本人的群晖是在淘宝网购买的蜗牛星际主机来搭建的,使用群晖的DS918+ DSM 6.2-23739软件。目前使用了两个多月很正常的,但是我安装群晖的moments和video station后,发现有一些问题,就是无法正常转码,moments上传的小视频无法获得缩略图,后来通过第三方套件来安装ffmpeg来解决无法获得缩略图的问题,不过video station转码功能还是无法使用,经过百度搜索发现通过DDSM半洗白能够解决这个问题,经过我自己的操作以后,目前video station的转码功能可以正常使用了。

黑群晖通过DDSM半洗白的教程:

1、安装:先通过套件中心后安装好docker

黑群晖通过DDSM半洗白后,正常使用video staton转码功能

2、首次使用docker前需要在控制面板—网络—网络界面—管理—启用open vswitch

黑群晖通过DDSM半洗白后,正常使用video staton转码功能

3、完成设置之后进入docker套件界面选择DSM,创建DDSM容器,然后一直下一步

黑群晖通过DDSM半洗白后,正常使用video staton转码功能
4、至选择DDSM安装文件界面,点击“立即下载”,下载DDSM安装文件至本地,文件版本应该和群晖自身版本有关,下载文件名为DSM_DDSM_23739.pat

黑群晖通过DDSM半洗白后,正常使用video staton转码功能
5、然后浏览手动上传刚刚下载的DSM_DDSM_23739.pat,继续下一步直至DDSM容器创建成功后,在docker界面点击DSM开机按钮

黑群晖通过DDSM半洗白后,正常使用video staton转码功能

6、之后通过DDSM的IP地址(如果选取的是自动分配就去路由器里查看DDSM分配的IP地址)进入DDSM,查看“产品序列号”并记

黑群晖通过DDSM半洗白后,正常使用video staton转码功能

将黑群群引导盘内grub.cfg文件里的SN=XXXXXX替换为DDSM的产品序列号,之后重启黑群晖,至此替换DDSM序列号洗白成功。

也可以参阅本人的《群晖安装成功后,通过SSH修改黑群晖DS3617 DS918+的SN/MAC》文章通过ssh方法修改SN。

7、进入VIDEO STATION

黑群晖通过DDSM半洗白后,正常使用video staton转码功能

进入video station后,通过设置 公开共享,允许转码来启用转码功能。

bootcamp没有创建win7安装盘选项的解决方法

发布时间:2020-04-18 14:44发布者:系统城-lufang浏览数:141

MAC用户在安装系统时都喜欢使用boot Camp来进行安装。但近日却有用户却发现bootcamp没有创建win7安装盘选项的情况,那么我们要如何解决这一问题呢?可能很多不是很清楚,那么下面小编就来为大家分享关于bootcamp没有创建win7安装盘选项的解决方法。

推荐下载:win7旗舰版64位系统下载

解决方法如下:

1、当我们打开boot Camp助理时是没有“创建windows安装盘”的这一项的;

bootcamp没有创建win7安装盘选项的解决方法

2、我们打开Finder—实用工具—找到boot Camp助理(显示包内容)—Contents中找到Info.plist这个文件,把Info.plist复制到桌面或者其它地方来修改它;

bootcamp没有创建win7安装盘选项的解决方法

3、修改我用红色圈住的部份,这几个步骤是关键,请慢慢往下看;

4、打开关于本机—更多信息—系统报告后你就会看你的电脑的信息了,看到boot ROM版本这个就是你要改的信息了,把你自己看到的boot ROM版本信息复制到DARequiredROMVersions

5、下面的是改的部份

<string>MBA11.00BB.B03</string>

6、然后再修改一下USBBootSupportedModels

<array>的下面

<string>MBA11</string>

7、要说明的是这一步,在这里你这里修改的内容是把你看到的boot ROM版本的信息只保留小数点前的就行了;

8、最后把你修改好的这个Info.plist文件复制到原来的位置就OK了!

bootcamp没有创建win7安装盘选项的解决方法

上面给大家分享的就是关于bootcamp没有创建win7安装盘选项的解决方法啦,有出现同样情况的可以参考上面的方法来解决哦。

Boot Camp助理安装Win7显示No bootable device的解决方案

问题出现的经过

最近在给MacBook Air安装Windows系统时,出现了一个让我恶心无比的问题。我用MacBook Air的Boot Camp助理制作的Win7启动盘,具体方法不是文章的重点,请参照

在 Mac 上通过“启动转换助理”安装 Windows 10​support.apple.com图标在 Mac 上使用“启动转换”安装 Windows 7​support.apple.com图标Mac上安装双系统(传统BootCamp傻瓜式)图文教程​www.jianshu.com图标在分区结束后,系统重新启动,然后…DOS界面显示“No bootable device–insert boot disk and press any key”

开机黑屏出现No bootable device-insert boot disk and press any key

之后就是无尽的等待,故障依旧。又试着移除系统,再次安装,故障依旧。又试着重新制作系统启动盘,故障依旧……

分析

按照字面上的意思,错误应该是MacBook Air没有找到我的Win7启动盘的引导导致的。因为之前电脑已经安装过Win7系统,被我暴力格式化了Boot Camp分区,然后我的Mac OS X整体崩溃,通过远程恢复最终才将Mac OS X恢复,那问题可能是的电脑本身或者是制作的Win7安装盘两者的问题。

解决方案

请依据可能的问题选择性排障,无先后顺序,建议先排除U盘的问题,最终我的问题就出现在Win7安装盘,换了一个U盘重启后正常启动。

一、电脑本身的问题

*开机选择启动盘。苹果电脑是用EFI的,没有BIOS,唯一可以设置的是开机的启动选项。开机后按option+R,然后选择启动盘。

*在Mac上重置NVRAM或PRAM。Mac 会将某些设置储存在特殊内存区域中,而且即使关机这些设置也不会丢失(之前安装过Windows会有这种情况)。 在基于 Intel 的 Mac 上,存储位置是称为 NVRAM 的内存;而在基于 PowerPC 的 Mac 上,存储位置则是称为 PRAM 的内存。

Reset NVRAM or PRAM on your Mac​support.apple.com图标具体做法:重新启动苹果电脑,启动时以最快速度同时按住Option、Command、P、R这四个键,不要放手,听到“噹——”一声的开机声时仍不要放手,让机器自动启动三次,也就是“噹——”三次,第三次启动开放手,就可以了。

貌似这个方法还对音响播放网页视频和音乐有电流声的问题有奇效,未验证 。

*重置系统管理控制器SMC(拆机)

具体做法:将MacBook Air后盖打开,将电池连接线拔下,15秒后重新将电池连接,安装操作。

二、制作Win7安装盘的问题(几乎大部分出现问题的机器都是这个原因,因为提示的是没有引导文件导致无法正常引导)

*请查询您的Mac电脑是否支持使用U盘安装,部分机型不支持使用U盘安装。

Boot Camp 驱动​www.applex.net图标*请确保您的U盘不是USB3.0,Win7无法使用USB3.0进行引导

*出现问题后换一个U盘,依照如下步骤对U盘进行操作:

1、在Windows电脑上对U盘进行格式化,格式选择“FAT32(默认)

2、重新进入 Mac 系统,打开 BootCamp 应用,先删除之前已经创建好了的 Windows 分区。

3、把用于安装 Windows 系统的安装 U 盘插入到电脑中,打开Boot Camp助理,分区,用下载好的Windows系统镜像制作系统安装盘,自动重新启动。注意,此时请不要插入其它移动硬盘或U盘,只保留安装U盘。

4、最后重新启动以后,即可成功从 U 盘启动,进入 Windows 的安装界面了。

iptables详解

       netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

 

iptables基础

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规 则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的 主要工作就是添加、修改和删除这些规则。

 

iptables和netfilter的关系:

这是第一个要说的地方,Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。

 

iptables传输数据包的过程

① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

iptables的规则表和链:

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

     链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

Iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5成了四张表五个链了,不过多出来的那个表用的也不太多,所以基本还是和以前一样。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。

规则表:

1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包  内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw
(这个是REHL4没有的,不过不用怕,用的不多)

 

规则链:


1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

规则表之间的优先顺序:

Raw——mangle——nat——filter
规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向

从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向

来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

管理和设置iptables规则

 

iptables的基本语法格式

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

 

iptables命令的管理控制选项

复制代码

-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)

复制代码

防火墙处理数据包的四种方式

ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

 

iptables防火墙规则的保存与恢复

iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载

使用命令iptables-save来保存规则。一般用

iptables-save > /etc/sysconfig/iptables

生成保存规则的文件 /etc/sysconfig/iptables,

也可以用

service iptables save

它能把规则自动保存在/etc/sysconfig/iptables中。

当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

 

删除INPUT链的第一条规则

iptables -D INPUT 1

iptables防火墙常用的策略

1.拒绝进入防火墙的所有ICMP协议数据包

iptables -I INPUT -p icmp -j REJECT

 

2.允许防火墙转发除ICMP协议以外的所有数据包

iptables -A FORWARD -p ! icmp -j ACCEPT

说明:使用“!”可以将条件取反。

 

3.拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据

iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT

说明:注意要把拒绝的放在前面不然就不起作用了啊。

 

4.丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包

iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

 

5.封堵网段(192.168.1.0/24),两小时后解封。

# iptables -I INPUT -s 10.20.30.0/24 -j DROP
# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
# at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1

说明:这个策略咱们借助crond计划任务来完成,就再好不过了。
[1]   Stopped     at now 2 hours

 

6.只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。

iptables -A INPUT -p tcp –dport 22 -s 202.13.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j DROP

说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的SQL服务器需要被总公司的管理员管理时。

 

7.允许本机开放从TCP端口20-1024提供的应用服务。

iptables -A INPUT -p tcp –dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 20:1024 -j ACCEPT

 

8.允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。

iptables -A FORWARD -s 192.168.0.0/24 -p udp –dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp –sport 53 -j ACCEPT

 

9.禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机

iptables -I INPUT -p icmp –icmp-type Echo-Request -j DROP
iptables -I INPUT -p icmp –icmp-type Echo-Reply -j ACCEPT
iptables -I INPUT -p icmp –icmp-type destination-Unreachable -j ACCEPT

 

10.禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包

iptables -A FORWARD -m mac –mac-source 00:0c:29:27:55:3F -j DROP

说明:iptables中使用“-m 模块关键字”的形式调用显示匹配。咱们这里用“-m mac –mac-source”来表示数据包的源MAC地址。

 

11.允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280

iptables -A INPUT -p tcp -m multiport –dport 20,21,25,110,1250:1280 -j ACCEPT

说明:这里用“-m multiport –dport”来指定目的端口及范围

 

12.禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包。

iptables -A FORWARD -p tcp -m iprange –src-range 192.168.1.20-192.168.1.99 -j DROP

说明:此处用“-m –iprange –src-range”指定IP范围。

 

13.禁止转发与正常TCP连接无关的非—syn请求数据包。

iptables -A FORWARD -m state –state NEW -p tcp ! –syn -j DROP

说明:“-m state”表示数据包的连接状态,“NEW”表示与任何连接无关的,新的嘛!

 

14.拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包

iptables -A INPUT -p tcp -m state –state NEW -j DROP
iptables -A INPUT -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT

说明:“ESTABLISHED”表示已经响应请求或者已经建立连接的数据包,“RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等。

 

15.只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理。

复制代码

iptables -I INPUT -p tcp -m multiport –dport 20,21,80 -j ACCEPT
iptables -I INPUT -p tcp –dport 20450:20480 -j ACCEPT
iptables -I INPUT -p tcp -m state –state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP

文章参考  http://netfilter.org/ iptables官方网站
http://www.linux.gov.cn/netweb/iptables.htm iptables配置手册
http://man.chinaunix.net/
http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html iptables配置手册
http://blog.csdn.net/thmono/archive/2010/04/08/5462043.aspx
http://netsecurity.51cto.com/art/200512/14457.htm
http://blog.sina.com.cn/s/blog_40ba724c0100jz12.html
http://qiliuping.blog.163.com/blog/static/1023829320105245337799/

复制代码

 

iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工 作原理,你会发现其实它很简单。

首先介绍iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。   iptables基础知识详解
图: IPTables Table, Chain, and Rule Structure
一、iptables的表与链
iptables具有Filter, NAT, Mangle, Raw四种内建表:
1. Filter表
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
  • INPUT链 – 处理来自外部的数据。
  • OUTPUT链 – 处理向外发送的数据。
  • FORWARD链 – 将数据转发到本机的其他网卡设备上。
2. NAT表
NAT表有三种内建链:
  • PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
  • POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
  • OUTPUT链 – 处理本机产生的数据包。
3. Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
  • PREROUTING
  • OUTPUT
  • FORWARD
  • INPUT
  • POSTROUTING
4. Raw表
Raw表用于处理异常,它具有2个内建链:
  • PREROUTING chain
  • OUTPUT chain
5.小结
下图展示了iptables的三个内建表:
iptables基础知识详解
图: IPTables 内建表
二、IPTABLES 规则(Rules)
牢记以下三点式理解iptables规则的关键:
  • Rules包括一个条件和一个目标(target)
  • 如果满足条件,就执行目标(target)中的规则或者特定值。
  • 如果不满足条件,就判断下一条Rules。
目标值(Target Values)
下面是你可以在target里指定的特殊值:
  • ACCEPT – 允许防火墙接收数据包
  • DROP – 防火墙丢弃包
  • QUEUE – 防火墙将数据包移交到用户空间
  • RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
如果你执行iptables –list你将看到防火墙上的可用规则。下例说明当前系统没有定义防火墙,你可以看到,它显示了默认的filter表,以及表内默认的input链, forward链, output链。
# iptables -t filter –list
Chain INPUT (policy ACCEPT)
target    prot opt source              destinationChain FORWARD (policy ACCEPT)
target    prot opt source              destinationChain OUTPUT (policy ACCEPT)
target    prot opt source              destination

查看mangle表:
# iptables -t mangle –list
查看NAT表:
# iptables -t nat –list
查看RAW表:
# iptables -t raw –list
!注意:如果不指定   -t选项,就只会显示默认的   filter表。因此,以下两种命令形式是一个意思:
# iptables -t filter –list
(or)
# iptables –list
以下例子表明在filter表的input链, forward链, output链中存在规则:
# iptables –list
Chain INPUT (policy ACCEPT)
num        target                 prot    opt        source            destination
1    RH-Firewall-1-INPUT     all       —         0.0.0.0/0         0.0.0.0/0Chain FORWARD (policy ACCEPT)
num        target                 prot    opt        source            destination
1      RH-Firewall-1-INPUT   all        –      0.0.0.0/0           0.0.0.0/0Chain OUTPUT (policy ACCEPT)
num  target    prot opt source              destination

Chain RH-Firewall-1-INPUT (2 references)
num  target    prot opt source              destination
1    ACCEPT    all  –  0.0.0.0/0            0.0.0.0/0
2    ACCEPT    icmp –  0.0.0.0/0            0.0.0.0/0          icmp type 255
3    ACCEPT    esp  –  0.0.0.0/0            0.0.0.0/0
4    ACCEPT    ah  –  0.0.0.0/0            0.0.0.0/0
5    ACCEPT    udp  –  0.0.0.0/0            224.0.0.251        udp dpt:5353
6    ACCEPT    udp  –  0.0.0.0/0            0.0.0.0/0          udp dpt:631
7    ACCEPT    tcp  –  0.0.0.0/0            0.0.0.0/0          tcp dpt:631
8    ACCEPT    all  –  0.0.0.0/0            0.0.0.0/0          state RELATED,ESTABLISHED
9    ACCEPT    tcp  –  0.0.0.0/0            0.0.0.0/0          state NEW tcp dpt:22
10  REJECT    all  –  0.0.0.0/0            0.0.0.0/0          reject-with icmp-host-prohibited

以上输出包含下列字段:
  • num – 指定链中的规则编号
    target – 前面提到的target的特殊值
    prot – 协议:tcp, udp, icmp等
    source – 数据包的源IP地址
    destination – 数据包的目标IP地址
三、清空所有iptables规则
在配置iptables之前,你通常需要用iptables –list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则:
iptables –flush
或者
iptables -F
这两条命令是等效的。但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:
iptables -t NAT -F
四、永久生效
当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。为了让配置永久生效,根据平台的不同,具体操作也不同。下面进行简单介绍:
1.Ubuntu
首先,保存现有的规则:
iptables-save > /etc/iptables.rules
然后新建一个bash脚本,并保存到   /etc/network/if-pre-up.d/目录下:
#!/bin/bash
iptables-restore < /etc/iptables.rules
这样,每次系统重启后iptables规则都会被自动加载。
!注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。
2.CentOS, RedHat
# 保存iptables规则
service iptables save# 重启iptables服务
service iptables stop
service iptables start
查看当前规则:
cat  /etc/sysconfig/iptables
五、追加iptables规则
可以使用iptables -A命令追加新规则,其中   -A表示   Append。因此,   新的规则将追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用   -A参数添加新规则,那么就是无用功。
1.语法
iptables -A chain firewall-rule
  • -A chain – 指定要追加规则的链
  • firewall-rule – 具体的规则参数
2.描述规则的基本参数
以下这些规则参数用于描述数据包的协议、源地址、目的地址、允许经过的网络接口,以及如何处理这些数据包。这些描述是对规则的基本描述。
-p 协议(protocol)
  • 指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议。
  • 如果不指定-p参数,则默认是all值。这并不明智,请总是明确指定协议名称。
  • 可以使用协议名(如tcp),或者是协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols
  • 还可以使用–protocol参数代替-p参数
-s 源地址(source)
  • 指定数据包的源地址
  • 参数可以使IP地址、网络地址、主机名
  • 例如:-s 192.168.1.101指定IP地址
  • 例如:-s 192.168.1.10/24指定网络地址
  • 如果不指定-s参数,就代表所有地址
  • 还可以使用–src或者–source
-d 目的地址(destination)
  • 指定目的地址
  • 参数和-s相同
  • 还可以使用–dst或者–destination
-j 执行目标(jump to target)
  • -j代表”jump to target”
  • -j指定了当与规则(Rule)匹配时如何处理数据包
  • 可能的值是ACCEPT, DROP, QUEUE, RETURN,MASQUERADE
  • 还可以指定其他链(Chain)作为目标
  • 注:MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat(详情见上一篇文章)。
-i 输入接口(input interface)
  • -i代表输入接口(input interface)
  • -i指定了要处理来自哪个接口的数据包
  • 这些数据包即将进入INPUT, FORWARD, PREROUTE链
  • 例如:-i eth0指定了要处理经由eth0进入的数据包
  • 如果不指定-i参数,那么将处理进入所有接口的数据包
  • 如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包
  • 如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包
  • 还可以使用–in-interface参数
-o 输出(out interface)
  • -o代表”output interface”
  • -o指定了数据包由哪个接口输出
  • 这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链
  • 如果不指定-o选项,那么系统上的所有接口都可以作为输出接口
  • 如果出现! -o eth0,那么将从eth0以外的接口输出
  • 如果出现-i eth+,那么将仅从eth开头的接口输出
  • 还可以使用–out-interface参数
3.描述规则的扩展参数
对规则有了一个基本描述之后,有时候我们还希望指定端口、TCP标志、ICMP类型等内容。
–sport 源端口(source port)针对 -p tcp 或者 -p udp
  • 缺省情况下,将匹配所有端口
  • 可以指定端口号或者端口名称,例如”–sport 22″与”–sport ssh”。
  • /etc/services文件描述了上述映射关系。
  • 从性能上讲,使用端口号更好
  • 使用冒号可以匹配端口范围,如”–sport 22:100″
  • 还可以使用”–source-port”
–-dport 目的端口(destination port)针对-p tcp 或者 -p udp
  • 参数和–sport类似
  • 还可以使用”–destination-port”
-–tcp-flags TCP标志 针对-p tcp
  • 可以指定由逗号分隔的多个参数
  • 有效值可以是:SYN, ACK, FIN, RST, URG, PSH
  • 可以使用ALL或者NONE
-–icmp-type ICMP类型 针对-p icmp
  • –icmp-type 0 表示Echo Reply
  • –icmp-type 8 表示Echo
4.追加规则的完整实例:仅允许SSH服务
本例实现的规则将仅允许SSH数据包通过本地计算机,其他一切连接(包括ping)都将被拒绝。
# 1.清空所有iptables规则
iptables -F# 2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT# 3.拒绝所有其他数据包
iptables -A INPUT -j DROP

六、更改默认策略
上例的例子仅对接收的数据包过滤,而对于要发送出去的数据包却没有任何限制。本节主要介绍如何更改链策略,以改变链的行为。
1. 默认链策略
/!\警告:请勿在远程连接的服务器、虚拟机上测试!
当我们使用-L选项验证当前规则是发现,所有的链旁边都有   policy ACCEPT标注,这表明当前链的默认策略为ACCEPT:
# iptables -L
Chain INPUT (policy ACCEPT)
target    prot opt source              destination
ACCEPT    tcp  –  anywhere            anywhere            tcp dpt:ssh
DROP      all  –  anywhere            anywhereChain FORWARD (policy ACCEPT)
target    prot opt source              destinationChain OUTPUT (policy ACCEPT)
target    prot opt source              destination

这种情况下,如果没有明确添加DROP规则,那么默认情况下将采用ACCEPT策略进行过滤。除非:
a)为以上三个链单独添加DROP规则:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
b)更改默认策略:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
糟糕!!如果你严格按照上一节的例子配置了iptables,并且现在使用的是SSH进行连接的,那么会话恐怕已经被迫终止了!
为什么呢?因为我们已经把OUTPUT链策略更改为DROP了。此时虽然服务器能接收数据,但是无法发送数据:
# iptables -L
Chain INPUT    (policy DROP)
target    prot opt source              destination
ACCEPT    tcp  –  anywhere            anywhere            tcp dpt:ssh
DROP      all  –  anywhere            anywhereChain FORWARD (policy DROP)
target    prot opt source              destinationChain OUTPUT (policy DROP)
target    prot opt source              destination

七、配置应用程序规则
尽管5.4节已经介绍了如何初步限制除SSH以外的其他连接,但是那是在链默认策略为ACCEPT的情况下实现的,并且没有对输出数据包进行限 制。本节在上一节基础上,以SSH和HTTP所使用的端口为例,教大家如何在默认链策略为DROP的情况下,进行防火墙设置。在这里,我们将引进一种新的 参数-m state,并检查数据包的状态字段。
1.SSH
# 1.允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT# 2.允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
  • -m state: 启用状态匹配模块(state matching module)
  • –-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
  • –sport 22: sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务器而言,源端口就是22
  • –dport 22: ssh客户端程序可以从本机的随机端口与SSH服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22
如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:
# 1.送出的数据包目的端口为22
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT# 2.接收的数据包源端口为22
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
2.HTTP
HTTP的配置与SSH类似:
# 1.允许接收远程主机的HTTP请求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT# 1.允许发送本地主机的HTTP响应
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
3.完整的配置
# 1.删除现有规则
iptables -F# 2.配置默认链策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP# 3.允许远程主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT

# 4.允许本地主机进行SSH连接
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT

# 5.允许HTTP请求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT

文章3

1. netfilter与iptables

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)
  • 数据包内容修改
  • 以及数据包过滤的防火墙功能

Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。

1.1 filter、nat、mangle等规则表

filter表

主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:

  • INPUT链:INPUT针对那些目的地是本地的包
  • FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
  • OUTPUT链:OUTPUT是用来过滤所有本地生成的包

nat表

主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链:

  • PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址
  • OUTPUT链:改变本地产生的包的目的地址
  • POSTROUTING链:在包就要离开防火墙之前改变其源地址

mangle表

主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

raw表

是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING

iptables中数据包和4种被跟踪连接的4种不同状态:

  • NEW:该包想要开始一个连接(重新连接或将连接重定向)
  • RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的。
  • ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
  • INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。

1.2 INPUT、FORWARD等规则链和规则

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:

  • INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
  • OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  • FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
  • PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
  • POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。

防火墙处理数据包的方式(规则):

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
  • SNAT:源地址转换。在进入路由层面的route之前,重新改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。
    MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
  • DNAT:目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。
    REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

2. Linux数据包路由原理

我们已经知道了Netfilter和Iptables的架构和作用,并且学习了控制Netfilter行为的Xtables表的结构,那么这个Xtables表是怎么在内核协议栈的数据包路由中起作用的呢?

网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。是时候看这张图了:

从上图中,我们可以总结出以下规律:

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的”路由模块”根据”数据包目的IP”以及”内核中的路由表”判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
  • 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它
  • 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
  • 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)

我们在写Iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵活配置规则。

3. iptables编写规则

命令格式:

  • [-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
  • -A:新增一条规则,到该规则链列表的最后一行
  • -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
  • -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
  • -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
  • -P:设置某条规则链的默认动作
  • -nL-L-n,查看当前运行的防火墙规则列表
  • chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
  • [规则编号]:插入、删除、替换规则时用,--line-numbers显示号码
  • [-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
  • [-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等
  • [-s 源IP地址]:源主机的IP地址或子网地址
  • [--sport 源端口号]:数据包的IP的源端口号
  • [-d目标IP地址]:目标主机的IP地址或子网地址
  • [--dport目标端口号]:数据包的IP的目标端口号
  • -m:extend matches,这个选项用于提供更多的匹配参数,如:
    • -m state –state ESTABLISHED,RELATED
    • -m tcp –dport 22
    • -m multiport –dports 80,8080
    • -m icmp –icmp-type 8
  • <-j 动作>:处理数据包的动作,包括ACCEPT、DROP、REJECT等
要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过我们的计算机。

首先我们要弄明白,防火墙将怎么对待 这些数据包。这些数据包会经过一些相应的规则链,比如要进入你的计算机的数据包会首先进入INPUT链,从我们的计算机发出的数据包会经过 OUTPUT链,如果一台计算机做一个网络的网关(处于内网和外网两个网络连接的两台计算机,这两台计算机之间相互通讯的数据包会经过这台计算机,这台计 算机即相当于一个路由器),可能 会有很多数据经过这台计算机,那么这些数据包必经FORWARD链,FORWARD链即数据转发链。明白了这些“链”的概念我们才能进一步学习使用 iptables。

现在我们再来分析一下iptables规则是如何工作的,假如我们要访问网站www.yahoo.com,我们要对www.yahoo.com发出请 求,这些数据包要经过OUTPUT链,在请求发出前,Linux的内核会在OUTPUT链中检查有没有相应的规则适合这个数据包,如果没有相应的规 则,OUTPUT链还会有默认的规则,或者允许,或者不允许(事实上,不允许有两种,一种是把请求拒绝,告诉发出请示的程序被拒绝;还有一种是丢弃,让请 求发出者傻等,直到超时)。如果得到允许,请求就发出了,而www.yahoo.com服务器返回的数据包会经过INPUT链,当然,INPUT链中也会 有相应的规则等着它。

下面我们介绍几个iptable的命令
iptables -L [-t filter]
这条命令是显示当前有什么已经设置好的防火墙规则,可能的显示结果如下:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

从这里我们可以看出,iptables 有三个链分别是 INPUT OUTPUT 和FORWARD.
其中
INPUT 是外部数据要进过我们主机的第一外关卡(当然你前面也可以再加硬件防火墙).
OUTPUT 是你的主机的数据送出时要做的过绿卡
FORWARD   是转发 你在NAT时才会用到
要设置iptables 主要是对这三条链进行设置,当然也包括-nat的另外三个链 我们以后再说
你要用iptables 你就得启到它 启动命令 service iptables restart
iptables的默认设置为 三条链都是ACCEPT 如下:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
以上信息你可以用 iptables -L看到
总体来说iptables可以有二种设置
1.默认允许,拒绝特别的
2.默认拒绝,允许特别的
二者都有自己有特点,从安全角度看 个人偏向于第二种,就是默认拒绝,允许特别的.但iptalbes 默认是第一种 默认允许,拒绝特别的
你可以用命令改变默认值来达到我们的要求 命令如下
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
你再用iptables -L查看一下就会觉得默认值以改了
先来谈炎几个参数XZFL
-F 清除规则
-X 清除链
-Z 将链的记数的流量清零
一般来说 再创建访问规则时 都会将原有的规则清零 这是一个比较好的习惯,因为某些规则的存在会影响你建的规则.
基本语法:
iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] [-io interface]
[-p tcp,udp.icmp,all] [-s ip/nerwork] [–sport ports]
[-d ip/netword] [–dport ports] [-j ACCEPT DROP]
以上是iptables的基本语法
A 是添加的意思
I 是播入的意思
io 指的是数据要进入或出去所要经过的端口 如eth1 eth0 pppoe等
p 你所要指定的协议
-s 指源地址 可是单个IP如192.168.2.6 也可以是一个网络 192.168.2.0/24 还可以 是一个域名 如163.com 如果你填写的域名系统会自动解析出他的IP并在iptables里 显示
–sport 来源端口
-d 同-s相似 只不过他指的是目标地址 也可以是IP 域名 和网络
–dport 目标端口
-j 执行参数 ACCEPT DROP
注意:如果以有参数存在 则说明全部接受
1 如我要来自己l0接口的数据全部接受,我们可以写成这样:
iptables -A INPUT -i lo -j ACCEPT
2 如果我们想接受192.168.2.6这个IP地址传来的数据我们可以这样写
iptablse -A INPUT -i eth1 -p tcp -s 192.168.2.6 -j ACCEPT
3 如果我们要拒绝来自己192.168.2.0/24这个网的telnet连接
iptablse -A INPUT -i eth1 -p udp -s 192.168.2.0/24
–sport 23 -j DROP

分类: LINUX

iptables 指令
语法:
iptables [-t table] command [match] [-j target/jump]
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。个规则表的功能如下:

nat 此规则表拥有 Prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行 来源网址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将 会造成无法对同一包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。

mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三个规则链。
除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。

filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链,这个规则表顾名思义是用来进行封包过滤的理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。

常用命令列表
命令 -A, –append
范例 iptables -A INPUT …
说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。
命令 -D, –delete
范例 iptables -D INPUT –dport 80 -j DROP
使用iptables -L -n  –line-number  可以查看到每个规则chain  的序列号,只能这样才能删除指定的规则。
iptables -D INPUT 1
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
命令 -R, –replace
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行规则,规则被取代后并不会改变顺序。
命令 -I, –insert
范例 iptables -I INPUT 1 –dport 80 -j ACCEPT
iptables -I INPUT 1 -p tcp –sport 80 -j ACCEPT
说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
命令 -L, –list
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。
命令 -F, –flush
范例 iptables -F INPUT
说明 删除某规则链中的所有规则。
命令 -Z, –zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
命令 -N, –new-chain
范例 iptables -N allowed
说明 定义新的规则链。
命令 -X, –delete-chain
范例 iptables -X allowed
说明 删除某个规则链。
命令 -P, –policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
命令 -E, –rename-chain
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称。
常用封包比对参数:
参数 -p, –protocol
范例 iptables -A INPUT -p tcp
说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp …等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
参数 -s, –src, –source
范例 iptables -A INPUT -s 192.168.1.1
说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。
参数 -d, –dst, –destination
范例 iptables -A INPUT -d 192.168.1.1
说明 用来比对封包的目的地 IP,设定方式同上。
参数 -i, –in-interface
范例 iptables -A INPUT -i eth0
说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对,例如:-i ! eth0。
参数 -o, –out-interface
范例 iptables -A FORWARD -o eth0
说明 用来比对封包要从哪片网卡送出,设定方式同上。
参数 –sport, –source-port
范例 iptables -A INPUT -p tcp –sport 22
说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:–sport 22:80,表示从 22 到 80 埠之间都算是符合件,如果要比对不连续的多个埠,则必须使用 –multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
参数 –dport, –destination-port
范例 iptables -A INPUT -p tcp –dport 22
说明 用来比对封包的目的地埠号,设定方式同上。
参数 –tcp-flags
范例 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN
说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)
PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子行反向比对。
参数 –syn
范例 iptables -p tcp –syn
说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。
参数 -m multiport –source-port
范例 iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110
说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。
参数 -m multiport –destination-port
范例 iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110
说明 用来比对不连续的多个目的地埠号,设定方式同上。
参数 -m multiport –port
范例 iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80 目的地埠号为 110,这种封包并不算符合条件。
参数 –icmp-type
范例 iptables -A INPUT -p icmp –icmp-type 8
说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp –help 来查看有哪些代码可用。
参数 -m limit –limit
范例 iptables -A INPUT -m limit –limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封
数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。
参数 –limit-burst
范例 iptables -A INPUT -m limit –limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。
参数 -m mac –mac-source
范例 iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。
参数 –mark
范例 iptables -t mangle -A INPUT -m mark –mark 1
说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。
参数 -m owner –uid-owner
范例 iptables -A OUTPUT -m owner –uid-owner 500
说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。
参数 -m owner –gid-owner
范例 iptables -A OUTPUT -m owner –gid-owner 0
说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数 -m owner –pid-owner
范例 iptables -A OUTPUT -m owner –pid-owner 78
说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
参数 -m owner –sid-owner
范例 iptables -A OUTPUT -m owner –sid-owner 100
说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。
参数 -m state –state
范例 iptables -A INPUT -m state –state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。

INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

常用的处理动作:
-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、

SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(natostrouting)。
REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是
tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
iptables -A FORWARD -p TCP –dport 22 -j REJECT –reject-with tcp-reset
DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式
porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE –to-ports 1024-31000
LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。例如:
iptables -A INPUT -p tcp -j LOG –log-prefix “INPUT packets”
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT –to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination
192.168.1.1-192.168.1.10:80-100
MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费…….等。
RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp –dport 22 -j MARK –set-mark 2

分类: LINUX

网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能有所帮助。
网管员的安全意识要比空喊Linux安全重要得多。

iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
首先,把三个表清空,把自建的规则清空。

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
先把“回环”打开,以免有不必要的麻烦。

iptables -A INPUT -i eth+ -p icmp –icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp –icmp-type 0 -j ACCEPT
在所有网卡上打开ping功能,便于维护和检测。

iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp –sport 22 -j ACCEPT
打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入)

iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp –sport 3128 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.168.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.168.0/24 -p tcp –sport 3128 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -p tcp –dport 32768:61000 -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp –sport 32768:61000 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p udp –dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp –sport 53 -j ACCEPT
上面这几句是比较头痛的,我做逐一解释。

iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
允许192.168.100.0/24网段的机器发送数据包从eth0网卡进入。如果数据包是tcp协议,而且目的端口是3128(因为REDIRECT已经把80改为3128了。nat表的PREROUTING是在filter表的INPUT前面的。)的,再而且,数据包的状态必须是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,换句话说就是,允许客户端机器向服务器发出链接申请。ESTABLISHED表示通过握手已经建立起链接),通过。

iptables -A OUTPUT -o eth2 -p tcp –sport 32768:61000 -m state –state NEW,ESTABLISHED -j ACCEPT
我们先来看这一句。现在你的数据包已经进入到linux服务器防火墙上来了。squid需要代替你去访问,所以这时,服务器就成了客户端的角色,所以它要使用32768到61000的私有端口进行访问。(大家会奇怪应该是1024到65535吧。其实CentOS版的linux所定义的私有端口是32768到61000的,你可以通过cat /proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次声明:这里是squid以客户端的身份去访问其他的服务器,所以这里的源端口是32768:61000,而不是3128!

iptables -A INPUT -i eth2 -p tcp –dport 32768:61000 -m state –state ESTABLISHED -j ACCEPT
当然了,数据有去就有回。

iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp –sport 3128 -m state –state ESTABLISHED -j ACCEPT
数据包还得通过服务器,转到内网网卡上。请注意,这里,是squid帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而squid是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是3128,而不是32768:61000。

iptables -A OUTPUT -o eth2 -p udp –dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp –sport 53 -j ACCEPT
当然,DNS是不可缺少的。

iptables -A INPUT -i eth+ -p tcp –dport 80 -j LOG –log-prefix “iptables_80_alert” –log-level info
iptables -A INPUT -i eth+ -p tcp –dport 21 -j LOG –log-prefix “iptables_21_alert” –log-level info
iptables -A INPUT -i eth+ -p tcp –dport 22 -j LOG –log-prefix “iptables_22_alert” –log-level info
iptables -A INPUT -i eth+ -p tcp –dport 25 -j LOG –log-prefix “iptables_25_alert” –log-level info
iptables -A INPUT -i eth+ -p icmp –icmp-type 8 -j LOG –log-prefix “iptables_icmp8_alert” –log-level info
当然了,来点日志记录会对网管员有所帮助。

iptables 基本命令使用举例

一、链的基本操作
1、清除所有的规则。
1)清除预设表filter中所有规则链中的规则。
# iptables -F
2)清除预设表filter中使用者自定链中的规则。
#iptables -X
#iptables -Z
2、设置链的默认策略。一般有两种方法。
1)首先允许所有的包,然后再禁止有危险的包通过放火墙。
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT
2)首先禁止所有的包,然后根据需要的服务允许特定的包通过防火墙。
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
3、列出表/链中的所有规则。默认只列出filter表。
#iptables -L
4、向链中添加规则。下面的语句用于开放网络接口:
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -i eth0 -j ACEPT
#iptables -A OUTPUT -o eth1 -j ACCEPT
#iptables -A FORWARD -i eth1 -j ACCEPT
#iptables -A FORWARD -0 eth1 -j ACCEPT
注意:由于本地进程不会经过FORWARD链,因此回环接口lo只在INPUT和OUTPUT两个链上作用。
5、使用者自定义链。
#iptables -N custom
#iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP
#iptables -A INPUT -s 0/0 -d 0/0 -j DROP
二、设置基本的规则匹配
1、指定协议匹配。
1)匹配指定协议。
#iptables -A INPUT -p tcp
2)匹配指定协议之外的所有协议。
#iptables -A INPUT -p !tcp
2、指定地址匹配。
1)指定匹配的主机。
#iptables -A INPUT -s 192.168.0.18
2)指定匹配的网络。
#iptables -A INPUT -s 192.168.2.0/24
3)匹配指定主机之外的地址。
#iptables -A FORWARD -s !192.168.0.19
4)匹配指定网络之外的网络。
#iptables -A FORWARD -s ! 192.168.3.0/24
3、指定网络接口匹配。
1)指定单一的网络接口匹配。
#iptables -A INPUT -i eth0
#iptables -A FORWARD -o eth0
2)指定同类型的网络接口匹配。
#iptables -A FORWARD -o ppp+
4、指定端口匹配。
1)指定单一端口匹配。
#iptables -A INPUT -p tcp –sport www
#iptables -A INPUT -p udp –dport 53
2)匹配指定端口之外的端口。
#iptables -A INPUT -p tcp –dport !22
3)匹配端口范围。
#iptables -A INPUT -p tcp –sport 22:80
4)匹配ICMP端口和ICMP类型。
#iptables -A INOUT -p icmp –icimp-type 8
5)指定ip碎片。

个网络接口都有一个MTU(最大传输单元),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数据包
(称为ip碎片)来传输,而接受方则对这些ip碎片再进行重组以还原整个包。这样会导致一个问题:当系统将大数据包划分成ip碎片传输时,第一个碎片含有
完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。因此,检查后面的ip碎片的头部(象有
TCP、UDP和ICMP一样)是不可能的。假如有这样的一条规则:
#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT
并且这时的FORWARD的policy为DROP时,系统只会让第一个ip碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通过—fragment/-f 选项来指定第二个及以后的ip碎片解决上述问题。
#iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
注意现在有许多进行ip碎片攻击的实例,如DoS攻击,因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。
三、设置扩展的规则匹配(举例已忽略目标动作)
1、多端口匹配。
1)匹配多个源端口。
#iptables -A INPUT -p tcp -m multiport –sport 22,53,80,110
2)匹配多个目的端口。
#iptables -A INPUT -p tcp -m multiport –dpoort 22,53,80
3)匹配多端口(无论是源端口还是目的端口)
#iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
2、指定TCP匹配扩展
使用 –tcp-flags 选项可以根据tcp包的标志位进行过滤。
#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN
#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK
上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。
#iptables -A FORWARD -p tcp –syn
选项—syn相当于”–tcp-flags SYN,RST,ACK SYN”的简写。
3、limit速率匹配扩展。
1)指定单位时间内允许通过的数据包个数,单位时间可以是/second、/minute、/hour、/day或使用第一个子母。
#iptables -A INPUT -m limit –limit 300/hour
2 )指定触发事件的阀值。
#iptables -A INPUT -m limit –limit-burst 10
用来比对一次同时涌入的封包是否超过10个,超过此上限的包将直接丢弃。
3)同时指定速率限制和触发阀值。
#iptables -A INPUT -p icmp -m limit –-limit 3/m –limit-burst 3
表示每分钟允许的最大包数量为限制速率(本例为3)加上当前的触发阀值burst数。任何情况下,都可保证3个数据包通过,触发阀值burst相当于允许额外的包数量。
4)基于状态的匹配扩展(连接跟踪)
每个网络连接包括以下信息:源地址、目标地址、源端口、目的端口,称为套接字对(socket pairs);协议类型、连接状态(TCP协议)
和超时时间等。防火墙把这些信息称为状态(stateful)。状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单包过滤防火墙具有更大的安全性,命令格式如下:
iptables -m state –-state [!]state [,state,state,state]
其中,state表是一个逗号分割的列表,用来指定连接状态,4种:
>NEW: 该包想要开始一个新的连接(重新连接或连接重定向)
>RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:
FTP的数据传输连接和控制连接之间就是RELATED关系。
>ESTABLISHED:该包属于某个已经建立的连接。
>INVALID:该包不匹配于任何连接,通常这些包被DROP。
例如:
(1)在INPUT链添加一条规则,匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包。
#iptables -A INPUT -m state –state RELATED,ESTABLISHED
(2)在INPUT链链添加一条规则,匹配所有从非eth0接口来的连接请求包。
#iptables -A INPUT -m state -–state NEW -i !eth0
又如,对于ftp连接可以使用下面的连接跟踪:
(1)被动(Passive)ftp连接模式。
#iptables -A INPUT -p tcp –sport 1024: –dport 1024: -m state –-state ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -p tcp –sport 1024: –dport 1024: -m
state -–state ESTABLISHED,RELATED -j ACCEPT
(2)主动(Active)ftp连接模式
#iptables -A INNPUT -p tcp –sport 20 -m state –-state ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -p tcp –OUTPUT -p tcp –dport 20 -m state –state ESTABLISHED -j ACCEPT

分类: LINUX

1.概述

1.1 什么是NAT

在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改, 更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。

1.2 为什么要进行NAT

我们来看看再什么情况下我们需要做NAT。

假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW 服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过NAT技术使发给其中某 一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。

再比如使用拨号上网的网吧,因为只有一个合法的IP地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其 是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用NAT来解决这个 问题,

因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。

还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。

1.3 NAT的类型

在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。

2.原理

下图是linux2.4的原理图:

   在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux 核心中一个通用架构,它提供了一系列的”表”(tables),每个表由若干”链”(chains)组成,而每条链中可以有一条或数条规则(rule)组 成。并且系统缺省的表是”filter”。但是在使用NAT的时候,我们所使用的表不再是”filter”,而是”nat”表,所以我们必须使用”-t nat”选项来显式地指明这一点。因为系统缺省的表是”filter”,所以在使用filter功能时,我们没有必要显式的指明”-t filter”。

同filter表一样,nat表也有三条缺省的”链”(chains),这三条链也是规则的容器,它们分别是:

PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT;
POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。
OUTPUT:定义对本地产生的数据包的目的NAT规则。
3.操作语法

如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用”-t nat”显示的指明使用nat表。然后使用以下的选项:

3.1 对规则的操作

加入(append) 一个新规则到一个链 (-A)的最后。
在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
在链内某个位置替换(replace) 一条规则 (-R)。
在链内某个位置删除(delete) 一条规则 (-D)。
删除(delete) 链内第一条规则 (-D)。
3.2 指定源地址和目的地址

通过–source/–src/-s来指定源地址(这里的/表示或者的意思,下同),通过–destination/–dst/-s来指定目的地址。可以使用以 下四中方法来指定ip地址:

使用完整的域名,如“www.linuxaid.com.cn”;
使用ip地址,如“192.168.1.1”;
用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;
用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是UNIX环境中通常使用的表示方法。缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。
3.3 指定网络接口

可以使用–in-interface/-i或–out-interface/-o来指定网络接口。从NAT的原理可以看出,对于 PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。

3.4 指定协议及端口

可以通过–protocol/-p选项来指定协议,如果是udp和tcp协议,还可–source-port/–sport和 –destination-port/–dport来指明端口。

4.准备工作

4.1 编译内核,编译时选中以下选项,具体可参看“用iptales实现包过虑型防火墙”一文:

Full NAT
MASQUERADE target support
REDIRECT target support
4.2 要使用NAT表时,必须首先载入相关模块:
modprobe ip_tables
modprobe ip_nat_ftp

iptable_nat 模块会在运行时自动载入。

5.使用实例

5.1 源NAT(SNAT)

比如,更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT –to 1.2.3.4

这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。

有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使用。比如
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

可以看出,这时候我们没有必要显式的指定源ip地址等信息。

5.2 目的SNAT(DNAT)

比如,更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT –to 1.2.3.4

这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。

有一种DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网 络接口的ip地址。通常是在与squid配置形成透明代理时使用,假设squid的监听端口是3128,我们可以通过以下语句来将来自 192.168.1.0/24,目的端口为80的数据包重定向到squid监听端口:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 –dport 80 -j REDIRECT –to-port 3128

6.综合例子

6.1 使用拨号带动局域网上网

小型企业、网吧等多使用拨号网络上网,通常可能使用代理,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域网上网。

成功升级内核后安装iptables,然后执行以下脚本:

#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
#进行ip伪装
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

6.2 ip映射

假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW 服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务 器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。

我们假设以下情景:

该ISP分配给A单位www服务器的ip为:

伪ip:192.168.1.100

真实ip:202.110.123.100

该ISP分配给B单位www服务器的ip为:

伪ip:192.168.1.200

真实ip:202.110.123.200

linux防火墙的ip地址分别为:

内网接口eth1:192.168.1.1

外网接口eth0:202.110.123.1

然后我们将分配给A、B单位的真实ip绑定到防火墙的外网接口,以root权限执行以下命令:

ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0

成功升级内核后安装iptables,然后执行以下脚本:

#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp

首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):

iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT –to 192.168.1.100
iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT –to 192.168.1.200

其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):

iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT –to 202.110.123.100
iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT –to 202.110.123.200

这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和 192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由 202.110.123.100和202.110.123.200,从而也就实现了ip映射。

分类: LINUX

本文旨在用为公司做防火墙的实例,让大家对Linux+iptables做防火墙的安装和配置有一个大致的了解,希望能起到抛砖引玉的作用。

系统环境与网络规化

先了解一下公司的环境,公 司利用2M ADSL专线上网,电信分配公用IP为218.4.62.12/29,网关为218.4.62.13 ,公司有电脑五十多台,使用DHCP,IP是192.168.2.XXX,DHCP Server建在iptables Server上;另公司有一电脑培训中心,使用指定固定IP,IP为192.168.20.XXX,为了更加快速的浏览网页,我们架了一台Squid Server,所有电脑通过Squid Server浏览网页,公司还另有一台WEB Server+Mail Server+Ftp Server。其IP为218.4.62.18。以上电脑和服务器要求全架在防火墙内。我们规化如下:

Iptables Server上有三块网卡,eth0上加有二个IP,218.4.62.14和218.4.62.18。

其中 218.4.62.14为共享上网,218.4.62.18为WEB Server专用,Eth1的IP为192..168.2.9;为了使培训中心PC与公司PC之间互不访问,所以直接从Iptables Server接到Switch-B,eth2接至Switch-A,连接培训中心PC和Squid Server, Web Server。

网络规化好了后,就开始装服务器了,Iptables Server 用的系统为Redhat Linux V7.3。在装服务器时要注意选上防火墙的安装包。

IPTABLES基础

Iptables语法:

Iptables [-t TABLE] ACTION [PATTERN] [-j TARGET]

TABLE:

有filter,nat,mangle;若无指定,预设为filter table.

ACTION(对Chains执行的动作):

ACTION 说明

-L Chain 显示Chain中的所有规则

-A Chain 对Chain新增一条规则

-D Chain 删除Chain中的一条规则

-I Chain 在Chain中插入一条规则

-R Chain 替换Chain中的某一条规则

-P Chain 对Chain设定的预设的Policy

-F Chain 清除Chain中的所有规则

-N Chain 自订一个Chain

-X 清除所有的自订Chain

CHAINS:

Iptables 有五条默认的Chains(规则链),如下表:

Chains 发生的时机

PREROUTING 数据包进入本机后,进入Route Table前

INPUT 数据包通过Route Table后,目地为本机

OUTPUT 由本机发出,进入Route Table前

FORWARD 通过Route Table后,目地不是本机时

POSTROUTING 通过Route Table后,送到网卡前

PATTERN(设定条件部份):

参数 内容 说明

-p Protocol 通讯协议,如tcp,udp,icmp,all等。。。

-s Address 指定的Source Address为Address

-d Address 指定的Destination Address为Address

-I Interface 指定数据包进入的网卡

-o Interface 指定数据包输出的网卡

-m Match 指定高级选项,如mac,state,multiport等。。。

TARGET(常用的动作):

TARGET 说明

ACCEPT 让这个数据包通过

DROP 丢弃数据包

RETURN 不作对比直接返回

QUEUE 传给User-Space的应用软件处理这个数据包

SNAT nat专用:转译来源地址

DNAT nat专用:转译目地地址

MASQUERADE nat专用:转译来源地址成为NIC的MAC

REDIRECT nat专用:转送到本机的某个PORT

用/etc/rc.d/init.d/iptables save可在/etc/sysconfig/中产生一iptables文件,大家可以看到,它有三个*号开始的行,其每一个以*号开始的行对应一个 table,以COMMIT表示此table 的结束。可将要定的规则加入到对应的table中,如下:

[root@jiaoyuang init.d]# ./iptables saveSaving current rules to /etc/sysconfig/iptables: [ OK ][root@jiaoyuang init.d]# cat /etc/sysconfig/iptables

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*mangle

:PREROUTING ACCEPT [61522:8074850]

:OUTPUT ACCEPT [1079:79301]

COMMIT

# Completed on Sat Sep 28 16:51:22 2002

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*nat

:PREROUTING ACCEPT [31850:5091703]

:POSTROUTING ACCEPT [20:1240]

:OUTPUT ACCEPT [12:776]

COMMIT

# Completed on Sat Sep 28 16:51:22 2002

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*filter

:INPUT ACCEPT [61444:8070296]

:FORWARD ACCEPT [34:1984]

:OUTPUT ACCEPT [1079:79301]

COMMIT

安装并启动IPTABLES

在安装RedHat Linux V7.3后,iptables就已经被安装了,但默认启动的是ipchains。你在安装时所定义的一些规则也在/etc/sysconfig /ipchains中被定义。我们需要将其停止,才能启动iptables(注意:虽然不停止ipchains也可以启动iptables,但这时 iptables并没有真正的起作用。Ipchains和iptables是两个防火墙,你只能选择一个)。

service ipchains stop (停止ipchains)

chkconfig –level 2345 ipchains off (使ipchains系统启动时不自动启动)

chkconfig –level 2345 iptables on (使iptables 在系统启动时自动启动)

vi /etc/rc.d/rc.local (编辑rc.local,将下面四行加到最后)

ifconfig eth0 add 218.4.62.18 netmask 255.255.255.248

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

echo “1” > /proc/sys/net/ipv4/ip_forward

(第一行是在eth0上再加一个IP:218.4.62.18,因在安装时只能设一个IP:218.4.62.14。Ip_conntrack_ftp 和ip_nat_ftp为iptables运得必须的两个模块;最后一行为使开启服务器IP转发功能。)

(如果你将iptables的模块加到了内核中,以上第二,三行可省略。)

配置DHCP Server,以便让公司PC自动获得IP和网关,网关为192.168.2.9。具体的方法请参见相关资料,本文不作详述。

reboot

重新启动服务器后,Iptables 就已经开始运行了。

配置IPTABLES

对iptables 有了一个基本的了解后,我们就可以来配置我们的服务器了。首先要发布我们的WEB Server,将以下二行加入/etc/sysconfig/iptables中的nat table内:

-A PREROUTING -d 218.4.62.18 -j DNAT –to-destination 192.168.20.254

-A POSTROUTING -s 192.168.2.254 -j SNAT –to-source 218.4.62.18

第一行为将至服务器的所有 目地地址为218.4.62.18的包都NAT为192.168.2.254,第二行为将至服务器的所有源地址为192.168.2.254的包为NAT 到218.4.62.18。请把WEB Server 的网关设为192.168.20.9。

下面我们将所有从服务器共享出去的包都SNAT为218.4.62.14,就可完成共享上网的功能了:

-A POSTROUTING -s 192.168.0.0/16 -j SNAT –to-source 218.4.62.14

将下面的规则加入到/etc/sysconfig/iptables中的filter tables内:

-A INPUT -p icmp -m icmp –icmp-type 8 -m limit –limit 6/min –limit-burst 2 -j ACCEPT

-A INPUT -p icmp -m icmp –icmp-type 8 -j REJECT –reject-with icmp-port-unreachable

以上两行是为了防止Dos攻击做的一个简单的处理,大家对于各种攻击可做出相应的处理。

-A INPUT –i eth0 –m state –state ESTABLISHED,RELATED –j ACCEPT-A INPUT –i eth0 –j DROP

以上两行是做了一个INPUT状态防火墙的处理,其主要作用为防止外部的连接和攻击,因其接受ESTABLISHED,RELATED状态(一个包分为NEW,ESTABLISHED,RELATED,INVALID四种状态)的包,故又不妨碍从本机出去的连接。

由于并不是所有的电脑都可以上网,所以还要对共享上网的电脑做一个限制:

IP限制:

-A FORWARD –s 192.168.2.0/29 –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –s 192.168.2.0/29 –p tcp –m multiport –port 3128,110,25 –j ACCEPT

-A FORWARD –s 192.168.20.253 –j ACCEPT

充许 192.168.2.0~192.168.2.7和 192.168.20.253(squid server)的电脑可上网和发邮件。3128是squid server的proxy port。我们用它去共享上网,110为pop3,25为smtp。Udp的53为DNS所要的port。不过由于使用的是DHCP,可能每次得到的IP 都不一样,所以我们就要用下面一种MAC限制的方法了。

MAC 限制:

-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

如上就可通过网卡来控制上网了,但现在电脑高手多多,改一个MAC的地址好像也不是什么难事了,怎么办呢?那就用我们的第三种方法吧。

MAC+IP限制:

更改/etc/dhcpd.conf,如果MAC与IP绑定:

subnet 192.168.2.0

netmask 255.255.255.0{

range 192.168.2.30 192.168.2.230;

option broadcast-address 192.168.2.255;

option routers 192.168.2.9;

option domain-name-servers 212.132.16.163;

host meeting-room {

hardware ethernet 00:50:ba:c8:4b:3a;

fixed-address 192.168.2.35;

}}

我们的Iptables改为:0

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

这样做之后,高手也无能为力了,不过公司有位MM是兄台的GF,上班的时候想和她聊聊天,培养培养感情;怎么办呢?我们知道QQ用的是udp的4000端口,如占用则4002,4003。。。那么就如下了:

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53,4000,4001,4002,4003,4004,4005 –j ACCEPT

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

最后加一句:

-A FORWARD –s 192.168.0.0/16 –j DROP

由于前面应该开的都开了,所以最后全部禁止。呵呵,到此大功告成。

总结

世界上没有绝对安全的防火 墙,安全永远是相对的。配置iptables的思路是先 ACCEPT再DROP。共享上网的办法还有一个就是用iptables server的Owner,但由于linux没有像win2k那样的验证模式,在验证owner时有些困难。本人正在测试,但目前还没有比较好的解决办 法,哪位兄弟搞定的话请Mail小弟,小弟将不胜感激。值得注意的是在做NAT时,客户端的网关一定要是iptagles的IP。