Ubuntu 搭建gfw路由器

用了七八年的华硕AC68U突然间没了信号,没辙只能再买一个,618看红米的AX3000只要一百多,就下手买了一台。到手以后才发现是256MB内存版本的,也不好装openwrt,就此作罢。在家有个无障碍的网络环境很重要,于是就想到用一台装了Ubuntu的笔记本来做NAT服务器,实现以前在路由器上同样的功能。

首先安装openconnect以及dnsmasq,ipset

sudo apt install dnsmasq ipset openconnect

编辑/etc/sysctl.conf ,将net.ipv4.ip_forward=1,编辑完成后执行sysctl -p 以便生效

在/root/bin/下面创建ocserv.sh文件,

_server 为ocserv服务器地址,

_cert为服务器ssl证书的hash,如果不知道执行一次openconnec连接就可以看到。

_ocserv_passwd 为密码

#!/bin/sh
export GOGC=20
_server='xxx.xxx.xx.xxx:1234'
_cert="pin-sha256:KAEiO0Yfdsjojojijlkjiohjjwohoa;jhl="
_ocserv_passwd="fs2all"
log()
{

_date=`date`

echo ${_date} ' - ' $*
}



Check_internet()
{
_wc=`ifconfig |grep ppp0|wc -l`

if [ $_wc -eq 0 ]
then
log "No internet Connect, exiting"
exit
fi
}

Check_VPN_PROC()
{
_wc=`ps -ef|grep openconnect|grep -v grep|wc -l`                                                                                                                                               
if [ $_wc -eq 0 ]                    
then       
date                                                                                                      
echo $_ocserv_passwd |openconnect -b --authgroup=yourgroup--servercert $_cert  -u username $_server
log "Start openconnect connection."
sleep 5
fi
}




Check_VPN_Conn()
{
_wc=`ifconfig |grep tun0|wc -l`
                 
if [ $_wc -eq 0 ]      
then
log "No VPN Connection, exiting."                   
exit
fi
}

Check_timeout()
{
ping -c 5 192.168.8.1 > 1.tmp
P1=$(cat 1.tmp| grep 'loss' | awk -F ',' '{ print $3 }' | awk -F "%" '{ print $1 }')
if [ $P1 -gt 80 ]
then
cat 1.tmp
log "VPN Connection timeout, kill Openconnect. "
pid=`ps |grep openconnect |grep authgroup|awk '{print $1}'`
if [ $pid"x" != "x" ]
        then
        kill $pid
fi



fi
}

Check_Dnsmasq()
{
_wc=`ps |grep dnsmasq|wc -l`

if [ $_wc -eq 1 ]
then
log "Restart Dnsmasq."
dnsmasq --log-async
fi
}

Check_dns_route()
{
_wc=`ip route |grep 1.1.1.1|wc -l`       
               
if [ $_wc -eq 0 ]
then     
log "Add DNS IP Route."                            
ip route add 1.1.1.1 dev tun0
fi 
}

Check_ipset()
{
modprobe xt_set

_wc=`ipset list |grep gfwlist |wc -l`

if [ $_wc -eq 0 ] 
then
log "Create ipset"
ipset -N gfwlist iphash
ipset -N gfwlist_V6 iphash family inet6
fi
}


Check_iptables()
{
_wc=`iptables -t mangle -L |grep 'Chain fwmark (2 references)'|wc -l`
 
if [ $_wc -eq 0 ]
then
log "create iptables mangle table rules"
iptables -t mangle -N fwmark
iptables -t mangle -F
iptables -t mangle -A PREROUTING -j fwmark
iptables -t mangle -A OUTPUT -j fwmark
iptables -t mangle -A fwmark -m set --match-set gfwlist dst -j MARK --set-mark 1

#ip6tables -t mangle -N fwmark
#ip6tables -t mangle -F   
#ip6tables -t mangle -A fwmark -m set --match-set gfwlist_V6 dst -j MARK --set-mark 1

fi
}

Check_ip_rule()
{

_wc=`ip rule |grep 'fwmark 0x1'|wc -l`
                       
if [ $_wc -eq 0 ]      
then       
log "Create ip rule forward rule"            
ip rule add prio 100 fwmark 1 table 100
#ip -6 rule add prio 100 fwmark 1 table 100
fi 



_wc=`ip route show table 100 |wc -l`

if [ $_wc -eq 0 ]
then
log "Create ip route rule"
#ip route add table 100 default dev tun0
ip route add default via 192.168.8.1 table 100
#ip route add table 100 via 192.168.8.1 dev tun0
#ip -6 route add default via 2001:470:66:2e8::1 table 100
fi
}

Check_MASQUERADE()
{
_wc=`iptables -t nat -nvL |grep MASQUERADE |grep 192.168.1.0 |wc -l`

if [ $_wc -eq 0 ]
then
log "Create nat rule"
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
fi
}





################Start execution#############

# Add_Crontab

# Check_vlm_PROC
#Check_internet
Check_timeout
#Check_KCPTUN
Check_VPN_PROC
Check_VPN_Conn
Check_timeout
Check_Dnsmasq
Check_dns_route
Check_ipset
Check_iptables
Check_ip_rule
Check_MASQUERADE

执行完脚本,然后设备的网关和dns指向服务器地址即可。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据