Linux非root用户使用特权端口

2015-01-27T12:13:00

更新:新版本的shadowsocks原生支持切换运行用户,解决我这个需求只要添加-a参数即可:


    /usr/local/bin/ss-server -a shadowsocks -s 0.0.0.0 -t 1800 -d 8.8.8.8 -u -p 80 -k yourpassword -m rc4-md5 -f /var/run/ss.pid

以下为原文:

Linux下默认普通用户是不能占用1024以下的特权端口的,之前提到我vps上的设置的最后一点有说到让shadowsocks以非root权限执行,又要使用1024以下的特权端口,之前的解决方案是用setcap,给/usr/local/bin/ss-server授权,但是在一些情况下很可能会造成在非root用户下可以占用低位端口,但是通信会出现问题,setcap的资料又比较少,为了稳定起见暂时弃用。

接下来也尝试用了iptables进行端口映射,将80端口收到的数据重定向到8888端口,然后ss-server监听8888端口

    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8888

这样虽然成功了,但是不知道什么原因,必须要开放8888端口才正常使用,应该是ss有一次什么握手之类的,纯瞎猜……总之也是失败了。

后来转了一圈发现一个好东西authbind,可惜这玩意是Debian系下的,centos原生不支持,好在有一个authbind-centos-rpm。

虽然这个项目已经年久失修,按页面上的教程rpmbuild -v -bb --clean SPECS/authbind.spec都会直接报错了,所以干脆就不要装rpm-build了。

    git clone https://github.com/tootedom/authbind-centos-rpm.git
    cd authbind-centos-rpm/authbind/SOURCES
    tar xvf  authbind_2.1.1.tar.gz
    cd authbind-2.1.1/
    make && make install

接着开始配置,配置文件在/etc/authbind/,里面有三个目录:byport、byaddr、byuid。我们要用shadowsocks用户运行一个程序能够绑定80端口,在byport目录下建立80文件:/etc/authbind/byport/80,设置shadowsocks账户有80文件的使用权限,如果80文件可以被shadowsocks访问,则绑定就是成功的,否则绑定就是失败的。

    touch /etc/authbind/byport/80
    chmod 755 /etc/authbind/byport/80
    chown shadowsocks:shadowsocks /etc/authbind/byport/80

把ss文件内容改一改

    nohup su - shadowsocks -c "/usr/local/bin/authbind --deep /usr/local/bin/ss-server -s 0.0.0.0 -p 80 -k yourpassword -m rc4-md5 &" > /var/log/ss

看看日志,这下绑定80端口成功了。

最后再优化一下相应的iptables设置,禁止SS访问本地内网。

    iptables -N SHADOWSOCKS
    iptables -t filter  -A SHADOWSOCKS -d 127.0.0.0/8 -j REJECT
    iptables -t filter  -A SHADOWSOCKS -d 169.254.0.0/16 -j REJECT
    iptables -t filter  -A SHADOWSOCKS -d 172.16.0.0/12 -j REJECT
    iptables -t filter  -A SHADOWSOCKS -d 192.168.0.0/16 -j REJECT
    iptables -t filter  -A SHADOWSOCKS -d 10.168.0.0/24 -j REJECT
    iptables -t filter  -A SHADOWSOCKS -d 0.0.0.0/0 -j ACCEPT
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »