在我的設定中,首先我需要連接到 VPN,然後需要 ssh 到伺服器。
目前我喜歡這樣:
openvpn myconfig.ovpn
ssh myuser@myserver
這使得我的所有網路流量都通過該 VPN。
然而,我確實不是希望我所有的資料流量都通過這個 VPN。使用 GNU/Linux,我可以使用哪些工具來只在一個特定的 ssh 連線中使用 VPN?
也就是說,我可以在 bash 腳本中使用哪些工具來執行以下操作:
ssh-over-vpn.sh myuser.ovpn [email protected]
並僅將 vpn 配置用於 ssh 連接[電子郵件受保護]?
我目前的 myuser.ovpn 設定檔有:
client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 200.200.200.18 443
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-GCM
setenv opt block-outside-dns
key-direction 1
verb 3
<ca> ... </ca> <cert> ...<key> ...<tls-auth> ...
答案1
但是,我不希望所有資料流量都通過此 VPN。使用 GNU/Linux,我應該使用哪些工具來只在一個特定的 ssh 連線中使用 VPN?
將您的 OpenVPN 用戶端設定變更為不是從伺服器拉取「預設」路由;相反,僅指定所需的路線:
route-nopull
route 10.0.0.66 255.255.255.255 vpn_gateway
也就是說,我可以在 bash 腳本中使用哪些工具來執行以下操作:
沒有太多可供選擇的。類似的工具對於 SOCKS 代理程式(例如 torify)來說相對容易,因為傳輸層隧道直接映射到包裝程式創建的套接字 - 它變得一點點對於IP 層隧道(VPN) 來說更加困難,因為除了重新實作實際的OpenVPN 協定之外,包裝工具還需要重新實作作業系統的大部分網路堆疊(產生IP 封包、將接收到的封包對應到模擬套接字...) 。
你可以使用的最接近的東西是網路命名空間(容器的建構塊之一)為程式提供了一組完全隔離的介面和路由表。使用unshare
or建立網路命名空間並在其中執行程式很容易ip netns
,但預設情況下它們是斷開連接的(openvpn 用戶端無法存取伺服器),因此您還需要使用 veth 將其連結到「主」命名空間,ETC 。
所有這些命名空間設定最終都會重新實作 Docker/nspawn/etc 的部分內容,因此可以只啟動一個執行 OpenVPN 用戶端和 SSH 用戶端的 Docker 容器。
答案2
因此 VPN 本質上不知道第三層以上的任何內容開放系統互連模型,這意味著他們無法看到正在使用哪些連接埠或協定。也許可以使用一些防火牆魔法來達到預期的效果,但我建議您直接使用 SSH。
我假設所有涉及的系統和網路都由您擁有和管理。如果配置正確,SSH 是一種非常安全的協議,並且應該與 openvpn 一樣安全地在互聯網上使用。有一些很棒的指南在那裡“強化”openssh。其他一些安全建議:
- 將伺服器連接埠更改為一些模糊的連接埠。這實際上並沒有使其本身更加“安全”,但它確實減少了因登入嘗試失敗而充斥日誌的網頁抓取機器人的數量。幾年前我就這麼做了,從那時起我再也沒有見過任何嘗試。
- 查看fail2ban。這是一款方便的軟體,可透過在 iptables 中新增防火牆規則來監視登入嘗試並在多次失敗後「禁止」IP 位址存取您的伺服器。這是夢幻般的。
完成此操作後,您可以使用 openssh 中的 ProxyJump 設定選項將該連線用作 LAN 上其他連接的隧道。
希望這可以幫助!