创建 VPN 以绕过被阻止的端口

创建 VPN 以绕过被阻止的端口

我正在一所大学的图书馆里使用笔记本电脑工作,其中“免费”访客 WiFi 阻止了除 22、80、443 和其他一些端口之外的所有端口。

这使我无法使用某些服务,例如 SMTP-TLS。但是,我仍然可以使用 SSH 连接到可以不受限制地访问互联网的家用机器。

设置 VPN 以通过我的家用机器转发被阻止端口的流量的最简单方法是什么?

VPN PPP-SSH 迷你指南这非常好,但是没有将所有部件组装起来。

答案1

这是我根据以下情况提出的解决方案Unix SE 的“根据目标端口在不同接口上输出流量”Netfilter 指南, 和iptables 规则提交与特定负面规则匹配的数据包

首先添加一个新的路由表到/etc/iproute2/rt_tables

$ grep vpntab /etc/iproute2/rt_tables
200 vpntab

此脚本需要安装在转发数据包的服务器上:

$ cat =setup-vps-forwarding
#!/bin/zsh

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Allow established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Masquerade
iptables -t nat -A POSTROUTING -j MASQUERADE
# this doesn't work
#iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

这是设置 VPN 的主要脚本。SSH_VPSHOST 之所以是一个单独的变量,是因为如果您的 VPS 主机不允许您以 root 身份使用 ssh,如下例所示sudo,或者您想通过多个主机建立 ssh 隧道。在后一种情况下,VPSHOST 应该是链中第一个主机的数字 IP 地址。

$ cat simple-ppp-vpn
#!/bin/zsh
# EDIT ME
USER=myusername
VPSHOST=myhostname.net
PORT=22
SSH_VPSHOST="sudo -u $USER ssh -vTax $USER@$VPSHOST sudo"

# remember to put setup-vps-forwarding on $VPSHOST

# the IPs to use; just need that someone else isn't using them
REMPPP=192.168.3.2
LOCPPP=192.168.3.1
# try to infer the current default network interface
DEFIF=$(route -n | grep UG | head -n 1 | awk '{print $8}')

[[ "$UID" -eq 0 ]] || { >&2 echo "Need to be root"; exit 1 }

disable_rpfilt () {
    # disable rp_filter
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 0 > $f;
    done
    echo 1 > /proc/sys/net/ipv4/route/flush
}

case $1 in
    restart)
        $0 stop; $0 start;;
    stop)
        killall pppd
        iptables -F OUTPUT
        iptables -F POSTROUTING
        iptables -t nat -F
        iptables -t mangle -F
        ip route flush table vpntab
        >&2 echo waiting for PPPD to die
        while pgrep pppd > /dev/null; do
            sleep 0.5;
        done
        ;;
    start)
        if pgrep pppd; then >&2 echo Another pppd is running; exit 1; fi
        set -x
        set -e

        disable_rpfilt

        # start pppd's on both ends
        pppd updetach defaultroute noauth passive pty "$SSH_VPSHOST pppd nodetach noauth notty" $LOCPPP:$REMPPP

        # enable NAT on $VPSHOST
        ssh $USER@$REMPPP sudo setup-vps-forwarding

        # set up route-based forwarding

        # add a new routing table 'vpntab', it must first exist in /etc/iproute2/rt_tables
        grep vpntab /etc/iproute2/rt_tables
        # e.g. 200 vpntab

        # the new routing table sends stuff through the PPP device
        ip route add default via $REMPPP dev ppp0 table vpntab
        ip rule add fwmark 0x1 table vpntab

        ################################################################
        # allow ourselves to access the VPS host directly. change these two
        # commands if you want different traffic to be forwarded

        iptables -A OUTPUT -t mangle -o $DEFIF -p tcp --dport $PORT -d $VPSHOST -j ACCEPT
        # this would be less specific
        # iptables -A OUTPUT -t mangle -o $DEFIF -p tcp --dport $PORT -j ACCEPT

        # mark everything else for VPN routing
        iptables -A OUTPUT -t mangle -o $DEFIF -j MARK --set-mark 1

        # replace the above two commands with this, to route only
        # one protocol through the VPN:
        # iptables -A OUTPUT -t mangle -o $DEFIF -p tcp --dport 587 -j MARK --set-mark 1
        ################################################################

        # we need to rewrite the source address of routed packets.
        # this is a bit cleaner than duplicating the test as in
        # the Unix SE question
        iptables -A POSTROUTING -t nat -o ppp0 -m mark --mark 1 -j SNAT --to $LOCPPP

        ip route flush cache
        ;;
esac

我尝试让这个尽可能简单,但有些事情我还是不明白。链接的问题描述了一些小技巧,例如必须禁用 rp_filter,并使用 SNAT 重写源地址,这两者都是必要的。

我想象这个更好的版本会使用 socks 或 openvpn 或ssh -D,而不是 PPP。

相关内容