2019年6月26日星期三

Centos7 开启 FullCone NAT

作者和源码:https://github.com/Chion82/netfilter-full-cone-nat

步骤简要:
1.编译fullcone nat内核模块
2.编译iptables,嵌入fullcone nat模块

编译内核模块需要内核的源码,centos7安装kernel-devel即可下载内核源码到本地,但用yum安装的kernel-devel很可能是已经update过的,也就是和目前的系统内核版本不一致,所以为了保持一致,先升级kernel,顺便安装上kernel-devel。
yum install kernel kernel-devel -y

安装完重启使新内核生效。
uname -a

编译前先安装必要的包:
yum install gcc libtool -y

开始编译fullcone nat内核模块:
cd /usr/src
git clone https://github.com/Chion82/netfilter-full-cone-nat.git
cd netfilter-full-cone-nat
make

如果没有报错,内核模块已经生成在当前目录xt_FULLCONENAT.ko

将这个模块放到modules对应位置,建立模块依赖,载入模块。
cp /usr/src/netfilter-full-cone-nat/xt_FULLCONENAT.ko /lib/modules/`uname -r`/kernel/net/netfilter/
depmod -a
modprobe xt_FULLCONENAT

查看模块
lsmod | grep xt_FULLCONENAT


接下来编译iptables,centos7的iptables版本是v1.4.21,为了减少可能出现的兼容性问题,同样以这个版本来编译。

cd /usr/src
git clone git://git.netfilter.org/iptables
cd iptables
git checkout 482c6d3731e2681cb4baae835c294840300197e6
cp /usr/src/netfilter-full-cone-nat/libipt_FULLCONENAT.c /usr/src/iptables/extensions/
./autogen.sh
./configure
make
make install

checkout就是切换至v1.4.21版本,新编译的iptables位置在/usr/local/sbin/iptables,不会和原先的冲突。


编译安装完成,重启下系统使新的iptables生效。

接下来是使用方法。

通过iptables命令来开启fullcone nat,eth0是外网网卡
iptables -t nat -A POSTROUTING -o eth0 -j FULLCONENAT
iptables -t nat -A PREROUTING -i eth0 -j FULLCONENAT

注意这里和以往用法的不同,以往MASQUERADE只需要1条-o命令,FULLCONENAT需要2条命令,需要在-i入口处多添加1条。

测试:



2019年6月25日星期二

NAT类型理解简版

FullCone NAT:主机从A端口发送UDP,经过NAT设备,NAT设备会用一个固定端口B把这个UDP包发送出去,此时这个B端口会接受所有外网来的UDP包,并传发给主机。

Restricted Cone NAT:主机从A端口发送UDP,经过NAT设备,NAT设备会用一个固定端口B把这个UDP包发送给目标IP,此时这个B端口只会接受目标IP用任意源端口发来的包,并转发给主机。

Port Restricted Cone NAT:主机从A端口发送UDP,经过NAT设备,NAT设备会用一个固定端口B把这个UDP包发送给目标IP,此时这个B端口只会接受目标IP用特定源端口发来的包,并转发给主机,这个特定源端口就是目标IP接受UDP包时的目的端口。

Symmetric NAT:主机从A端口发送UDP,经过NAT设备,NAT设备每次都会用不同的端口把这个UDP包发送出去。

2019年6月15日星期六

Debian9 通过KVM安装爱快软路由3.2.1

先安装和配置好KVM和桥接,我这里br0为内网,br1为外网。

下载爱快ISO,这里以当前的最新版3.2.1为例
wget -O iKuai8_x64_3.2.1.iso https://www.ikuai8.com/download.php?n=/3.x/iso/iKuai8_x64_3.2.1_Build201906121726.iso

放置到对应位置,我这里是/opt/kvm/iso/iKuai8_x64_3.2.1.iso

创建KVM虚拟机:

virt-install --name=ikuai --vcpus=2 --ram=4096 \
--os-type linux \
--cdrom=/opt/kvm/iso/iKuai8_x64_3.2.1.iso \
--disk path=/opt/kvm/iKuai.img,format=qcow2,size=10,bus=sata \
--network bridge=br0,model=e1000 \
--noautoconsole \
--graphics vnc,listen=0.0.0.0,port=5901

# 这是最重要一步,做一些说明。
# CPU为2核,内存4G,爱快64位要求的最低内存为4G,如果小于4G,则无法安装。
# 网卡必须选e1000,不要用默认的,默认的会导致网络不通。
# 网络为桥接模式,只有一个网卡,这个会做为内网网卡,在安装完成后再添加外网网卡。

VNC连接上后就可以安装了,安装步骤很简单,这里就不详说了。

添加外网网卡,走之前配置好的br1,网卡Model同样为e1000。
virsh attach-interface ikuai --type bridge --source br1 --model e1000 --live --config

重启一次使网卡生效。
virsh reboot ikuai

重启完成后就可以配置外网拨号了。

另外如果你觉得分配的4G内存太大,在安装完成后可以将内存降低,我这里测试降低到1G也可以正常使用。

优化:上面是基本的安装方法,可以尽量避免遇到错误,在安装完成后,可以继续做进一步的优化,将网卡类型修改为virtio,驱动为vhost,这样做的好处是跳过网卡虚拟层,让虚拟机的网卡直接交给host的内核来处理,可以有效减少CPU的占用,我这里实测CPU从70%降低到了35%。
virsh edit ikuai
修改model那行,然后在下面添加一行
    <interface type='bridge'>
      <mac address='52:54:00:70:70:70'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <driver name='vhost'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
define使配置文件生效:
virsh define /etc/libvirt/qemu/ikuai.xml

重启使用虚拟机生效。
virsh reboot ikuai
完成!

2019年6月12日星期三

Debian9上通过KVM安装群晖

先配置好kvm环境,桥接模式。

下载创建群晖所需要的文件:
http://down.nas2x.com/synology/dsm/6.1/

这里是以6.17为例,只需要下载这2个文件:synoboot.img和DSM_DS3617xs_15284.pat,第一个文件是群晖的启动镜像,相当于boot分区,安装和启动群晖都要靠它,第二个是群晖真正的系统。

img文件上传到debian系统里的合适位置,我这里是放在/opt/kvm/iso/synoboot.img,pat文件就放在PC本地。

创建群晖系统:
virt-install --name=syno --vcpus=2 --ram=1024 \
--os-type linux \
--disk path=/opt/kvm/iso/synoboot.img,bus=sata \
--disk path=/opt/kvm/syno.img,format=qcow2,size=20,bus=sata \
--boot menu=on \
--network bridge=br0,model=e1000 \
--noautoconsole \
--graphics vnc,listen=0.0.0.0,port=5901

上面命令的解释和注意事项:
1.2 core cpu,1G内存,linux系统

2.创建2个img文件,也就是2块硬盘,第一个是启动盘,就是之前下载的,提前把文件放到对应的位置,第二个是群晖系统盘,20G,系统会被安装在这里,2块盘的类型都要选sata模式。

3.网络为桥接模式,另外网卡model指定为e1000,必须用这个model,如果不指定,默认会是rtl8139,导致网络不通。

4.vnc端口指定为5901

创建完成后,kvm会自动启动这个系统,此时就可以用vnc去连接5901端口,查看启动状态,判断是否启动成功,除此之外没有什么别的用处,不需要去操作什么。



然后在浏览器上打开这个网址:http://find.synology.com
会自动搜索局域网内的群晖,搜索到后,就可以开始安装了,安装模式选手动,然后选择之前下载的pat文件,等待1分钟左右,整个群晖的安装就完成了。

2019年6月3日星期一

kvm host os reboot or shutdown with guest shutdown immediately


when you shutdown or reboot kvm host os ,and you hope guset os shutdown immediately without wait,you can do this:

vi /etc/default/libvirt-guests
vi /etc/default/libvirt-guests
add in final
ON_SHUTDOWN=shutdown
SHUTDOWN_TIMEOUT=1
guest os will be destoryed if that can't shutdown within 1 second.

2019年5月26日星期日

软路由选Centos7还是Debian9的比较

先说结论:选Debian9

Centos7可能重心还是在企业市场,所以对这种软路由方面的优化还不是非常完善,这里说几点用Centos7做软路由时遇到的几个问题。

1.pppoe进程占CPU太高,在下载速度达到6MB的时候,pppoe进程占CPU 20%多,这点很奇怪,在debian9上几乎不占用CPU。

2.pppoe拔号的问题,某些情况下,比如运营商出现故障,此时正好又重启Centos7,那pppoe拔号就会无法成功,然后一直卡着,等待80秒超时后才会继续执行后面的服务,比如sshd服务,导致的现象时,ip已经可以ping通,但ssh要等待80多秒才可以连接上,而且后续也不会再进行pppoe拔号尝试。Debian9并没有这个问题。

3.ipv6的问题1,如果设置了net.ipv6.conf.all.forwarding=1,那系统启动时,日志里会报内核已经开启ipv6转发,但配置文件里并没有启用,并重启一次网络,导致网络启动变慢。解决方法是在ifcfg-里手动添加ipv6forwarding=yes,就连lo接口都要去添加,这点实在不够体贴,Debian9并没有此问题。

4.ipv6的问题2,ipv6转发需要安装wide-dhcpv6包,配置完成后,在启动时会报dhcp6cctlkey这个文件不存在,让人比较困惑是不是需要某个key,其实解决方法只要touch一个这样的空文件就可以了,为什么这个包里不带一个呢?Debian9没有这个问题,会带一个这样的文件,而且里面也有密钥,这个密钥是干吗不清楚,但至少不会遇到这样的报错。

综上所述,个人认为Debian9更适合拿来做软路由。

2019年5月24日星期五

Centos7开启TRIM的方法

安装hdparm:
yum install hdparm -y

检测硬盘是否支持TRIM:
hdparm -I /dev/sda | grep TRIM
   * Data Set Management TRIM supported (limit 8 blocks)

可以先手动TRIM一次:
fstrim --verbose --all
/boot: 752.3 MiB (788824064 bytes) trimmed
/: 89.1 GiB (95708200960 bytes) trimmed

开启TRIM服务,每周会TRIM一次,不需要手动TRIM:
systemctl status fstrim.timer
systemctl start fstrim.timer
systemctl enable fstrim.timer

另外,还可以将/tmp设置为tmpfs,这会将/tmp挂载在内存中,进一步优化SSD寿命。
systemctl start tmp.mount
systemctl enable tmp.mount

更换阿里云源

CentOS 7: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http:/...