debian下搭建家庭网关再体验

  |   0 评论   |   0 浏览

背景

在路由器的基础上,增加一个linux网关,用来更精细的控制流量。拓扑如下:

1.png

其中路由器和网关之间是千兆网速连接,Speed: 1000Mb/s。

再体验

开启转发

开启转发后,N1节点可以做为网关,供其它节点上网使用。

开启转发的方法如下:

在网关上,开启forward转发

# 系统设置
sysctl -w net.ipv4.ip_forward=1

# FORWARD链
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

确认成功

将电脑的网关改为 192.168.1.2

ping正常

ping www.baidu.com
PING www.a.shifen.com (182.61.200.6): 56 data bytes
64 bytes from 182.61.200.6: icmp_seq=0 ttl=53 time=7.768 ms

traceroute正常,第一跳已经为N1节点。

% traceroute www.baidu.com
traceroute: Warning: www.baidu.com has multiple addresses; using 182.61.200.6
traceroute to www.a.shifen.com (182.61.200.6), 64 hops max, 52 byte packets
 1  * * n1 (192.168.1.2)  2.677 ms
 2  r7000 (192.168.1.1)  2.118 ms  1.427 ms  2.081 ms

缓存DNS

缓存DNS,可以支持自定义域名/ip解析,也可以将特定的域名标记为ipset。

安装

sudo apt-get install dnsmasq

如果要增加自定义解析规则,则编辑文件 /etc/dnsmasq.conf,在尾部如下:

address=/r7000.home/192.168.1.1
address=/n1.home/192.168.1.2
address=/pc.home/192.168.1.3

测试

dig pc.home @192.168.1.2

结果

;; ANSWER SECTION:
pc.home.			0	IN	A	192.168.1.2

squid

squid可以将静态资源进行缓存,使后面的访问更快,流量更小。

安装

apt-get install squid

允许本地网络访问,修改配置文件 /etc/squid/squid.conf,如下:

http_access allow localnet
#http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

增加磁盘缓存

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/spool/squid 100 16 256

重启服务

/etc/init.d/squid reload

日志文件 /var/log/squid/access.log

启用透明代理(未完成)

启动透明代理后,会自动将请求转发到squid上,而不用在设备段单独配置代理。

未完成

按域名路由

在本节中,我们引入了一个ECS节点moon,对指定域名的流量提供加速访问。

如下图所示,我们将ECS和N1组成了一个 192.168.2.* 网段的虚拟网段。

22.png

先复习一下 iptables, route的相关知识[6]。

iptables中默认有3个表:filter表、nat表和mangle表。

  • filter表:数据包过滤
  • nat表:地址转换
  • mangle表:数据包特殊处理

filter表中有三个链:INPUT, OUTPUT, FORWARD

nat是一个路由器,其表中还有两条新链:PREROUTING和POSTROUTING

Chapter 14. iptables firewall

SNAT在包离开之前,改变源地址,如:

iptables -t nat -A POSTROUTING -o eth1 -s 10.1.1.0/24 -j SNAT --to-source 11.12.13.14

IP伪装 (IP masquerading)与SNAT相似,但适用于动态接口,如路由器中每次连接到互联网时isp会分配不同的ip地址。

iptables -t nat -A POSTROUTING -o eth1 -s 10.1.1.0/24 -j MASQUERADE

DNAT将互联网的数据包重定向到内部服务器中,允许互联网用户访问内部服务,如:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 22 -j DNAT --to-destination 10.1.1.99

将域名标记为ipset

第一步,通过dnsmasq,将域名标记为ipset。ipset可以供后续的ip route进行路由。

[2]

  1. 安装配置ipset,创建集合
apt-get install ipset

使用

创建一个集合(SETNAME)

ipset create outmoon hash:net

查询集合内容

ipset list outmoon

删除集合

ipset destroy outmoon

可以也在系统启动时,来自动创建对应的 ipset。

ipset create outmoon hash:net
  1. 通过dnsmasq,绑定域名到ipset中的集合

修改文件 /etc/dnsmasq.conf,增加内容如下:

ipset=/google.com/outmoon

这时,如果 dnsmasq中有过 google.com的域名解析,则会将对应的ip记录到outmoon中。

所以,记着将本机的域名解析地址中,增加本机地址。

  1. 配置路由表

在路由表中,增加集合名称,修改文件 /etc/iproute2/rt_tables,增加

80	outmoon

其中前面的数字不要和已有的重复了。

查看table outmoon下的路由:

# ip route list table outmoon

先手动测试路由表

设置路由

route del 182.61.200.6/32 gw 192.168.2.1
route add 182.61.200.6/32 gw 192.168.2.1

设置成功后,在PC上可以ping通182.61.200.6,抓包可以确认路由到了moon节点上。

再批量测试路由 [7]

iptables -t mangle -N fwmark
iptables -t mangle -A OUTPUT -j fwmark
iptables -t mangle -A PREROUTING -j fwmark
iptables -t mangle -A fwmark -m set --match-set outmoonip dst -j MARK --set-mark 8
ip rule add fwmark 8 table outmoon
ip route del default via 192.168.1.1 table outmoon
ip route add default via 192.168.1.1 table outmoon
iptables -t nat -A POSTROUTING -m set --match-set outmoonip dst -o ethx -j SNAT --to 192.168.1.2

按域名转发到ss

见[1]

按域名转发到v2ray

见[3]

策略路由

[5]

设置指定设备的网关

[8]

1.新建并编辑文件dnsmasq.conf.add,保存于/jffs/configs/目录下。

vi /jffs/configs/dnsmasq.conf.add

2.dnsmasq.conf.add添加以下内容(设置标签为openwrt的网关与DNS服务器地址,另外,指定MAC地址的设备分配到openwrt标签的网关与DNS)

dhcp-option=tag:openwrt,option:router,192.168.50.2
dhcp-option=tag:openwrt,option:dns-server,192.168.50.2
dhcp-mac=set:openwrt,11:22:78:14:D3:0A   #要指定的设备1的MAC地址
dhcp-mac=set:openwrt,00:11:22:63:3C:7E   #要指定的设备2的MAC地址

3.保存重启dnsmasq

service restart_dnsmasq

备注

路由基本操作

增加路由

route add -net 192.168.99.99 netmask 255.255.255.255 gw 192.168.10.20

删除路由

route del -net 192.168.99.99 netmask 255.255.255.255 gw 192.168.10.20

参考

  1. OpenWrt VPN 按域名路由
  2. Linux | ipset命令介绍与基本使用
  3. openwrt通过v2ray+dnsmasq-full+ipset+gfwList实现自动翻墙
  4. 【网络】route和 IP route的区别|route 和 IP route 添加路由
  5. 策略路由
  6. Chapter 14. iptables firewall
  7. ip rule,ip route,iptables 三者之间的关系
  8. ASUS-Merlin 按设备分配网关
  9. openwrt通过v2ray+dnsmasq-full+ipset+gfwList实现自动翻墙
  10. 关于 TPROXY 透明代理使 V2Ray 占满 CPU 问题的研究