パケットがVPNに出入りできるように、LinuxシステムでIPtablesを設定したいと思います。
これは3つのノードを持つ小規模ネットワークです。
- v1:VPN内部のLinuxマシン。 VPN サブネットは 10.10.100.0/22 です。
- out1: VPN 外部の Linux システムです。 VPN および VPN IP 内に存在するノードの数に関する情報が含まれますが、VPN 自体にはありません。
- r:ルーティング要件に従って設定されたiptablesを持つLinuxシステム。これはVPNにあり、out1もVPNにパケットを送信できます。だからそれは端にあります。したがって、rのeth0はout1と同じネットワークにあり、tun0はVPNインターフェイスです。
私はrを10.10.100.0/22に向けたout1を除くすべてのパケットの「次のホップ」にしました。だからパケットはrに入っています。 rの次の2つのiptablesルールを使用すると、out1はnetcatを介してv1と通信できます。
iptables -t nat -A POSTROUTING --out-interface tun0 -j MASQUERADE
iptables -A FORWARD --in-interface eth0 -j ACCEPT
MASQUERADE機能が必要なのはなぜですか?
v1 が out1 の ACK パケットを試みると、r に到着して破棄されます。 tcpdumpを使用して、v1がout1に向かうパケットを送信し、rに到達したが決してout1に到達しないことを確認しました。
ループをどのように閉じますか? out1はすでに宛先IPを知っているため、NATを実行する必要はありません。 r このパケットを eth0 から tun0 に移動し、次に tun0 から eth0 に移動したい。
答え1
私はこれをしました
#Forward connections coming in from eth0 to tun0
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
#Masquerade packets leaving tun0
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
#Forward Stateful connections coming in from tun0 to eth0
iptables -A FORWARD -i tun0 -o eth0 -m state --state ESTABLISHED,RELATED \
-j ACCEPT
答え2
次の例では、VPN デバイス名はtun0
(OpenVPN)、VPN ゲートウェイは 172.21.23.172 です。
LinuxルーターへのVPNのインストール(私はipvanish w. openvpnを使用しています)
iptablesを使用したトラフィックのルーティング
sudo iptables -t nat -A POSTROUTING -o [VPN dev] -j MASQUERADE
例:
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
ルーティングテーブルの設定(すべてのトラフィックがVPN経由でルーティングされるように)
sudo ip route add default via [VPN ipv4 address] dev [VPN dev]
例:
sudo ip route add default via 172.21.23.172 dev tun0
次のコマンドを実行して、ネットワーク上のデバイスが実際にVPN経由でルーティングされていることを確認します。
Windows:
tracert 1.1.1.1
Linux:traceroute 1.1.1.1
もう終わりました!