Seccomp和系统调用过滤
Seccomp v1
Seccomp是2005年Andrea Arcangeli在Linux内核加的一个功能,为了给*Grid计算中的应用*提供sandbox模型。运行在Seccomp模式下的进程,只能执行下面几个系统调用:
read(), write(), exit(), sigreturn()
Seccomp是2005年Andrea Arcangeli在Linux内核加的一个功能,为了给*Grid计算中的应用*提供sandbox模型。运行在Seccomp模式下的进程,只能执行下面几个系统调用:
read(), write(), exit(), sigreturn()
FAT 分区的引导扇区(Boot Sector)的功能是将 Windows XP 的 ntldr 文件,或 Windows Vista 的 bootmgr 文件加载到内存适当位置,由此启动 Windows。
Linux 下可以创建 Windows 的 FAT 文件系统,但是不能创建 FAT 文件系统中的 Boot Sector,也就是不能创建可以引导的 FAT 分区,因而 Linux 下无法创建可以引导的 Windows 磁盘。
不过可以曲线救国,通过 syslinux 来引导 Windows。 首先,将 syslinux 安装到 Windows 分区设备上。
syslinux /dev/sdXY
然后,将 syslinux 自带的 chain.c32 文件拷贝到 Windows 分区上。如果是 Debian,这一文件在 /usr/lib/syslinux/ 目录下。
接着,在 Windows 分区上创建 syslinux.cfg 文件
default 1 timeout 0 label 1 kernel chain.c32 append hd0,1 ntldr=ntldr
chain.c32 接受的第一个参数代表启动第1块硬盘的第1个分区,并装载分区上的 ntldr 文件。用该配置文件可以引导 Windows XP。如果需要引导 Windows Vista,需要修改成下述内容:
default 1 timeout 0 label 1 kernel chain.c32 append hd0,1 ntldr=bootmgr
chain.32 接受的参数说明如下
FAT 是 Windows 下的文件系统格式。每个 FAT 下的文件都包含 ARHIVE,SYSTEM,HIDDEN,READ-ONLY 等属性。而 Linux 下面缺乏读写 FAT 属性信息的命令,难以读出,或者设置这些 FAT 属性。
而实际上 Linux 内核的 vfat 模块包含相应的 ioctl 命令,可以修改文件的属性。在 <linux/msdos_fs.h> 定义如下:
#define FAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, __u32) #define FAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, __u32)
上述两个 ioctl 命令接受一个 int 类型,该 int 值的不同 bit 位,按照下面的定义表示不同的文件属性:
#define ATTR_RO 1 /* read-only */ #define ATTR_HIDDEN 2 /* hidden */ #define ATTR_SYS 4 /* system */ #define ATTR_VOLUME 8 /* volume label */ #define ATTR_DIR 16 /* directory */ #define ATTR_ARCH 32 /* archived */
由于没有发现有命令可以利用上述 ioctl 接口,操作 FAT 文件的属性,我自己写了一个 attrib.py 文件,代码在最后。该命令接收两个参数,说明如下
Usage: ./attrib.py dir_or_file dump|load
下面的命令将 /mnt/fat 目录下所有子目录和文件的属性输出到文件 attributes.dump 文件中
./attrib.py /mnt/fat dump > attributes.dump
./attrib.py dump 输出的部分内容如下:
A..SHR ./ntldr A..SHR ./NTDETECT.COM A..SHR ./boot.ini A..SHR ./IO.SYS A..SHR ./MSDOS.SYS .D..H. ./WINDOWS/inf .D.S.R ./WINDOWS/Fonts .D.SH. ./WINDOWS/Installer .D.S.. ./WINDOWS/Tasks .D.S.. ./WINDOWS/Downloaded Program Files ...SH. ./WINDOWS/winnt.bmp ...SH. ./WINDOWS/winnt256.bmp A...HR ./WINDOWS/WindowsShell.Manifest A..S.. ./WINDOWS/bootstat.dat
下面的命令将根据 attributes.dump 文件中包含的属性信息,给 /mnt/fat 目录下所有子目录和文件设置相应的属性
./attrib.py /mnt/fat load < attributes.dump
下面是 attrib.py 的源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #!/usr/bin/python import os import sys import fcntl import posixpath ATTR_ARCH = 0x20 ATTR_DIR = 0x10 ATTR_VOLUME = 0x08 ATTR_SYSTEM = 0x04 ATTR_HIDDEN = 0x02 ATTR_RO = 0x01 AttrBitName = { ATTR_ARCH: 'A', ATTR_DIR: 'D', ATTR_VOLUME: 'V', ATTR_SYSTEM: 'S', ATTR_HIDDEN: 'H', ATTR_RO: 'R', } AttrBits = AttrBitName.keys() AttrBits.sort() AttrBits.reverse() FAT_GETATTR_IOCTL = 0x80047210 FAT_SETATTR_IOCTL = 0x40047211 def fat_getattr(filename): fd = os.open(filename, os.O_RDONLY) try: word = fcntl.ioctl(fd, FAT_GETATTR_IOCTL, ' ') except: os.close(fd) raise os.close(fd) return ord(word[0]) def fat_setattr(filename, attr): fd = os.open(filename, os.O_RDONLY) word = '%s\0\0\0' % chr(attr) try: fcntl.ioctl(fd, FAT_SETATTR_IOCTL, word) except: os.close(fd) raise os.close(fd) def fat_attrstr(attr): bit_to_name = lambda bit: bit & attr and AttrBitName[bit] or '.' return ''.join(map(bit_to_name, AttrBits)) def fat_strattr(str): str_to_bin = lambda x: x[0] == x[1] and '1' or '0' bin = ''.join(map(str_to_bin, zip('ADVSHR', str))) return int(bin, 2) def fat_dumpattr(): for cur, dirs, files in os.walk('.'): items = dirs + files for item in items: try: filename = '%s/%s' % (cur, item) attr = fat_getattr(filename) str = fat_attrstr(attr) print '%s %s' % (str, filename) except Exception, e: print e def fat_loadattr(): for line in sys.stdin.readlines(): str = line[:6] file = line[6:].strip() if posixpath.exists(file): newattr = fat_strattr(str) oldattr = fat_getattr(file) if newattr == oldattr: print 'ignore same attribute %s[0x%02x]: %s' % (str, newattr, file) else: oldstr = fat_attrstr(oldattr) fat_setattr(file, newattr) print '-%s[0x%02X] +%s[0x%02X] %s' % (oldstr, oldattr, str, newattr, file) else: print 'ignore not existing file: %s' % file def usage(): print 'Usage: %s dir_or_file dump|load' % sys.argv[0] exit(1) if len(sys.argv) != 3: usage() target_dir = sys.argv[1] old_dir = os.getcwd() try: os.chdir(target_dir) except: print 'Bad directory: %s' % target_dir usage() op = sys.argv[2] if op == 'dump': fat_dumpattr() elif op == 'load': fat_loadattr() else: print 'Bad option: %s' % op usage() os.chdir(old_dir) |
现在的交换机大部分都支持802.1Q VLAN了, 通过VLAN可以将一个交换机上的不同端口分隔成隔离的链路, 也可以将多个交换机上的端口连接到同一个链路.
有时候, 我们可能希望一台机器同时连入多个VLAN, 最好是通过一块网卡. 也就是说, 让一个网络端口同时属于多个VLAN. 要实现这样的功能, 需要做两个方面的配置:
交换机配置
首先要把该主机对应的交换机端口设置为混合端口, 只有混合端口可以同时加入多个VLAN, 下面是Huawei交换机的配置片段:
interface Ethernet0/1
port link-type hybrid
port hybrid vlan 10 20 tagged
port hybrid pvid vlan 10
上述配置让交换机的1号端口成为混合端口, 并同时加入id号为10和20的VLAN, 主VLAN号是10.
Debian主机配置
首先需要在Debian上安装vlan配置工具.
apt-get install vlan
然后, 我们可以在Debian的网络配置文件中, 配置每个VLAN对应的网卡. 下面是/etc/network/interfaces文件的片段:
auto eth0.10
iface eth0.10 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.254
iface eth0.20 inet static
address 192.168.2.10
netmask 255.255.255.0
上述配置文件配置的主机, 分别有两块虚拟网卡eth0.10, eth0.20, 对应VLAN 10和VLAN 20所在的网络.
除了配置文件之外, 管理员还可以通过vconfig命令, 增加或者删除VLAN.
FQDN是Fully Qualified Domain Name的缩写, 含义是完整的域名. 例如, 一台机器主机名(hostname)是www, 域后缀(domain)是example.com, 那么该主机的FQDN应该是www.example.com.
题外话, 其实FQDN最后是以"."来结尾的, 但是大部分的应用和服务器都允许忽略最后这个点.
Linux允许用户通过hostname命令查看并设置主机名. 用户也可以通过hostname -f命令得到该主机的FQDN. 但是, 却没有直接设置FQDN的命令.
实际上, 设置Linux的FQDN可以通过两种方法实现.
第一种, /etc/hostname + /etc/hosts文件组合
首先在/etc/hostname文件中设置主机名, 假设是
www
然后在/etc/hosts文件中增加一行主机记录, 第一个字段是该主机的IP地址, 第二个字段是你希望设置的FQDN, 最后是刚刚设置的主机名, 如下
A.B.C.D www.example.com www
设置好之后, 通过hostname -F /etc/hostname更新主机名. 这时, 通过hostname -f看到的FQDN就应该是: www.example.com
第二种, /etc/hostname + /etc/resolv.conf组合
如果Linux不能在/etc/hosts文件中找到hostname对应的记录, 就会试图从resolv.conf文件中得到主机的域名后缀(domain name). 例如, 这样的/etc/resolv.conf文件
domain example.com
search example.com
nameserver W.X.Y.Z
根据配置文件中的domain后缀example.com, 加上主机名www, Linux会试图自动拼接成一个候选FQDN: www.example.com. 但这个候选FQDN还需要进一步验证.
Linux通过DNS服务器W.X.Y.Z解析候选FQDN, 如果解析失败, 生成FQDN过程就失败了. 如果解析成功, 则会返回www.example.com这个域名的正式名称. 也就是说, 如果在DNS服务器的记录中, www.example.com这个域名是指向server.example.com的CNAME记录的话, 而server.example.com才是A记录. 返回的FQDN就是server.example.com, 而不是www.example.com.
以上就是Linux下设置FQDN的方法.
Recent Comments