一 : 防止Linux系统下的VPS用户更改IP地址的方法
作为 Xen VPS 服务商,我们分配独立的 IP 地址给 VPS,我们不希望 VPS 用户自己能随便修改 IP 地址,因为这样有可能和其他用户的 IP 地址造成冲突,而且造成管理上的不便,所以需要绑定 IP 给某个 VPS.如何避免Xen VPS用户自己修改IP地址含kvm vps
解决这个问题的办法有很多,从路由器、防火墙、操作系统、Xen 等层面都可以做限制。这里介绍的两个简单方法都是从 dom0 入手:一个是在 dom0 上利用 Xen 配置;一个是在 dom0 上利用 iptables.
利用 Xen 配置
Xen 上有个 antispoof 配置选项就是来解决这个问题的,不过默认配置没有打开这个 antispoof 选项,需要修改:
# vi /etc/xen/xend-config.sxp
...
(network-script 'network-bridge antispoof=yes')
...
修改 /etc/xen/scripts/vif-common.sh 里面的 frob_iptable() 函数部分,加上 iptables 一行:
# vi /etc/xen/scripts/vif-common.sh
function frob_iptable()
{
...
iptables -t raw "$c" PREROUTING -m physdev --physdev-in "$vif" "$@" -j NOTRACK
}
修改完 Xen 配置后还需要修改 domU 的配置,给每个 domU 分配固定 IP 和 MAC 地址,还有 vif 名字:
# vi /etc/xen/vm01
...
vif = [ "vifname=vm01,mac=00:16:3e:7c:1f:6e,ip=172.16.39.105,bridge=xenbr0" ]
...
很多系统上 iptables 在默认情况下都不会理会网桥上的 FORWARD 链,所以需要修改内核参数确保 bridge-nf-call-iptables=1,把这个修改可以放到 antispoofing() 函数里,这样每次 Xen 配置网络的时候会自动配置内核参数:
# vi /etc/xen/scripts/network-bridge
antispoofing () {
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
...
}
修改完毕后测试的话需要关闭 domU,重启 iptables 和 xend 服务,再启动 domU.
# xm shutdown vm01
# /etc/init.d/iptables restart
# /etc/init.d/xend restart
# xm create vm01
上面的方法在 Xen 3.x 上 测试有效,有人说在 Xen 4.x 上行不通,我们下面将要介绍的方法绕开了 Xen 配置,直接从 iptables 限制,在 Xen 3.x 和 Xen 4.x 上应该都可以用。
利用 iptables
首先在 dom0 上确定 iptables 已经开启,这里需要注意的是一定要在每个 domU 的配置文件中的 vif 部分加上 vifname, ip, mac,这样才能在 iptables 规则里面明确定义:
# /etc/init.d/iptables restart</p> <p> # vi /etc/xen/vm01
...
vif = [ "vifname=vm01,mac=00:16:3e:7c:1f:6e,ip=172.16.39.105,bridge=xenbr0" ]
...</p> <p> # vi /etc/iptables-rules
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# The antispoofing rules for domUs
-A FORWARD -m state --state RELATED,ESTABLISHED -m physdev --physdev-out vm01 -j ACCEPT
-A FORWARD -p udp -m physdev --physdev-in vm01 -m udp --sport 68 --dport 67 -j ACCEPT
-A FORWARD -s 172.16.39.105/32 -m physdev --physdev-in vm01 -j ACCEPT
-A FORWARD -d 172.16.39.105/32 -m physdev --physdev-out vm01 -j ACCEPT
# If the IP address is not allowed on that vif, log and drop it.
-A FORWARD -m limit --limit 15/min -j LOG --log-prefix "Dropped by firewall: " --log-level 7
-A FORWARD -j DROP
# The access rules for dom0
-A INPUT -j ACCEPT
COMMIT</p> <p> # iptables-restore < /etc/iptables.rules
当然,别忘了:
# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
二 : Linux系统下图形界面更改IP地址
1.打开终端的命令模式:
点击左上角的application 然后点击System Tools下拉菜单,再点击其展开的下拉菜单Terminal,这样就打开一个命令模式了。
2.查找所要使用的命令模块的完全路径,以解决"command not found"问题:
在命令模式下分别输入:which netconfig
[root@localhost ~]# which netconfig
看看其返回的结果是不是以下信息:
/usr/sbin/netconfig
如果有返回结果的话还可以继续使用两个命令:"which ifconfig" 和 "which route" 查看 ifconfig 和 route 这两个命令的路径在甚么地方,以前我们都以其返回结果为:/sbin/ifconfig 和 /sbin/route 为例子;
3.在命令模式下输入命令:/usr/sbin/netconfig
这时就会显示一个ip设置的窗口,使用键盘就能对其进行设置了,将ip地址 和 子网掩码(netmask) 以及网关 输入进去后,选择OK 就可以了!
4.设置完之后输入 /sbin/ifconfig 就可以查看其设置是否成功。如果成功的话在其显示的结果中你能看到:
eth0 Link encap:Ethernet HWaddr 00:18:FE:28:1C:AA
inet addr:"ip地址" Bcast:广播地址 Mask:子网掩码
inet6 addr: fe80::218:feff:fe28:1caa/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3579820 errors:0 dropped:0 overruns:0 frame:0
TX packets:4311575 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:316306869 (301.6 MiB) TX bytes:1919419606 (1.7 GiB)
Interrupt:169
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:393012073 errors:0 dropped:0 overruns:0 frame:0
TX packets:393012073 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1274688659 (1.1 GiB) TX bytes:1274688659 (1.1 GiB)
如果相应的ip地址和子网掩码都设置上了的话就证明没问题了!
5.如果还是不行的话就用办法二:
还是要先打开终端命令模式,然后输入:"/sbin/ifconfig eth1 220.195.193.86(ip地址) netmask 255.255.255.240(子网掩码)"
然后输入第二条命令:"/sbin/route add default gw 211.91.88.129(网关)"
备注:/sbin/ifconfig 这里的路径完全是使用which ifconfig 所返回的结果;
6.测试是否能上网:输入命令ping 202.108.22.5 看看是否有返回数据。
补充:
方法一:命令
A、linux的网卡IP地址信息存放在文件
vi /etc/sysconfig/network-scripts/ifcfg-eth0 中
编辑文件如下:
DEVICE=eth0 //指出设备名称
BOOTPROTO=static //启动类型 dhcp|static
BROADCAST=192.168.1.255 //广播地址
HWADDR=00:06:5B:FE:DF:7C //硬件Mac地址
IPADDR=192.168.0.2 //IP地址
NETMASK=255.255.255.0 //子网掩码
NETWORK=192.168.0.0 //网络地址
GATEWAY=192.168.0.1 //网关地址
ONBOOT=yes //是否启动应用
TYPE=Ethernet //网络类型
B、修改主机名命令如下:
vi /etc/sysconfig/network
方法二:图形界面
//手动修改iP地址(获取静态IP)
三 : Linux debug : addr2line追踪出错地址
调试zSeries上的Linux应用程序类似于调试其他体系结构上的Linux应用程序。对于有经验的Linux开发人员,最大的挑战是理解新的系统体系结构。对于刚接触Linux的大型机开发人员,掌握新的调试工具似乎是一项令人畏惧的任务。不要害怕。本文将提供一些有用的提示来帮助您入门。
。www.61k.com)学问来自实践,但是对于调试工具,在没有出现问题而迫使您去修复它们之前,“实践”是不会发生的。考虑到这点,下面将提供让您入门的“速成”指南。
User Debug 日志记录
调试一个崩溃的程序的第一步是弄清哪里出了错。zSeries 上的Linux内核具有这样一个内置特性,它在用户进程崩溃时记录一些基本的调试信息。要启用这个特性,请以 root 用户身份执行如下命令:
|
当某个进程崩溃时,日志文件(/var/log/messages)中就会给出附加的信息,包括程序终止原因、故障地址,以及包含程序状态字(PSW)、通用寄存器和访问寄存器的简要寄存器转储。
|
图 1
图 1 表明程序(名为“simple”)以一个程序中断代码 0x10 终止(操作系统原理表明这是一个段转换错误),而故障地址为 0。毫无疑问,有人使用了空指针。现在我们知道发生了什么,下面需要弄清它发生在何处。
基本的诊断
User Debug日志条目所提供的信息可用于确定程序的崩溃位置。一些可用的工具可帮助解决您可能会遇到的各种程序终止问题。我们将在本文中逐步介绍那些工具。
首先,让我们检查一下该日志条目中的用户 PSW。该 PSW 包含指令地址、状态码以及关于机器状态的其他信息。眼下,我们仅关心指令地址(第33至第63位)。为简化起见,让我们假设用户PSW是 070dc000 8040****。记住,我们是在考察一个 ESA/390(31 位寻址)PSW。第32位不是指令地址的一部分,它是指示 31 位寻址模式的标志,但是在研究 PSW 值时必须处理它。为了获得实际的指令指针,可把PSW的第二个字减去 0x8000****。结果是一个指令地址 0x400618。为了定位代码,您需要可执行文件中的一些信息。首先使用readelf来打印一些程序头信息。
|
图 2
图 2 显示了readelf -l simple的结果(记住“simple”是我们的测试程序的名称)。在Program Headers部分,第一个 LOAD 行提供了关于程序从哪里加载的信息。在 Flg 列,该段被标记为 R(read)E(executable)。VirtAddr是程序开始加载的地址。MemSiz是正在被加载到这个段中的代码长度。把它加到VirtAddr上,这个程序的基本地址范围就是0x400000-0x400990。程序发生崩溃的指令地址为0x400618,在程序的加载范围之内。现在我们知道了问题直接发生在代码中。
如果可执行文件包括调试符号,那么确定哪一行代码导致了问题是可以做到的。对该地址和可执行文件使用addr2line 程序,如下所示:
|
将返回:
|
要研究该问题,可以检查第 34 行。
对于图1中原始的程序崩溃,PSW 为070dc000 c00ab738。要获得指令地址,可减去0x8000****。结果为0x400ab738。这个地址并不准确地落在我们的小程序之内。那么,它是什么呢?是来自共享库的代码。如果对可执行文件运行ldd 命令(ldd simple),将会返回程序运行所需的共享对象的列表,以及该库在那里可用的地址。
|
该指令地址对应于加载libc.so.6的地址。在我们的简单测试案例中,只需要两个共享对象。其他应用程序可能需要更多共享对象,这使得ldd的输出更加复杂。我们将以perl作为例子。 输入:
|
将得到:
|
所需要的一切都在那里了,但是我发现对于这个进程,下面的内容读起来更快一点:
|
现在我们来确定崩溃发生在libc中的何处。假设libc.so.6的加载地址是0x4002****,从指令地址 0x400ab738减去它,结果为0x8a738。这是进入libc.so.6 的偏移。使用nm命令,从libc.so.6转储符号,然后尝试确定该地址位于哪个函数中。对于libc.so.6,nm将生成7,000多行输出。通过对计算得出的偏移部分执行 grep(正则表达式查找程序)可以削减必须检查的数据量。输入:
|
将返回 66 行,在该输出的中间,我们会发现:
|
该偏移落在memcpy中的某个位置。在此例中,一个空指针被当作目标地址传递给了memcpy。我们在何处调用的memcpy呢?问得好。我们可以通过检查输出在日志文件中的寄存器转储来确定目标区域。寄存器14包含执行某个函数调用时的返回地址。根据图1,R14是0x8040066e,它在截去高位之后产生一个地址 0x40066e。这个地址落在我们的程序范围之内,因此可以运行addr2line来确定该地址在何处。输入:
|
将返回:
|
这是我们调用memcpy之后的那一行。关于addr2line的一点补充:如果可执行文件中没有包括调试符号,您将获得??:0 作为响应。
本文标题:linux更改ip地址-防止Linux系统下的VPS用户更改IP地址的方法61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1