web-dev-qa-db-ja.com

pppdによって最近作成されたデバイスを検出するにはどうすればよいですか?

PPPDを使用してSSH経由でVPNをセットアップしようとしています(以下 Arch Wiki )。与えられたコマンドは次のとおりです。

/usr/sbin/pppd updetach noauth silent nodeflate pty \
  "/usr/bin/ssh root@remote-gw /usr/sbin/pppd nodetach notty noauth"  \
  ipparam vpn 10.0.8.1:10.0.8.2

上記のコマンドを適切に変更することで、正常にセットアップできました。サーバー側の内部ネットワークに接続するには、サーバー側でiptablesを使用して転送を設定する必要がありました(盲目的に続く このSF投稿 ):

iptables -A FORWARD -i ppp0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

これを自動化したいのですが。現在、eth0は修正されていますが、ppp0が変更される可能性があります(たとえば、他の誰かが同様のセットアップを開始しました)。サーバー側でpppdコマンドによって作成されたインターフェイスを検出するにはどうすればよいですか? 解析dmesgip -o aの出力を比較しますか? pppdに報告してもらえますか?

  • クライアントは最新のArchLinuxです
  • サーバーは最新のUbuntu14.04です

dmesgは役に立たないようです:

$ dmesg | grep -i ppp
[    0.803033] PPP generic driver version 2.4.2
[135747.442807] PPP BSD Compression module registered
[135747.459013] PPP Deflate Compression module registered

作成されているデバイスについての言及はありません。 syslogの方が便利なようです:

Apr 26 13:52:15 server pppd[12725]: pppd 2.4.5 started by muru, uid 0
Apr 26 13:52:15 server pppd[12725]: Using interface ppp0
Apr 26 13:52:15 server pppd[12725]: Connect: ppp0 <--> /dev/pts/7
Apr 26 13:52:15 server pppd[12725]: BSD-Compress (15) compression enabled

Using interface ppp0行は私が欲しいもののようです。私はそれをこうして得ることができると思います:

awk '/started by muru/{getline; pppdev=$NF} END {print pppdev}'

これをpppdの出力に頼ることはできますか?

1
muru

おそらく/etc/ppp/ip-up.dはあなたが探している場所です。

私の例はGentooLinuxで有効ですが、同じディレクトリ構造がArchにも存在するようです。

VPN接続が確立されるたびに/etc/ppp/ip-upが実行され、通常は/etc/ppp/ip-up.d/*が順番に実行されます。その最初の引数は、接続されたpppnデバイスです。

たとえば、このスクリプトを/etc/ppp/ip-up.d/90-localの下に置きます。

#!/bin/sh

# Optional trace:
# logger -t "ppp" "$6: $1 (${2:--}, $3) $4 --> $5"

iptables -A FORWARD -i $1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o $1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

スクリプトを実行する前に、環境変数pppdセットを使用することをお勧めします。あなたが探しているのは$DEVICEです。上記のスクリプトで、$1$DEVICEに置き換えるだけです。

iptables -A FORWARD -i $DEVICE -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o $DEVICE -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

接続を確立するときにpppdが行うことの詳細については、man pppdを参照してください。

2
user86969