ddr 发表于 2017-2-20 18:34:36

使用ubuntu定制软路由

自己做软路由的原因:

原本我使用一台旧PC机+爱快来做软路由,首先要强调爱快基本是完美的可以满足需求并且是完全免费的,除了一个问题VPN拨号,无论是PPTP还是L2TP都存在很明显的BUG,但是爱快并没有认真修复,反而在每次升级时都会出现更加大的问题。
PPTP在升级到2.6.12之后,会出现一大堆协议错误,2.7.0也是一样。L2TP升级了这么多次,依然不支持共享密钥,而且不会自动拨号的情况出现几率是99%。爱快也没有给这两种VPN设置手动重新拨号的按键,所以你就智能傻等了,唯一解决方案就是重启路由器。。。。
好不容易找到的2.6.11版本勉强可用,PPTP也会经常出现一大堆协议错误,但是好歹比2.6.12全是协议错误要好点。
另外,爱快中的很多功能都是针对网吧设计的,比如web认证和计费,防火墙的那一堆设置等,作为一个伪处女座我有洁癖接受不了这么多不用的功能。
也有一些我想自己添加和扩展的功能,使用一个开放的系统会更灵活一些。

---------------------------------------------------------------------------------------
我期望中的软路由的特性:

系统:ubuntu server lts (目前的LTS是16.04)
1:能支持主流的硬件驱动,适用的硬件范围广泛,老旧机器和各种淘宝买到的多口网卡都可以顺利安装
2:有主流的软件安装包支持(比如pppoe,各种vpn客户端等)和大量的中文网络技术资料支持
3:能使用shell,crontab,python等进行简单开发和功能扩展

-----------必要功能----------
PPPOE:
1:能稳定的拨号,24小时运行不掉链子
2:断线重连,开机自动启动
3:多拨和多线负载均衡暂时不考虑,这个家用的可能性比较少,某些城市能同一运营商多拨并且带宽叠加的估计也会慢慢被限制,此功能网吧和公司用的比较多。

路由:
1:所有的LAN口可以自动NAT转换,通过WAN口上网

DHCP:
1:能DHCP分配IP
2:能对指定的MAC地址分配固定IP,比如家里的NAS和打印机

UPNP,端口映射,VPN穿透:
1:支持UPNP,以便于迅雷等P2P软件实现外网连接和高速下载2:如果支持端口映射也可以,毕竟需要转发的端口都可以固定下来。比如3389远程桌面等连接到内网的电脑上。
3:要能支持公司办公类VPN穿透路由。

智能分流:
1:支持PPTP,L2TP, shadowsocks等主流VPN客户端
2:支持根据泛域名进行VPN分流
3:支持VPN的流量使用单独的DNS服务器,避免DNS污染
4:断线自动重连,开机自动启动

远程管理:
1:支持SSH远程登录管理

----------可选功能---------

交换:
1:所有的LAN口可以实现千兆交换。如果买了2个口以上的网卡,剩下的口可以用来连接电脑或者更多交换机使用。这个应该是靠安装open vswitch软件来实现。
2:VLAN划分,这个暂时不考虑,家用网络没那多需求,风暴的可能性比较小,VLAN的意义暂时没有那么大。

安全管理:
1:支持封禁MAC地址,防止蹭网和破解攻击
2:封禁某些端口。iptables应该可以实现。

动态域名:
1:支持定期把自己的IP上传到远端服务器上去
2:支持DNSPOD的顶级动态域名API自动更新

家长管理:
1:对单个MAC进行限速
2:对单个MAC的访问域名限制在白名单范围内

其他:
1:似乎PSN的网络有一些特殊需求,还没入PS4没研究过
2:图片视频等文件缓存服务器,降低外网请求量,加快网络速度
3:DNS缓存服务器,加速DNS解析


-----------------------------------------------------------------------------------
以下是具体实现过程:
我以安装和配置记录的形式一步一步的写出来,这样你可以有选择性的自己来定制。当然,对动手能力也有一定要求。


第一步:准备硬件
硬件要求很低,能装的上ubuntu即可;并且有两个以上的网口(内置网卡、外置网卡、内外网卡混合使用都可以)一个作为wan口连接你的运营商,一个作为lan口连接交换机。
我目前的配置是 AMD黑盒5000+(CNQ动态降频),华擎785G主板,淘宝买的垃圾AMD专用4G DDR2内存,旧SATA硬盘,旧铜牌转换效率电源,一个集成单口千兆网卡,一个淘宝买的4口千兆PCI网卡,待机功耗估计几十W左右。

第二步:安装ubuntu server 16.04 lts
下载链接:ubuntu官网
安装教程:
下载完ISO后,下载这个工具Universal USB Installer,准备一个U盘,把iso用这个工具写入到U盘,选项选(ubuntu server installer才能看到你下载的ISO)
然后把U盘插入电脑,开机进bios选择U盘启动。
启动后可能会出现这个问题:missing parameter in configuration file,输入help,然后回车就可以开始安装界面了。
安装选项:(供参考,不一定非要一致)
1:磁盘使用我选的整个硬盘
2:除了ubuntu核心文件没有选择其他任何软件(包括SSH等都是根据需求安装)
3:安装的英文版
安装完成后拔掉U盘,启动电脑,根据你的显卡,你会只看到显示两行字类似这样的(或者完全没有任何显示):
/dev/sda1:recovering journal
/dev/sda1:clean, 74472/7299072 files, 881725/29182208 blocks
这时候按 Ctrl+Alt+F1就可以切换到终端了,可以使用安装过程中设置的用户名和密码登陆进去。

第三步:设置root密码,使用root登录
这样方便一些,后续所有命令省去sudo,也比较危险
sudo passwd root
即可给root设置密码,然后exit,使用root登录。
下面的说明都是按照root帐号的

顺便开启SSH登陆,方便后续管理
apt-get install openssh-server openssh-client
vi /etc/ssh/sshd_config
把PermitRootLogin这一行改为PermitRootLogin yes
service ssh restart

第四步:安装和设置 DHCP
我这里的网络拓扑结构如下:(下面便于理解把interface叫做网卡)
假设你有2块网卡分别叫eth0,eth1(多于2个网卡的交换机功能作为可选功能后续实现,先暂时只使用其中两个网卡)。
网卡的名字可能不叫这个,可以通过ifconfig -a来查看。如果不叫这些名字,那么下面的命里里要换成你实际的网卡名称。比如我的是enp4s0f0对应eth0,enp5s0f0对应eth1

eth0作为WAN口,接运营商的网线(比如来自光猫),用来pppoe拨号,这个网卡不设置默认IP,在拨号成功后也不会获得一个IP。
在拨号成功后,系统里实际上会再添加一个虚拟网卡叫做ppp0,是真正用来上网的网卡,会有一个外网IP。

eth1作为LAN口,配置为内网IP 192.168.1.1,作为默认的内网网关,实现内网外网之间的转换。
这个网口接家里的连接交换机,交换机上连接其他各种上网设备。同时DHCP服务也绑定在这个网卡上。

把eth1的IP改为192.168.1.1
vi /etc/network/interfaces
把原来的iface eth1 inet auto改为
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0注意不要设置gateway
然后重启network。
service networking restart

DHCP服务的步骤:(使用dnsmasq作为DHCP服务器, 他同时也是DNS代理服务器,为后续的智能分流做准备)
apt install dnsmasq
vi /etc/dnsmasq.conf

strict-order
listen-address=192.168.1.1,127.0.0.1
dhcp-range=192.168.1.110,192.168.1.199,12h
可以限定mac的ip分配
dhcp-host=00:e0:4c:2c:f0:83,192.168.1.100
dhcp-host=44:d2:44:46:2b:8f,192.168.1.102

service dnsmasq restart


第五步:安装和设置 ppoe拨号
使用pppoeconf来配置拨号,注意运行这个程序时,eth0网口必须连上猫。基本上输入上网的用户名密码一路next就OK,他会帮你做成开机启动,并帮你把MTU值改成小于1500的。
apt-get install pppoeconf
pppoeconf


后续可以手工使用的几个命令:
拨号:pon dsl-provider
断线:poff
查看日志:plog


这个pppoeconf是通过修改/etc/network/interface来实现开机自动拨号的
拨号成功之后,会出现一个新的网卡ppp0




第六步:安装和设置 路由和网关功能



网关的功能是通过iptables来实现的。
原理如下:
iptales只读取数据包头,不会给信息流 增加负担,也无需进行验证。
典型的防火墙设置有两个网卡:一个流入,一个流出。
iptables读取流入和流出数据包的报头,将它们与规则集(Ruleset)相比较,将可接受的数据包从一个网卡转发至另一个网卡,对被拒绝的数据包,可以丢弃或按照所定义的方式来处理。
在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角 色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数 据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。 在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。


设置过程:
1:修改路由表
让所有发往内网192.168.1.X的包都走eth1,用于局域网内部通信比如访问NAS
让发往其他网段的包都走ppp0
ubuntu的pppoe之后,会自动修改成这样,所以不需要手动改。
Destination   Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U   0      0      0 ppp0
192.168.1.0   0.0.0.0         255.255.255.0   U   0      0      0 eth1

2:通过iptables设置NAT

把这个配置文件的值改成1
echo 1 > /proc/sys/net/ipv4/ip_forward

vi /etc/sysctl.conf
取消 # net.ipv4.ip_forward = 1 的注释,保存退出
让sysyctl生效
sysctl -p

删除之前iptables规则
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
其中MASQUERADE是用来动态获取ppp0的当前IP的,这个命令就是把所有的目标是ppp0(由route路由表决定包走向)的包的源地址,替换为ppp0的外网地址。

因为POSTROUTING是一个链,所以后续收到外网服务器回应的包的DNAT操作就是自动的了,不需要再设置一条外网到内网的转化规则。
Mangle表的5条链:
(1)PREROUTING 链:数据包进入防火墙后,路由判断之前改变数据包。
(2)POSTROUTING链:数据包确定了目标地址后,即路由判断前改变数据包。
(3)OUTPUT链:在数据包被确定目的地址前改变数据包
(4)INPUT链:在数据包进入本机后,应用程序接受之前改变数据包。
(5)FORWARD链:第一次路由判断之后,最后一次路由判断前改变数据包。
IPTABLES中数据包和4种被跟踪连接的4种不同状态。
(1)NEW : 该包想要开始一个连接(重新连接或将连接重定向)
(2)RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。 --icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的
(3)ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
(4)INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。


到这里,一个标准的路由器就设置完成了,可以上网了。
其中第六步的命令,需要写到/etc/rc.local文件里,以便开机执行。(iptables规则重启后就没了)
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

由eth0拨号,生成ppp0连接外网,会修改你系统路由表让默认流量走ppp0,并会自动把DNS服务器地址放到你系统的/etc/resolve.conf里面。这个文件会被dnsmasq读取,并修改这个文件为nameserver 127.0.0.1,把本机的dns服务转移到dnsmasq去。

一台电脑接入这个路由后,由dnsmasq作为DHCP服务分配IP,网关(192.168.1.1),DNS(192.168.1.1)。
根据路由表设置,这个电脑发包到192.168.1.X的请求都会被route到eth1直接扩散到内网去,其他所有请求都会route到ppp0。
系统路由表如下:
root@softrouter:~# route -n
Kernel IP routing table
Destination   Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U   0      0      0 ppp0
192.168.1.0   0.0.0.0         255.255.255.0   U   0      0      0 eth1

到ppp0的外网请求,都会被iptables的SNAT规则修改包,把源地址的内网IP替换成ppp0的外网IP,来实现这台内网电脑和外网服务器的通信。

ifconfig信息如下:
root@softrouter:~# ifconfig
eth0Link encap:EthernetHWaddr 05:1f:29:60:6d:a2
          inet6 addr: fe80::21f:29ff:fe60:6da1/64 Scope:Link
          UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
          RX packets:248591 errors:0 dropped:0 overruns:0 frame:0
          TX packets:205203 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:351559413 (351.5 MB)TX bytes:24780183 (24.7 MB)
          Interrupt:17 Memory:fe8e0000-fe900000


eth1Link encap:EthernetHWaddr 05:1f:29:60:6d:a3
          inet addr:192.168.1.1Bcast:192.168.1.255Mask:255.255.255.0
          inet6 addr: fe80::21f:29ff:fe60:6da3/64 Scope:Link
          UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
          RX packets:202917 errors:0 dropped:9 overruns:0 frame:0
          TX packets:247477 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:22854709 (22.8 MB)TX bytes:349248551 (349.2 MB)
          Interrupt:19 Memory:feae0000-feb00000


lo      Link encap:Local Loopback
          inet addr:127.0.0.1Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNINGMTU:65536Metric:1
          RX packets:618 errors:0 dropped:0 overruns:0 frame:0
          TX packets:618 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:43289 (43.2 KB)TX bytes:43289 (43.2 KB)


ppp0      Link encap:Point-to-Point Protocol
          inet addr:188.253.98.11P-t-P:100.160.22.1Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICASTMTU:1492Metric:1
          RX packets:248471 errors:0 dropped:0 overruns:0 frame:0
          TX packets:205113 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:345091391 (345.0 MB)TX bytes:19441020 (19.4 MB)

/etc/network/interfaces文件是这样的
root@softrouter:~# more /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).


source /etc/network/interfaces.d/*


# The loopback network interface
auto lo
iface lo inet loopback


# The primary network interface
#auto eth1
#iface eth1 inet dhcp


auto eth1
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0


auto dsl-provider
iface dsl-provider inet ppp
pre-up /bin/ip link set eth0 up # line maintained by pppoeconf
provider dsl-provider


auto eth0
iface eth0 inet manual



第七步:VPN智能分流

思路:
一套完整的服务由以下几个部分组成,目前都是必须的,以后随着pdnsd的发展如果能支持ipset后,可以取消dnsmasq
(1):shadowsocks
包括服务器端的ss-server和路由器端的ss-redir,用来实现socks5代理
(2):dnsmasq
主要是用来支持把你想要分流的域名解析出来的ip放到一个ipset里面去,比如这个ipset名字叫fenliu。
(3):iptables
把所有访问fenliu这个ipset里面IP的包,都转发给ss-redir
(4):pdnsd
主要作用是把DNS解析这个udp请求转为tcp请求,并通过ss-redir来走,以避免dns污染。
如果你用dnsmasq直接连8.8.8.8,部分域名会被污染,比如我这里facebook、t66y会被污染,但是google.com不会。


步骤:
1:server端安装shadowsocks
我的server也是ubuntu 16.04 lts,安装参考这个shadowsocks – libev 服务端的部署

Ubuntu 16.10及以上版本则可以直接从Ubuntu的官方repo安装
apt-get update

apt-get install shadowsocks-libev



然后配置服务端的config,
vi /etc/shadowsocks-libev/config.json
{
      "server":"0.0.0.0",
      "server_port":8888,
      "password":"password",
      "method":"aes-256-cfb",
      "timeout":60
}

因为我不知道默认安装的service启动了哪些服务,所以我把service关掉了,自己手动起服务。
service shadowsocks-libev stop
删除/etc/rc5.d 目录下的shadowsocks-libev软链接。


手动启动服务,至启动ss-server:
nohup ss-server -c /etc/shadowsocks-libev/config.json -u -v > /root/ss/log 2>&1 &
把这条命令写到/etc/rc.local以便开机启动

如果你的服务器开了防火墙比如ufw,可能需要开一下端口号
ufw allow 8888
如果服务器是双网卡内外网结构,还要做一个NAT(取决于服务器的网络架构,aws的EC2就不需要)
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -o eth1 -j MASQUERADE

2:路由器安装shadowsocks
和1一样,安装完之后配置config
{
    "server":"example.com or X.X.X.X",
    "server_port":8888,
    "local_address":"0.0.0.0",
    "local_port":1080,
    "password":"password",
    "timeout":60,
    "method":"aes-256-cfb"
}

同样关掉service自己启动服务,只启动ss-redir,ss-redir服务监控在本机所有ip的1080端口
service shadowsocks-libev stop
删除/etc/rc5.d 目录下的shadowsocks-libev软链接

nohup ss-redir -c /etc/shadowsocks-libev/config.json -u -v > /root/ss/log 2>&1 &

3:把你想要的域名通过单独的DNS解析,并把解析后的IP放到ipset里面
ipset create fenliu hash:ip
vi /etc/dnsmasq.conf
加入这些
server=/google.com/192.168.1.1#7777
server=/t66y.com/192.168.1.1#7777
server=/facebook.com/192.168.1.1#7777
ipset=/google.com/fenliu
ipset=/t66y.com/fenliu
ipset=/facebook.com/fenliu
我把这些域名的dns指向了后续下一步pdnsd的服务端口,使用pdnsd来转成tcp请求,通过ss-redir来防止dns污染。
service dnsmasq restart


4:将目的IP是这个ipset里面的ip的包,转发给ss-redir
iptables -t nat -A PREROUTING -p tcp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080
iptables -t nat -A OUTPUT -p tcp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080
iptables -t nat -A PREROUTING -p udp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080
iptables -t nat -A OUTPUT -p udp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080


5:安装pdnsd服务

apt-get install pdnsd
vi /etc/pdnsd.conf
改成这样:
global {
      perm_cache=2048;
      cache_dir="/var/cache/pdnsd";
      run_as="pdnsd";
      server_ip = 0.0.0.0;
      server_port=7777;
      status_ctl = on;
      paranoid=on;
      query_method=tcp_only;// 这个特别重要
      min_ttl=15m;       // Retain cached entries at least 15 minutes.
      max_ttl=1w;      // One week.
      timeout=10;      // Global timeout option (10 seconds).
}
server {
      label = "public-dns-servers";
      ip = 208.67.222.222, 208.67.220.220;
      port = 5353;
      timeout = 4;
      reject = 243.185.187.39
//      ,243.185.187.39
      ;
      reject_policy = fail;
}


pdnsd把解析服务通过208.67.222.222#5353, 208.67.220.220#5353这个服务来解析,据说8.8.8.8用tcp还是会被拦截,所以就不用google的了
为了保证正确解析,这两个ip也需要加入ipset通过ss-redir转发
ipset add fenliu 208.67.222.222
ipset add fenliu 208.67.220.220


现在就大功告成了!:)


第八步:把以上规则和服务做成开机启动,以及添加定期监控


开机启动,最终我的/etc/rc.local 是这样的



root@softrouter:~# more /etc/rc.local      
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.


#for soft router nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE


#for shadowsocks
ipset create fenliu hash:ip
iptables -t nat -A PREROUTING -p tcp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080
iptables -t nat -A OUTPUT -p tcp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080
iptables -t nat -A PREROUTING -p udp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080
iptables -t nat -A OUTPUT -p udp -m set --match-set fenliu dst -j REDIRECT --to-ports 1080


#for pdnsd
ipset add fenliu 208.67.222.222
ipset add fenliu 208.67.220.220


nohup ss-redir -c /etc/shadowsocks-libev/config.json -u -v > /root/ss/log 2>&1 &




exit 0



自动监控,是通过crontab定期运行一个脚本实现的,对于拨号的自动监控脚本如下:

root@softrouter:~/pppoe# more pppoe-m.sh
#!/bin/sh


dns1="baidu.com"
dns2="qq.com"


ping -s 1 -c 1 $dns1
if [ "$?" != "0" ]
then
      ping -s 1 -c 2 $dns2
      if [ "$?" != "0" ]
      then   
                echo "re dail"
                poff
                pon dsl-provider
      else
                echo "suan le"
      fi   
else
      echo "zhengchang"            
fi


crontab -e
加一行
*/1 * * * * /root/pppoe/pppoe-m.sh >> /root/pppoe/pppoe.log



第九步:端口转发
端口转发其实挺简单的,对内网的某台机器做DNAT操作即可,因为之前设置为路由器的时候,已经配置了全部ppp0的流量做了SNAT,所以SNAT就不需要再配置了。

比如,要对内网的某台windows机器192.168.1.100做远程桌面的端口转发,这么配置即可:
iptables -t nat -A PREROUTING ! -d 192.168.1.0/24 -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.100:3389
这里我没找到DNAT怎么设置自动使用外网的IP地址(SNAT是可以用 -j MASQUERADE的),所以就给配置成了访问非内网网段的IP的3389,都给DNAT到这台机器上。

第十步:动态域名解析
动态域名我不准备使用花生壳之类的,因为对二级域名实在是记不住。

我用我目前这个yylib的子域名来做。
(1):把解析服务转到dnspod,这是一个腾讯全资的dns服务商,提供免费DNS服务和监控服务,最关键的是有免费的ddns的API。
地址 https://www.dnspod.cn/
(2):设置一个A的子域名记录,比如i.yylib.com,解析到你当前ppp0的IP上
(3):在dnspod上 用户中心--安全设置--API Token 里面,生成一个id和token
(3):在路由器上定期发送自己的IP到dnspod。
他的官网列出了很多可用的第三方脚本,https://support.dnspod.cn/Support/api
我用的是这一个 : https://github.com/anrip/ArDNSPod

下载ddnspod.sh,dns.conf.example这两个文件。

修改ddnspod.sh的193行 lastIP=$(arDdnsInfo "$1 $2"),改为lastIP=$(arDdnsInfo "$1" "$2"),这一行的参数传递作者写错了。


修改dns.conf.example为dns.conf
内容如下:
root@softrouter:~# more dns.conf
# For security reasons, it is recommended that you use token-based auth instead
# arMail="test@gmail.com"
# arPass="123"


# Combine your token ID and token together as follows
arToken="2惺惺惜惺惺,679哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈"


# Place each domain you want to check as follows
# you can have multiple arDdnsCheck blocks
arDdnsCheck "yylib.com" "i"


然后加入crontab即可
crontab -e
增加一行
*/1 * * * * /root/ddnspod.sh >> /root/ddns.log















ddr 发表于 2017-2-28 11:53:06

参考资料--网络协议部分

本帖最后由 ddr 于 2017-3-17 22:20 编辑

参考资料:
ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。Arp 报文只会在以太网之间发送,并不会在网络之间发送,由网关进行隔离。

交换机工作原理:
端口地址表记录了端口下包含主机的MAC地址。端口地址表是交换机上电后自动建立的,保存在RAM中,并且自动维护。交换机隔离冲突域的原理是根据其端口地址表和转发决策决定的。
转发决策交换机的转发决策有三种操作:丢弃、转发和扩散。
丢弃:当本端口下的主机访问已知本端口下的主机时丢弃。
转发:当某端口下的主机访问已知某端口下的主机时转发。
扩散:当某端口下的主机访问未知端口下的主机时要扩散。
每个操作都要记录下发包端的MAC地址,以备其它主机的访问。



一个IP包里面,有4个比较重要的信息:源IP,源MAC地址,目的IP,目的MAC地址。MAC地址会被用于数据链路层,进行真正的数据传输。你的电脑要访问另一台电脑,需要先知道对方的IP。
1:当你的电脑A要访问同一个网段IP的另一台电脑B时,发现是同一网段的IP直接绕过了路由表,通过ARP协议查询到B的IP对应的MAC,发送一个带目的IP和目的MAC的包给交换机,交换机负责把包转发给对应的MAC地址的电脑B。
多个交换机级联时,可以理解为一个大交换机,ARP报文会在这多个交换机上传播。通过在交换机上来把大的广播域隔离成多个小的广播域的技术叫 vlan 技术,划在不同的 vlan,就从一个广播域变成两个广播域了。用这种技术来优化网络性能,减少广播风暴的范围。
2:如果你的电脑A要访问不同网段的电脑B时,要发包给同一网段的网关C,网关C去访问路由器的路由表(IP段-网卡的映射关系表)来确定把这个包转发到另外一个网段的网关D对应的网卡,由这个D的网卡继续后面的发送工作。
如果两个网段是个内外网,则在这个转发过程中,会把包里A的源IP改为网关D的外网IP,以便能收到外网所访问的电脑的回应信息,同时维护一个track table,收到外网的回复信息时再把回复包的目的IP改为A的内网IP








ddr 发表于 2017-2-28 13:39:44

其他补充:

本帖最后由 ddr 于 2017-3-6 10:49 编辑

ubuntu的问题:

ddr 发表于 2017-6-12 17:15:29

补充:怎么查看局域网内现有的设备、IP、MAC地址,以便对设备进行管理

需要安装一个探测工具nmap
apt-get install nmap
然后用这个命令就可以列出全部的设备,为了格式好看我用了几个sed命令来改一下显示的格式:
nmap -sP 192.168.1.0/24 | sed '/^Nmap/i\\n\n\n---------------------------' | sed -e '/Host is up/d' | sed 's/Nmap scan report for //' | sed 's/MAC Address: //'


或者:


cat /var/lib/misc/dnsmasq.leases


ddr 发表于 2020-3-20 13:42:14

update:如果用ss/SSR做网游加速器

对于偶尔玩一次游戏的人,买网游加速器太不划算,既然自己就能翻墙,自己就可以做加速器

使用的软件,主要是转换游戏所使用协议的软件,比较出名的有两个(都是同一个作者,目前已停止维护):SSTAP和SocksCap64,使用教程自己搜吧。
这里只补充一下SS的一个坑。用这两个软件时,需要服务器的SS-SERVER启动加上-u参数,支持UDP转发即可。但那是我测试的时候,死活无法通过UDP测试(TCP是非常正常的),具体表现就是ss-server收不到UDP的包。
但是我后来发现,在ss-server本机上,去UDP测试ss-server的端口是通的,可以收到包。于是反复检查服务器的防火墙和iptables设定,都没问题。
最后灵光一闪,把端口号改了个很小的端口号,一切正常了。这个目前还不知道是ubuntu的问题还是我的VPS服务商的问题,大于5000的UDP端口号的包会被丢掉(但是大于5000的TCP端口是正常的)
页: [1]
查看完整版本: 使用ubuntu定制软路由