Iptables
OpenVPN 沒有連接到它背後的服務(iptables?)
連接到 openvpn 後,我什至無法 ping vpn 地址(172.16.0.1),這是我的 vpn 配置:
##protocol port port 1194 proto tcp dev tun ##ip server client server 172.16.0.0 255.255.0.0 ##key ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh2048.pem ##option persist-key persist-tun keepalive 5 60 reneg-sec 432000 ##option authen. comp-lzo user nobody #group nogroup client-to-client username-as-common-name client-cert-not-required auth-user-pass-verify /etc/openvpn/scripts/login.sh via-env ##push to client max-clients 50 push "persist-key" push "persist-tun" push "redirect-gateway local def1" push "explicit-exit-notify 1" #push "route 172.16.1.0 255.255.255.0 172.16.1.1" #push "route-gateway 172.16.1.1" #push "route add 10.123.0.0 255.255.0.0 172.16.1.1" ##DNS-Server push "dhcp-option DNS 10.96.0.10" ##script connect-disconnect script-security 2 ##client-connect /etc/openvpn/scripts/connect.sh client-disconnect /etc/openvpn/scripts/disconnect.sh ##log-status ##status /etc/openvpn/log/tcp_443.log ##log-append /etc/openvpn/log/openvpn.log verb 3
連接後,我看到創建了一些奇怪的路線:
default via 172.16.0.5 dev tun0 proto static metric 50 default via 192.168.10.1 dev enp5s0 proto dhcp metric 100 172.16.0.0/16 via 172.16.0.5 dev tun0 proto static metric 50 172.16.0.5 dev tun0 proto kernel scope link src 172.16.0.6 metric 50 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 192.168.10.0/24 dev enp5s0 proto kernel scope link src 192.168.10.181 metric 100 192.168.10.1 dev enp5s0 proto static scope link metric 100 194.177.28.83 via 192.168.10.1 dev enp5s0 proto static metric 100
為什麼要添加 172.16.0.5 而不是 172.16.0.1?這樣的地址甚至不存在。
編輯:
就像評論中提到的那樣,是的,它是對等 ip,在我刪除“#push”redirect-gateway local def1”之後,它開始 ping VPN ip,但我仍然無法連接到我在 vpn 後面的服務。我的防火牆規則是:
iptables -A FORWARD -i tun0 -o eth0 -s 172.16.0.0/24 -d 10.0.0.0/8 -m conntrack --ctstate NEW -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/24 -j MASQUERADE
我找出解決方案。我想:
sysctl -w net.ipv4.ip_forward=1
取自節點設置,但我發現 pod 有自己的命名空間,因此需要此設置。但..
設置它有問題,因為它們只能在容器中讀取。所以我嘗試使用 kubernetes 的這個 beta功能來設置它,但它對我不起作用,所以我使用了特權容器設置並從啟動腳本設置了sysctls 。
多虧了它,我可以直接從客戶端連接到我的 k8s 服務 ClusterIP